我正在开发一种需要运行两个连续mapreduce作业的算法,其中第二个作业同时输入第一个输入和输出。我找到了四种方法,我想知道这些是最有效的,或者是否有其他方法。
分布式缓存
将所有reducer输出合并为单个文件并将其加载到Distributed Cache
FileSystem fs = FileSystem.get(confi);
Path pt = new Path(output.toString() + "/out.txt");
try{
FileStatus[] status = fs.listStatus(output);
BufferedWriter brOut=new BufferedWriter(new OutputStreamWriter(fs.create(pt,true)));
for (int i=0;i<status.length;i++){
BufferedReader brIn=new BufferedReader(new InputStreamReader(fs.open(status[i].getPath())));
String line;
line=brIn.readLine();
while (line != null){
brOut.write(line + "\n");
line=brIn.readLine();
}
}
brOut.close();
}catch(Exception e){
e.printStackTrace();
}
job.addCacheFile(pt.toUri());
将其作为资源添加到配置类
和以前一样,我合并了输出,将它保存在String而不是:
Configuration conf = new Configuration();
conf.setStrings("input2ndjob", outputFromReducer);
Job job = Job.getInstance(conf,"Second Job");
从hdfs读取
第二个映射直接从hdfs
读取第一个reducers的输出文件传递两个值作为输入
我在this网页上找到了这个伪代码,似乎他们将两个参数作为输入传递给第二个映射器,但我不知道该怎么做。
map(key, value):
// value is the candidate itemsets and a chunk of the full dataset
Count occurrences of itemsets in the chunk.
for itemset in itemsets:
emit(itemset, supp(itemset))
reduce(key, values):
result = 0
for value in values:
result += value
if result >= s:
emit(key, result)