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



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

a b
a c
b c
b d

我正在使用一种基于的方法,该方法将单词视为节点,并且共存的单词在它们之间具有优势。我的算法需要计算所有节点的程度。我已经成功地编写了一个Map-Reduce作业来计算总度数,该作业输出以下内容:

a 2
b 3
c 2
d 1

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

以下是我的问题:

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

有两种可能性: 或者,您从分布式文件系统读取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());

在设置第二份工作时。

让我知道这是否可行。

相关内容

  • 没有找到相关文章

最新更新