私はHadoopを使用してmapreduceプロジェクトを作成しています。私は現在、3つの順次ジョブを持っています。Hadoopカウンタの使用 - 複数のジョブ
私はHadoopカウンタを使用したいが、問題は最初のジョブで実際のカウントを行いたいが、3番目のジョブのレデューサーでカウンタ値にアクセスしたいということだ。
どうすればこの問題を解決できますか? enum
はどこで定義しますか?私はそれを渡す必要がありますそれを2番目の仕事を投げた?また、何も見つからないので、これを行うためのコード例を見るのに役立ちます。
注:私はHadoopの2.7.2
EDITを使用しています:私はすでにアプローチは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ジョブに減らすタスクから成功したマップタスクの数にアクセスする方法がある(の可能性のある重複http://stackoverflow.com/questions:ちょうどたとえば、セットアップ()をオーバーライドし /8009802 /は - そこにある - 方法 - アクセス - 成功したマップ - タスク - から - 削減タスクの - から - ) – tworec
私はそこからカウンターを使用することは良い考えではないと思う仕事を減らす。 http://stackoverflow.com/questions/8009802/is-there-a-way-to-access-number-of-successful-map-tasks-from-a-reduce-task-in-an/ – tworec
はい、私はこれをすでに見ており、私はこのアプローチを試みました。しかし、その場合、彼は(同じ仕事の)減速機の中のカウンターを手に入れたいと思う。私の場合と同じではありません。 –