我正在使用Hadoop進行mapreduce項目。我目前有3個連續工作。使用Hadoop計數器 - 多個作業
我想使用Hadoop計數器,但問題是我想在第一個作業中進行實際計數,但訪問第三個作業的減速器中的計數器值。
我該如何做到這一點?我應該在哪裏定義enum
?我需要通過它扔第二份工作嗎?這也將有助於看到一些代碼示例,因爲我還找不到任何東西。
注:我使用Hadoop 2.7.2
編輯:我已經想盡了辦法解釋here,並沒有成功。我的情況是不同的,因爲我想訪問來自不同工作的計數器。 (不是從映射器到還原器)。
我試圖這樣做: 第一份工作:
public static void startFirstJob(String inputPath, String outputPath) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "wordCount");
job.setJarByClass(WordCount.class);
job.setMapperClass(WordCountMapper.class);
job.setCombinerClass(WordCountReducer.class);
job.setReducerClass(WordCountReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
job.setInputFormatClass(SequenceFileInputFormat.class);
job.setOutputFormatClass(SequenceFileOutputFormat.class);
FileInputFormat.addInputPath(job, new Path(inputPath));
FileOutputFormat.setOutputPath(job, new Path(outputPath));
job.waitForCompletion(true);
}
定義在不同的類中的計數器枚舉:
public class CountersClass {
public static enum N_COUNTERS {
SOMECOUNT
}
}
試圖讀取計數器:
Cluster cluster = new Cluster(context.getConfiguration());
Job job = cluster.getJob(JobID.forName("wordCount"));
Counters counters = job.getCounters();
CountersClass.N_COUNTERS mycounter = CountersClass.N_COUNTERS.valueOf("SOMECOUNT");
Counter c1 = counters.findCounter(mycounter);
long N_Count = c1.getValue();
的[?有沒有一種方法來訪問從降低任務的MR工作的成功map任務數(可能的複製http://stackoverflow.com/questions/8009802/is-there-a-way-to-access-number-of-successful-map-tasks-from-a-reduce-task-in-an) – tworec
我認爲從內部使用計數器並不是一個好主意減少工作。請參閱http://stackoverflow.com/questions/8009802/is-there-a-way-to-access-number-of-successful-map-tasks-from-a-reduce-task-in-an/ – tworec
是的,我已經看到了這一點,我嘗試了這種方法。但是在那種情況下,他想讓減速器內部的計數器(同一工作)。這與我的情況不一樣。 –