2010-10-12 28 views
20

Trong tài liệu Hadoop API nó choHadoop truy vấn phương pháp liên quan đến setJarByClass của lớp Job

rằng

setJarByClass 

public void setJarByClass(Class<?> cls) 

Set the Jar by finding where a given class came from. 

chính xác không giải thích này có ý nghĩa gì? nó có tạo ra một tệp JAR từ đối số tệp lớp được chỉ định trong phương thức ở trên không? và tệp jar đó được thực thi cho tác vụ MapReduce.

Trả lời

22

Phương thức này đặt tệp jar trong đó mỗi nút sẽ tìm kiếm các lớp Mapper và Reducer.

Nó không tạo ra một cái lọ từ lớp đã cho. Thay vào đó, nó xác định lọ chứa lớp đã cho. Và có, tệp jar đó được "thực hiện" (thực sự là Mapper và Reducer trong tệp jar đó được thực thi) cho công việc MapReduce.

(Xem thêm Stanley Xu's answer to a similar question về sự cần thiết cho phương pháp này kể từ khi bạn cung cấp cho các jar trên dòng lệnh)

+1

Dấu giải thích tuyệt vời. Tôi có một nghi ngờ ở đây, nếu Mapper và Reducer có mặt trong tệp jar khác nhau thì sao? – Nageswaran

0
job.setJarByClass(WordCount.class); 

Giúp xác định Jar chứa MapperReducer bằng cách xác định một lớp trong Jar đó.

8

Xin lưu ý rằng phương thức trên trong lớp Công việc được gọi trong trình điều khiển. Bạn trình điều khiển được gọi là một khách hàng, thường là máy tính để bàn của bạn hoặc một máy cạnh mà không phải là một phần của cụm và các lớp học của bạn (trong các tệp jar) sẽ được ngồi trên máy đó. Để mapreduce của bạn chạy trên cluster, bạn cần gửi Mapper, reducer và các lớp cần thiết khác đến cluster từ máy khách của bạn. Lớp trình điều khiển của bạn sẽ quan tâm đến việc gửi tệp jar chứa các lớp cần thiết cho cụm. Những cái bình để gửi cho bạn cần phải xác định như là trình điều khiển không biết cái nào nên được gửi đi giữa đống tệp jar bạn có trên đường dẫn lớp của trình điều khiển của bạn. Điều này được thực hiện bằng cách sử dụng phương thức setJarByClass hoặc setJar hoặc bất kỳ biến thể nào khác của phương thức tương tự trong lớp Job.

Rõ ràng nếu bạn không chỉ định điều này, có nghĩa là không gọi phương thức này hoặc nhận xét nó ra sẽ dẫn đến ngoại lệ ClassNotFound trên các nút nô lệ.

Hy vọng điều này sẽ làm rõ!

+0

Hi @Rags Jar thường chứa các lớp Mapper, Reducer và Driver cùng nhau phải không? Bạn có nghĩa là để nói khi bình này được gửi đến cụm, các nút nên biết những lớp học để chọn từ bình để bắt đầu? Nhưng chúng tôi không chỉ định tên lớp đã có trong lệnh hadoop – user2626445

+0

hadoop ; classname thậm chí không cần thiết khi mainclass cho jar được định nghĩa là trình điều khiển. Vì vậy, tại sao chúng ta phải chỉ định setJarByClass? nút không thể tìm ra từ jar hoặc lệnh được đưa ra? – user2626445

+0

Tôi có job.setMapperClass và job.setReducerClass đã được định nghĩa trong mã trình điều khiển. – user2626445

Các vấn đề liên quan