Hadoop:如何将Reduce的输出收集到Java HashMap中

时间:2013-10-01 06:03:08

标签: hadoop mapreduce bigdata similarity cascading

我正在使用Hadoop来计算单词之间的共现相似性。我有一个由共同出现的单词对组成的文件,如下所示:

a b
a c
b c
b d

我正在使用一种基于 Graph 的方法,将单词视为节点,同时出现的单词在它们之间有优势。我的算法需要计算所有节点的程度。我已成功编写Map-Reduce作业来计算输出以下内容的总学位:

a 2
b 3
c 2
d 1

目前,输出被写回文件,但我想要的是将结果捕获到例如java.util.HashMap。然后,我希望在另一个HashMap作业中使用此Reduce来计算最终的相似度。

以下是我的问题:

  1. 是否可以在内存中捕获减少作业的结果(ListMap)。如果是这样,怎么样?
  2. 这是最好的方法吗?如果没有,我该如何处理?

1 个答案:

答案 0 :(得分:1)

有两种可能性:或者您从分布式文件系统中读取map / reduce任务中的数据。或者直接将其添加到分布式缓存中。我只是用google搜索分布式缓存大小,它可以被控制:

  

“local.cache.size参数控制的大小   DistributedCache。默认情况下,它设置为10 GB。“

Link to cloudera blog

因此,如果您将第一个作业的输出添加到第二个作业的分布式缓存中,我认为应该没问题。成千上万的条目远不及千兆字节范围。

将文件添加到分布式缓存中如下:

您在映射器中

阅读

Path[] uris = DistributedCache.getLocalCacheFiles(context.getConfiguration());
String patternsFile = uris[0].toString();
BufferedReader in = new BufferedReader(new FileReader(patternsFile));

添加到DBCache:

DistributedCache.addCacheFile(new URI(file), job.getConfiguration());

在设立第二份工作时。

如果这样做,请告诉我。