我正在使用Hadoop来计算单词之间的共现相似性。我有一个由共存的单词对组成的文件,如下所示:
a b
a c
b c
b d
我正在使用一种基于图的方法,该方法将单词视为节点,并且共存的单词在它们之间具有优势。我的算法需要计算所有节点的程度。我已经成功地编写了一个Map-Reduce
作业来计算总度数,该作业输出以下内容:
a 2
b 3
c 2
d 1
目前,输出被写回文件,但我想要的是将结果捕获到例如java.util.HashMap
中。然后,我想在另一个Reduce
作业中使用此HashMap
来计算最终的相似性。
以下是我的问题:
- 是否可以在内存中捕获reduce作业的结果(
List
,Map
)。如果是这样,如何? - 这是最好的方法吗?如果没有,我应该如何处理?
有两种可能性: 或者,您从分布式文件系统读取map/reduce任务中的数据。或者,将其直接添加到分布式缓存中。我刚刚用谷歌搜索了分布式缓存大小,它可以控制:
"local.cache.size 参数控制 分布式缓存。默认情况下,它设置为 10 GB。
链接到云时代博客
因此,如果您将第一个作业的输出添加到第二个作业的分布式缓存中,我认为您应该没问题。数以万计的条目远未达到千兆字节的范围。
将文件添加到分布式缓存的操作如下:
要在映射器中读取:
Path[] uris = DistributedCache.getLocalCacheFiles(context.getConfiguration());
String patternsFile = uris[0].toString();
BufferedReader in = new BufferedReader(new FileReader(patternsFile));
要添加到数据库
:DistributedCache.addCacheFile(new URI(file), job.getConfiguration());
在设置第二份工作时。
让我知道这是否可行。