我能用不同的HashMap与不同的Mapper共享相同的值,比如静态变量吗?我在hadoop集群中运行作业,并试图在运行在不同数据节点上的所有映射器之间共享变量值。
输入==> 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) {
}
}发布于 2017-06-13 17:26:15
我不认为你真的需要分享任何东西。
你在这里所做的只是各种简单的字数(路径)。
只需输出(currentTerm, 1)并让还原器处理适当的聚合。您还可以添加一个组合器以提高性能。
您不需要担心重复,只需回顾一下WordCount示例即可。
另外,如果您正在读取一个文件并输出extends Mapper<LongWritable, Text, Text, IntWritable>数据,那么您的类型应该是(String, int)。
还有一个MapWritable类,但这似乎有点过火了
https://stackoverflow.com/questions/44522313
复制相似问题