如何在Hadoop中的Mappers之间共享HashMap?

时间:2017-06-13 13:01:50

标签: hadoop mapreduce hashmap

我可以与不同的 Mapper 分享 HashMap ,使用相同的值,例如 static 变量吗?我在hadoop集群中运行工作,我正在尝试在不同数据节点上运行的所有映射器之间共享变量值。

INPUT ==> FileID FilePath

InputFormat => KeyValueTextInputFormat

public class Demo {

    static int termID=0;

    public static class DemoMapper extends Mapper<Object, Text, IntWritable, Text> {


        static HashMap<String, Integer> termMapping = new HashMap<String, Integer>();


        @Override
        protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {

                BufferedReader reader = new BufferedReader(new FileReader(value));

                String line;
                String currentTerm;

                while ((line = reader.readLine()) != null) {
                    tokenizer = new StringTokenizer(line, " ");
                    while (tokenizer.hasMoreTokens()) {
                        currentTerm = tokenizer.nextToken();
                        if (!termMap.containsKey(currentTerm)) {
                            if (!termMapping.containsKey(currentTerm)) {
                                termMapping.put(currentTerm, termID++);
                            }
                            termMap.put(currentTerm, 1);
                        } else {
                            termMap.put(currentTerm, termMap.get(currentTerm) + 1);
                        }
                    }
                }
        }
    }


    public static void main(String[] args) {

    }

}

1 个答案:

答案 0 :(得分:0)

我认为你真的不需要分享任何东西。

你在这里所做的只是各种简单的字数(路径)。

输出(currentTerm, 1)并让reducer处理适当的聚合。您还可以使用Combiner来提高性能。

您无需担心重复 - 只需回顾一下WordCount示例。

此外,如果您正在阅读文件并输出extends Mapper<LongWritable, Text, Text, IntWritable>数据,我认为您的类型应该是(String, int)

还有一个MapWritable类,但这似乎有点矫枉过正