Tôi đang viết một chương trình nhận mã nguồn của trình ánh xạ/bộ giảm tốc, biên dịch động trình ánh xạ/bộ giảm tốc và tạo tệp JAR từ nó. Sau đó, nó phải chạy tệp JAR này trên cụm hadoop.
Đối với phần cuối cùng, tôi tự động đặt tất cả các tham số cần thiết thông qua mã của mình. Tuy nhiên, vấn đề tôi đang gặp phải bây giờ là các lớp ánh xạ và trình giảm tốc cần được biên dịch khi mã được biên dịch. Nhưng tại thời điểm biên dịch, tôi không có các lớp này, những lớp này sau này sẽ được nhận trong thời gian chạy (ví dụ: qua các tin nhắn nhận được từ các nút từ xa). Tôi sẽ đánh giá cao bất kỳ ý tưởng/đề xuất nào về cách giải quyết vấn đề này?
Dưới đây bạn có thể tìm thấy phần cuối cùng trong mã của tôi, vấn đề là các tệp job.setMapperClass(Mapper_Class.class) và job.setReducerClass(Reducer_Class.class) yêu cầu các tệp lớp (Mapper_Class.class và Giảm_Class.class) phải có mặt khi biên dịch thời gian:
boolean riêng tư run_Hadoop_Job(String className){
try{
System.out.println("Bắt đầu chạy mã trên Hadoop...");
Chuỗi[] argsTemp = { "project_test/input", "project_test/output" };
// tạo cấu hình
Cấu hình conf = Cấu hình mới();
conf.set("fs.default.name", "hdfs://localhost:54310");
conf.set("mapred.job.tracker", "localhost:54311");
conf.set("mapred.jar", jar_Output_Folder+ java.io.File.separator
+ className+".jar");
conf.set("mapreduce.map.class", "Mapper_Reducer_Classes$Mapper_Class.class");
conf.set("mapreduce.reduce.class", "Mapper_Reducer_Classes$Reducer_Class.class");
// tạo một công việc mới dựa trên cấu hình
Job job = new Job(conf, "Ví dụ về Hadoop để biên dịch động và chạy một công việc theo chương trình");
job.setJarByClass(Platform.class);
//job.setMapperClass(Mapper_Class.class);
//job.setReducerClass(Reducer_Class.class);
// khóa/giá trị của đầu ra bộ giảm tốc của bạn
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(argsTemp[0]));
// điều này sẽ xóa các đường dẫn đầu ra có thể có để ngăn ngừa lỗi công việc
Hệ thống tệp fs = FileSystem.get(conf);
Đường dẫn ra = Đường dẫn mới(argsTemp[1]);
fs.delete(out, true);
// cuối cùng thiết lập đường dẫn trống
FileOutputFormat.setOutputPath(job, new Path(argsTemp[1]));
//job.submit();
System.exit(job.waitForCompletion(true) ? 0 : 1);
System.out.println("Công việc đã hoàn thành!");
} bắt (Ngoại lệ e) { return false }
trả về đúng sự thật;
}
Chỉnh sửa: Vì vậy, tôi đã sửa đổi mã để chỉ định trình ánh xạ và trình giảm tốc bằng cách sử dụng conf.set("mapreduce.map.class, "my mapper.class"). Bây giờ mã sẽ biên dịch chính xác nhưng khi thực thi nó sẽ đưa ra lỗi sau:
ngày 24 tháng 12 năm 2012 6:49:43 sáng org.apache.hadoop.mapred.JobClient Thông tin về màn hìnhAndPrintJob: ID nhiệm vụ: try_201212240511_0006_m_000001_2, trạng thái: java.lang.RuntimeException không thành công: java.lang.ClassNotFoundException: Mapper_Reducer_Classes$Mapper_Class.class tại org.apache.hadoop.conf.Configuration.getClass(Configuration.java:809) tại org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:157) tại org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:569) tại org.apache.hadoop.mapred.MapTask.run (MapTask.java:305) tại org.apache.hadoop.mapred.Child.main(Child.java:170)
Nếu nó không có sẵn trong quá trình biên dịch, thì hãy đặt tên trực tiếp trong cấu hình như sau:
conf.set("mapreduce.map.class", "org.what.ever.ClassName");
conf.set("mapreduce.reduce.class", "org.what.ever.ClassName");
Tôi là một lập trình viên xuất sắc, rất giỏi!