java—hadoop中单个Map器上的多个输入

t1rydlwq  于 2021-06-02  发布在  Hadoop
关注(0)|答案(0)|浏览(225)

我正在开发一个算法,需要运行两个连续的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)

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题