如何在Hadoop中的映射程序之间共享HashMap?

如何在Hadoop中的映射程序之间共享HashMap?,hadoop,mapreduce,hashmap,Hadoop,Mapreduce,Hashmap,我是否可以使用不同的映射器共享HashMap,并使用相同的值,如staticvariable?我正在hadoop集群中运行这个作业,并试图在不同数据节点上运行的所有映射程序之间共享变量值 输入==>FileID文件路径 InputFormat=>KeyValueTextInputFormat public class Demo { static int termID=0; public static class DemoMapper extends Mapper<Obj

我是否可以使用不同的映射器共享HashMap,并使用相同的值,如staticvariable?我正在hadoop集群中运行这个作业,并试图在不同数据节点上运行的所有映射程序之间共享变量值

输入==>FileID文件路径

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) {

    }

}
公共类演示{
静态int termID=0;
公共静态类DemoMapper扩展映射器{
静态HashMap termMapping=新HashMap();
@凌驾
受保护的空映射(对象键、文本值、上下文)引发IOException、InterruptedException{
BufferedReader reader=新的BufferedReader(新文件读取器(值));
弦线;
字符串当前项;
而((line=reader.readLine())!=null){
标记器=新的StringTokenizer(行“”);
while(tokenizer.hasMoreTokens()){
currentTerm=tokenizer.nextToken();
如果(!termMap.containsKey(currentTerm)){
如果(!termMapping.containsKey(currentTerm)){
put(currentTerm,termID++);
}
termMap.put(当前术语,1);
}否则{
termMap.put(currentTerm,termMap.get(currentTerm)+1);
}
}
}
}
}
公共静态void main(字符串[]args){
}
}

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

这里所做的只是各种简单的单词计数(路径)

只需输出
(currentTerm,1)
,并让reducer处理适当的聚合。您还可以添加组合器以提高性能

您不必担心重复的问题,只要回顾一下WordCount示例即可

另外,如果您正在读取文件并输出
(String,int)
数据,那么我认为您应该将类型改为
extends Mapper


还有一个
MapWritable
类,但这似乎有点过分了

我知道您可以在任务之间的Spark中广播地图。从未使用MapReduceThx尝试过,但我不想使用SparkOkay,然后显示您尝试添加地图的MapReduce代码。您得到了什么错误?没有任何错误,但不能共享值,并且每个映射程序都有自己的HashMap。请显示您的代码。您的输入和预期输出是什么?假设我有4个输入拆分,其中包含10个文件路径,将执行4个映射器。我想为每个单词生成唯一的ID,而不是字数,这就是为什么需要为每个映射器使用一些计数器,其中每个唯一的单词都可以,然后如这里所解释的。您可以使用减速机的
设置
方法初始化计数器。另外,我不确定您的文件路径是什么样的,但是
新文件读取器(值)
需要从网络文件路径而不是本地磁盘读取。