0

我已经阅读了来自 Apache 和 Yahoo 的 DistributedCache 教程。我仍然对一件事感到困惑。假设我有一个要复制到所有数据节点的文件。所以,我 DistributedCache.addCacheFile(new URI(hdfsPath),job)在工作驱动程序中使用以使文件可用。然后,我DistributedCache.getLocalCacheFiles(job)在我的 Mapper 中调用。

现在,我想根据这个文件的内容在数据节点上创建一个数组,这样每次 map() 运行时,它就可以访问数组的元素。我可以这样做吗?我很困惑,因为如果我读取缓存文件并在 Mapper 类中创建数组,它似乎会为 Mapper 的每个新输入创建数组,而不是每个 Mapper 一次。这部分实际上是如何工作的(即,我应该在哪里/何时创建数组)?

4

1 回答 1

2

这里混杂了几个概念。Datanode 与 DistributedCache 没有直接关系。它是 MapReduce 层的概念。
希望在映射器之间重用缓存文件中的相同派生与 MR 范例的功能性质有些矛盾。映射器在逻辑上应该是独立的。
您想要的是一种优化,如果映射器的缓存文件的预处理相对昂贵,那么这种优化是有意义的。
您可以在某种程度上通过将预处理数据保存在某个静态变量中来做到这一点,懒惰评估它,并将 hadoop 设置为重用虚拟任务之间的机器。这不是“MR”精神解决方案,但应该有效。
更好的解决方案是将缓存文件预处理到表单中,这样映射器的消耗会很便宜。
让我们假设所有想法都是一种优化 - 否则为每个映射读取和处理文件就可以了。
可以说,如果为每个映射器准备文件比映射处理本身便宜得多,或者比映射器运行开销便宜得多 - 我们很好。
我所说的形式是指文件的格式,它可以非常有效地转换为我们需要的内存结构。例如 - 如果我们需要在数据中进行一些搜索 - 我们可以存储已经排序的数据。它可以节省我们每次排序的时间,通常比从磁盘顺序读取要贵得多
如果在您的情况下它是一些适度数量的属性(比如说数千),我可以假设它们的读取和初始化与单映射器

于 2012-04-25T15:38:07.957 回答