hadoop中单个映射器上的多个输入

时间:2014-05-10 11:13:42

标签: java hadoop mapreduce reduce mapper

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

0 个答案:

没有答案