特定の解像度でマップ データを計算する Hadoop アプリケーションを作成しています。私の入力ファイルは、QuadTile原則に従って名前が付けられたマップのタイルです。それらをサブサンプリングし、より広い領域をカバーするが解像度が低い特定の上位レベルのタイルが得られるまで、それらをつなぎ合わせる必要があります。グーグルマップのズームアウトのように。
現在、マッパーはタイルをサブサンプリングし、リデューサーは特定のレベルのタイルを組み合わせて、1 レベル上のタイルを形成します。だから、とても良いです。しかし、必要なタイルに応じて、それらのマップを繰り返して、ステップ ax 回を減らす必要がありますが、これまではできませんでした。
そうするための最良の方法は何ですか?一時ディレクトリにタイルを明示的に保存せずに、必要なものが得られるまでそれらの一時ディレクトリで新しい mapreduce ジョブを開始することは可能ですか? 私が完璧な解決策だと思うのは、「while(context.hasMoreThanOneKey()){iterate mapreduce}」のようなものです。
答えに続いて、Job を拡張するクラス TileJob を作成しました。ただし、mapreduce はまだチェーンされていません。私が間違っていることを教えていただけますか?
public boolean waitForCompletion(boolean verbose) throws IOException, InterruptedException, ClassNotFoundException{
if(desiredkeylength != currentinputkeylength-1){
System.out.println("In loop, setting input at " + tempout);
String tempin = tempout;
FileInputFormat.setInputPaths(this, tempin);
tempout = (output + currentinputkeylength + "/");
FileOutputFormat.setOutputPath(this, new Path(tempout));
System.out.println("Setting output at " + tempout);
currentinputkeylength--;
Configuration conf = new Configuration();
TileJob job = new TileJob(conf);
job.setJobName(getJobName());
job.setUpJob(tempin, tempout, tiletogenerate, currentinputkeylength);
return job.waitForCompletion(verbose);
}else{
//desiredkeylength == currentkeylength-1
System.out.println("In else, setting input at " + tempout);
String tempin = tempout;
FileInputFormat.setInputPaths(this, tempin);
tempout = output;
FileOutputFormat.setOutputPath(this, new Path(tempout));
System.out.println("Setting output at " + tempout);
currentinputkeylength--;
Configuration conf = new Configuration();
TileJob job = new TileJob(conf);
job.setJobName(getJobName());
job.setUpJob(tempin, tempout, tiletogenerate, currentinputkeylength);
currentinputkeylength--;
return super.waitForCompletion(verbose);
}
}