将文件从NFS或本地FS复制到HDFS

时间:2019-07-12 05:35:16

标签: hadoop hdfs nfs distributed-system distcp

我正尝试将大量文件(100k +,总大小2 TB)从NFS复制到HDFS。有效的方法是什么?

将其安装到边缘节点后,我尝试了以下选项

  1. hdfs dfs -put:由于内存错误而失败,并且传输也很慢
  2. distcp:出现错误原因:

      

    org.apache.hadoop.tools.mapred.RetriableFileCopyCommand $ CopyReadException:java.io.FileNotFoundException:

但是文件存在。

我在不使用NFS挂载位置的本地文件上尝试了相同的操作。 我知道distcp的警告之一是,必须分发目标。它也适用于来源吗?还是它的错误,并且对此有解决方法?

distcp命令:

hadoop distcp file:/home/<user>/t1/f1.dat hdfs://<hdfs-ip>:8020/user/<user>/t1

错误:

Error: java.io.IOException: org.apache.hadoop.tools.mapred.RetriableFileCopyCommand$CopyReadException: java.io.FileNotFoundException: File file:/home/<user>/t1/f1.dat does not exist
        at org.apache.hadoop.tools.mapred.CopyMapper.map(CopyMapper.java:224)
        at org.apache.hadoop.tools.mapred.CopyMapper.map(CopyMapper.java:50)
        at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:146)
        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:796)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:342)
        at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:175)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1844)
        at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:169)
Caused by: org.apache.hadoop.tools.mapred.RetriableFileCopyCommand$CopyReadException: java.io.FileNotFoundException: File file:/home/<user>/t1/f1.dat does not exist
        ... 10 more

2 个答案:

答案 0 :(得分:1)

为了使distcp工作,应从群集中的所有工作节点访问本地文件,方法是通过每个节点上的挂载点访问共享的NFS位置,或通过物理方式将其复制到以下位置的本地文件系统中:每个节点。

或者,如果您增加hadoop客户程序的堆大小,hdfs dfs -put(或-copyFromLocal)仍然可以工作:

$ export HADOOP_CLIENT_OPTS="-DXmx4096m $HADOOP_CLIENT_OPTS"  

但是,正如您所说的,与distcp相比,传输会更慢。

答案 1 :(得分:0)

您可以尝试在core-site.xml中设置属性,以将hdfs路径作为NFS挂载到本地目录,然后将文件从NFS复制到该路径

dfs.nfs3.export.point = [您的hdfs路径]

相关问题