Tôi đã viết một chương trình Mapreduce trong Java, mà tôi có thể gửi đến một cụm từ xa đang chạy trong chế độ phân tán. Hiện nay, tôi gửi công việc sử dụng các bước sau:Khởi chạy một công việc Mapreduce từ eclipse
- xuất khẩu công việc mapreuce như một jar (ví dụ
myMRjob.jar
) - trình công việc để cụm từ xa bằng cách sử dụng lệnh shell sau:
hadoop jar myMRjob.jar
Tôi muốn gửi công việc trực tiếp từ Eclipse khi tôi cố gắng chạy chương trình. Tôi có thể làm cái này như thế nào?
Tôi hiện đang sử dụng CDH3, và một phiên bản rút gọn của conf của tôi là:
conf.set("hbase.zookeeper.quorum", getZookeeperServers());
conf.set("fs.default.name","hdfs://namenode/");
conf.set("mapred.job.tracker", "jobtracker:jtPort");
Job job = new Job(conf, "COUNT ROWS");
job.setJarByClass(CountRows.class);
// Set up Mapper
TableMapReduceUtil.initTableMapperJob(inputTable, scan,
CountRows.MyMapper.class, ImmutableBytesWritable.class,
ImmutableBytesWritable.class, job);
// Set up Reducer
job.setReducerClass(CountRows.MyReducer.class);
job.setNumReduceTasks(16);
// Setup Overall Output
job.setOutputFormatClass(MultiTableOutputFormat.class);
job.submit();
Khi tôi chạy trực tiếp từ Eclipse, công việc được đưa ra nhưng Hadoop không thể tìm thấy người vẽ bản đồ/hạ. Tôi nhận được các lỗi sau:
12/06/27 23:23:29 INFO mapred.JobClient: map 0% reduce 0%
12/06/27 23:23:37 INFO mapred.JobClient: Task Id : attempt_201206152147_0645_m_000000_0, Status : FAILED
java.lang.RuntimeException: java.lang.ClassNotFoundException: com.mypkg.mapreduce.CountRows$MyMapper
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:996)
at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:212)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:602)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:323)
at org.apache.hadoop.mapred.Child$4.run(Child.java:270)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1127)
at org.apache.hadoop.mapred.Child.main(Child.java:264)
...
Có ai biết cách vượt qua các lỗi này không? Nếu tôi có thể sửa lỗi này, tôi có thể tích hợp nhiều công việc MR vào các tập lệnh của tôi, điều này thật tuyệt vời!
Tucker - Tôi đã có thể chạy các công việc Hadoop trong độc lập, nhưng không phải chế độ khác từ Eclipse. Tôi đã đăng truy vấn trong diễn đàn Hadoop một thời gian và không có phản hồi nào. BTW, Hadoop chạy ở chế độ độc lập mà không có bất kỳ tệp cấu hình nào (các tham số mặc định). –
Khi bạn gửi công việc từ bên trong Eclipse, các lớp bản đồ/giảm tốc trong cùng một dự án, hay là bình chứa chúng trên đường dẫn lớp, và các lớp của chúng không ở đâu khác trên cp? –
@ChrisWhite Lớp chứa tất cả mọi thứ được gọi là CountRows. Lớp này chứa một phương thức 'chính' đặt cấu hình công việc. lớp CountRows cũng chứa lớp cho trình ánh xạ và trình giảm tốc được gọi là MyMapper và MyReducer tương ứng. Công việc hoạt động tốt như tôi đã nói khi tôi khởi chạy công việc từ comandline bằng cách viết 'hadoop jar CountRows.jar' – Tucker