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

Copy Files from NFS or Local FS to HDFS

我正在尝试将大量文件(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.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

为了 distcp 工作,本地文件应该可以从集群中的所有工作节点访问,或者通过每个节点上的挂载点访问共享 NFS 位置,或者通过物理复制它到本地文件每个节点的系统。

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

$ export HADOOP_CLIENT_OPTS="-DXmx4096m $HADOOP_CLIENT_OPTS"  

但是正如你所说,传输会比distcp慢。

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

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