Ich habe ein mapreduce-Programm in Java geschrieben, das ich an einen Remote-Cluster im verteilten Modus senden kann. Derzeit ich den Job mit den folgenden Schritten einreichen:Starten eines mapreduce-Jobs aus der Eclipse
- Export des mapreuce Job als Glas (zB
myMRjob.jar
) - den Auftrag an die Remote-Cluster senden Sie den folgenden Shell-Befehl:
hadoop jar myMRjob.jar
Ich möchte den Job direkt von Eclipse einreichen, wenn ich versuche, das Programm auszuführen. Wie kann ich das machen?
Ich bin derzeit CDH3 und eine gekürzte Version meiner conf ist:
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();
Als ich das direkt von Eclipse-laufen, wird der Auftrag gestartet, aber Hadoop können nicht die Mapper/Reduzierungen finden. Ich erhalte folgende Fehler:
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)
...
Weiß jemand, wie man über diese Fehler hinauskommt? Wenn ich das beheben kann, kann ich mehr MR-Jobs in meine Skripte integrieren, was großartig wäre!
Tucker - konnte ich die Hadoop Job in Stand-alone laufen, aber nicht andere Modi aus Finsternis. Ich habe die Abfrage in den Hadoop-Foren einige Zeit zurück gepostet und es gab keine + ve Antwort. Übrigens läuft Hadoop im Standalone-Modus ohne Konfigurationsdateien (Standardparameter). –
Wenn Sie den Job in Eclipse übergeben, befinden sich die Mapper-/Reducer-Klassen im selben Projekt oder ist das Jar, das sie enthält, im Klassenpfad und die Klassen selbst nirgendwo sonst auf dem CP? –
@ChrisWhite Die Klasse, die alles enthält, heißt CountRows. Diese Klasse enthält eine Hauptmethode, die die Jobkonfigurationen festlegt. Die Klasse CountRows enthält auch die Klasse für den Mapper und Reducer namens MyMapper bzw. MyReducer. Der Job funktioniert gut, wie ich sagte, wenn ich den Job von der comandline durch das Schreiben 'hadoop jar CountRows.jar' – Tucker