hadoop:FileSystem copyToLocalFile方法无法复制整个文件

hadoop:FileSystem copyToLocalFile方法无法复制整个文件,hadoop,hdfs,Hadoop,Hdfs,我需要集群的每个节点从hdfs检索1GB文件。我使用文件系统的copyToLocalFile方法。但不是整个文件(1GB),而是每个节点检索大约50MB的文件,然后代码继续。结果我的工作失败了。为什么会发生这种情况?有没有办法“等待”整个文件复制到本地fs 编辑:我的映射器类检查文件是否存在于节点的本地fs中,如果不存在,则检索它。这是在setup()函数中完成的 从上次编辑: 编辑:我的映射器类检查文件是否存在于节点的本地fs中,如果不存在,则检索它。这是在setup()函数中完成的 您所描述

我需要集群的每个节点从hdfs检索1GB文件。我使用文件系统的copyToLocalFile方法。但不是整个文件(1GB),而是每个节点检索大约50MB的文件,然后代码继续。结果我的工作失败了。为什么会发生这种情况?有没有办法“等待”整个文件复制到本地fs

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

从上次编辑:

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


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

您是否先复制文件,然后再启动MapReduce作业?或者这项工作有复印吗?请发布一些关于您的工作/代码的信息。谢谢harpun。我添加了一些信息。是否有任何特殊原因使每个映射程序都必须读取1GB文件?Hadoop MapReduce背后的概念是,每个映射器处理输入文件的一部分(所谓的
InputSplit
),并为还原器生成输出。所以通常的方法是将1GB文件存储在HDFS中,然后编写一个作业来处理它。文件的路径将是作业的参数。由于每个节点都有文件的一部分,理想情况下,任何节点都不必通过网络复制任何数据,而只需处理其本地数据。(我只是想确定,你是否知道这件事。)哈彭再次感谢你1.我知道你告诉我的事情。我试图实现的是一个映射端连接,其中每个节点都应该存储整个小表并逐行读取,并使用每个节点从hdfs读取的大表的拆分记录进行连接。您是否可以共享一些代码来说明您在何处执行此操作?您是否考虑过使用分布式缓存,这正是为克里斯设计的,谢谢。我尝试过DistributedCache,但我有相同的Reslut。更具体地说,我在DistributedCache中添加1GB文件,然后在每个映射器的setup()中打开它,并逐行读取它(逐记录)。从每个记录中提取id,然后执行
id mod 8
。mod的结果告诉我应该在哪个文件中复制记录。例如,如果id mod 8=0,则记录应转到file-split0,如果是1到file-split1。文件拆分存储在本地。从它们创建的方式来看,文件拆分大小之和显然应该为1 gb。对于某些节点来说,这是正确的,但有些节点本地存储的拆分文件大小之和较小,约为500 mb或更小。因此,我尝试了copytolocalfile和DistributedCache,但两种方法都遗漏了一些记录。请,请在原始问题中发布一些代码,仍然不清楚您要做什么