我可以与不同的 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) {
}
}
答案 0 :(得分:0)
我认为你真的不需要分享任何东西。
你在这里所做的只是各种简单的字数(路径)。
输出(currentTerm, 1)
并让reducer处理适当的聚合。您还可以使用Combiner来提高性能。
您无需担心重复 - 只需回顾一下WordCount示例。
此外,如果您正在阅读文件并输出extends Mapper<LongWritable, Text, Text, IntWritable>
数据,我认为您的类型应该是(String, int)
还有一个MapWritable
类,但这似乎有点矫枉过正