java - hadoop 惰性分布式缓存

标签 java hadoop mapreduce lazy-evaluation distributed-caching

给定一个 hadoop 集群,我有一项工作,其中有大量文件需要由所有工作人员在执行归约阶段时访问。

看来使用DistributedCache 的功能是个好主意。但是,它似乎不满足以下所需的行为:

  • 延迟文件获取:文件被延迟地复制到工作线程(仅当 尝试读取它们是否缓存在本地)。

  • getLocalCacheFiles 很奇怪:另一个明显相关的问题是 分布式缓存接口(interface)。要访问本地文件,似乎需要一 需要调用DistributedCache.getLocalCacheFiles(conf)。有没有 仅按名称请求某个文件的方法(例如: DistributedCache.getLocalFile(conf, fileName))

DistributedCache 可以做到这一点吗?还有其他库可以满足我的要求吗?

谢谢!

最佳答案

分布式缓存不支持延迟加载,它们会在作业的第一个 Map/Reduce 任务在该节点上执行之前复制到每个任务节点(请注意,文件仅复制到 Map/Reduce 所在的节点)将发生 reduce task )。如果您想要延迟加载,只需直接在 HDFS 中打开文件,尽管如果您有 1000 个并发任务尝试从同一文件中读取数据,这对于您的名称节点/数据节点来说扩展性不太好

您可以使用符号链接(symbolic link)为分布式缓存中的文件提供友好名称,它们将出现在每个映射/化简任务的本地工作目录(符号链接(symbolic link))中。

例如,使用通用选项解析器选项 -files,您可以将文件上传到 HDFS,将其添加到 DistributedCache 并分配一个友好名称,如下所示:

hadoop jar myjar.jar MainClass -files ref-map.txt#map1.txt ...

现在您应该能够通过在 map / reducer 中调用以下命令来打开 ref-map.txt 文件:

File map1 = new File("map1.txt");

如果您的文件已经在 HDFS 中,那么只需照常添加,然后调用 createSymlink(Configuration)方法。当您将文件添加到分布式缓存时,您还可以使用片段 URI 来分配友好的 nanes:

DistributedCache.addCacheFile(new URI("/path/to/file.txt#file1", conf);

关于java - hadoop 惰性分布式缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18499781/

相关文章:

hadoop - 如何检查表的数据库?

hadoop - 如何在命令行上运行PigUnit

hadoop - MapReduce:使用 Python[Streaming] 编写序列文件

java - 具有初始化变量的 NPE

java - 调试 "Comparison method violates its general contract!"

java - 从远程 HDFS 读取文件

mapreduce - 写入HBASE中的多个表

hadoop - 多节点群集只能识别1个事件节点

java - 如何告诉主线程部分线程工作已完成

java - 这是一个合适的 Android 游戏循环吗?