我正在编写一个 Hadoop 应用程序以特定分辨率计算地图数据。我的输入文件是地图的瓦片,根据QuadTile原则命名。我需要对它们进行二次采样,并将它们拼接在一起,直到我有一个覆盖更大区域但分辨率更低的某个更高级别的图块。就像缩小谷歌地图一样。
目前,我的 Mapper 对瓦片进行子采样,而我的化简器将瓦片组合到某个级别并形成上一层的瓦片。所以太好了。但是根据我需要的图块,我需要重复这些地图并减少步骤 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);
}
}