我正在开发一个算法,需要运行两个连续的mapreduce作业,其中第二个作业同时接收第一个作业的输入和输出。我找到了四种方法,我想知道其中哪一种是最有效的,或者是否有其他方法。
分布式缓存
将所有reducer输出合并到一个文件中,并将其加载到分布式缓存中
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());
将其作为资源添加到配置类
与之前一样,我合并输出并将其保存在字符串中,然后:
Configuration conf = new Configuration();
conf.setStrings("input2ndjob", outputFromReducer);
Job job = Job.getInstance(conf,"Second Job");
从hdfs读取
第二个Map直接从hdfs读取第一个减速器的输出文件
传递两个值作为输入
我在这个网页上发现了一个伪代码,看起来他们把两个参数作为输入传递给第二个Map器,但我不知道怎么做。
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)
暂无答案!
目前还没有任何答案,快来回答吧!