【发布时间】:2013-02-12 09:01:38
【问题描述】:
我需要集群的每个节点从 hdfs 检索一个 1GB 的文件。我使用 FileSystem 的 copyToLocalFile 方法。但不是整个文件(1GB),每个节点检索大约 50MB 的文件,然后代码继续。结果我的工作失败了。为什么会这样?有没有办法“等待”直到整个文件被复制到本地 fs?
编辑:我的映射器类检查文件是否存在于节点的本地 fs 中,如果不存在,则检索它。这是在 setup() 函数中完成的。
【问题讨论】:
-
您是先复制文件,然后再启动 MapReduce 作业吗?或者这项工作是否进行任何复制?请发布有关您的工作/代码的一些信息。
-
谢谢 harpun。我已经添加了一些信息
-
每个映射器必须读取 1 GB 文件有什么特殊原因吗? Hadoop MapReduce 背后的概念是每个映射器处理输入文件的一部分(所谓的
InputSplit)并为减速器生成输出。因此,通常的方法是将 1 GB 文件存储在 HDFS 中并编写一个作业,该作业将对其进行处理。文件的路径将是作业的参数。由于每个节点都有文件的一部分,理想情况下,任何节点都不需要通过网络复制任何数据,而只处理其本地数据。 (我只是确定你是否知道这一点。) -
Harpun 再次感谢你。我知道你告诉我的事情。我试图实现的是一个map-side join,其中每个节点都应该存储整个小表并逐行读取,并与每个节点从hdfs读取的大表的拆分记录进行连接。
-
您能否分享一些代码来说明您在哪里执行此操作 - 并且您是否考虑过使用分布式缓存,这正是它的设计目的