【问题标题】:hadoop: FileSystem copyToLocalFile method fails to copy the whole filehadoop:FileSystem copyToLocalFile 方法无法复制整个文件
【发布时间】: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读取的大表的拆分记录进行连接。
  • 您能否分享一些代码来说明您在哪里执行此操作 - 并且您是否考虑过使用分布式缓存,这正是它的设计目的

标签: hadoop hdfs


【解决方案1】:

从您上次的编辑开始:

编辑:我的映射器类检查文件是否存在于节点的本地 fs 中,如果不存在,则检索它。这是在 setup() 函数中完成的。

您所描述的正是 DistributedCache 的设计用途 - 它将确保在您的任何 map / reduce 任务在该节点上运行之前将文件复制到每个任务跟踪器。

【讨论】:

  • 克里斯谢谢。我已经尝试过 DistributedCache 并且我有相同的结果。更具体地说,我在 DistributedCache 中添加了 1GB 文件,然后在每个 Mapper 的 setup() 中打开它并逐行读取它(逐条记录)。从每条记录中我提取 id 然后我做id mod 8。 mod的结果告诉我应该在哪个文件拆分中复制记录。例如,如果 id mod 8 = 0,如果它是 1 到 file-split1,则记录应该转到 file-split0。文件拆分存储在本地。从他们创建的方式来看,文件拆分大小的总和应该是 1 gb。
  • 对于某些节点来说确实如此,但是有些节点本地存储的拆分文件的大小总和更小,大约 500 mb 或更小。所以我尝试了 copytolocalfile 和 DistributedCache 但我都错过了一些记录。
  • 拜托,请为您的原始问题发布一些代码,目前还不清楚您要做什么
猜你喜欢
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
相关资源
最近更新 更多