나는 매퍼/리듀서의 소스 코드를 받고, 매퍼/리듀서를 동적으로 컴파일하고, JAR 파일을 만드는 프로그램을 작성 중이다. 그런 다음이 JAR 파일을 hadoop 클러스터에서 실행해야한다.다른 자바 프로그램에서 Hadoop 작업 실행하기
마지막 부분에서는 필요한 모든 매개 변수를 내 코드를 통해 동적으로 설정했습니다. 그러나 지금 당면한 문제는 컴파일 할 때 컴파일 된 매퍼 및 감속기 클래스가 필요하다는 것입니다. 그러나 컴파일 할 때, 나는이 클래스들을 가지지 않고 런타임 동안 (예를 들어 원격 노드로부터 수신 된 메시지를 통해) 나중에 수신 될 것이다. 이 문제를 해결하는 방법에 대한 아이디어 나 제안은 감사하겠습니다.
다음은 job.setMapperClass (Mapper_Class.class) 및 class (Mapper_Class.class 및 Reducer_Class.class) 파일을 필요로하는 job.setReducerClass (Reducer_Class.class)에 문제가있는 마지막 부분의 코드입니다. 컴파일시에 존재하는 :
private boolean run_Hadoop_Job(String className){
try{
System.out.println("Starting to run the code on Hadoop...");
String[] argsTemp = { "project_test/input", "project_test/output" };
// create a configuration
Configuration conf = new Configuration();
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");
// create a new job based on the configuration
Job job = new Job(conf, "Hadoop Example for dynamically and programmatically compiling-running a job");
job.setJarByClass(Platform.class);
//job.setMapperClass(Mapper_Class.class);
//job.setReducerClass(Reducer_Class.class);
// key/value of your reducer output
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(argsTemp[0]));
// this deletes possible output paths to prevent job failures
FileSystem fs = FileSystem.get(conf);
Path out = new Path(argsTemp[1]);
fs.delete(out, true);
// finally set the empty out path
FileOutputFormat.setOutputPath(job, new Path(argsTemp[1]));
//job.submit();
System.exit(job.waitForCompletion(true) ? 0 : 1);
System.out.println("Job Finished!");
} catch (Exception e) { return false; }
return true;
}
는 개정 : 그래서 지금 ("mapreduce.map.class"내 mapper.class ")를 conf.set를 사용하여 매퍼 및 감속기를 지정하는 코드를 수정. 코드가 올바르게 컴파일되지만 실행될 때 다음 오류가 발생합니다.
ec 24, 2012 6:49:43 AM org.apache.hadoop.mapred.JobClien t monitorAndPrintJob 정보 : 작업 ID : attempt_201212240511_0006_m_000001_2, 상태 : 실패 java.lang.RuntimeException가 : java.lang.ClassNotFoundException가 : Configuration.java:809 org.apache.hadoop.conf.Configuration.getClass에서 Mapper_Reducer_Classes $ Mapper_Class.class () at org.apache.hadoop.mapreduce.JobContext.getMapperClass (JobContext.java:157) at org.apache.hadoop.mapred.MapTask.runNewMapper (MapTask.java:569) at org.apache.hadoop.mapred .MapTask.run (MapTask.java:305) at org.apache.hadoop.mapred.Child.main (Child.java:170)
'tmpjars'라는 속성에'Hadoop' jar를 추가해야합니다. 그래서 다음과 같이 작동합니다 :'conf.set ("tmpjars", "/usr/local/hadoop/hadoop-core.jar,/usr/local/hadoop/hadoop-example.jar)'.Jar 경로는 분리되어야합니다. 쉼표로.이것은 상당히 해킹 된 것으로,이 병들이 실제로 클라이언트 시스템에 있다는 것을주의해야합니다 (Hadoop이이를 HDFS로 복사하고이를 작업 추적자에게 다운로드하기 위해). –
토마스에게 감사드립니다. 이 부분을 알아 내고 코드가 올바르게 컴파일됩니다. 그러나 실행 중에 오류가 발생합니다. 이를 반영하기 위해 초기 게시물을 수정했습니다. 어떤 생각? – reza
매퍼가'tmpjars'에 들어있는 병을 명시 적으로 추가 했습니까? –