将文件从 NFS 或本地 FS 复制到 HDFS
Copy Files from NFS or Local FS to HDFS
我正在尝试将大量文件(100k+,总大小 2 TB)从 NFS 复制到 HDFS。什么是有效的方法。
我在将其安装到边缘节点后尝试了以下选项
- hdfs dfs -put : 由于内存错误而失败,传输也很慢
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路径]
我正在尝试将大量文件(100k+,总大小 2 TB)从 NFS 复制到 HDFS。什么是有效的方法。
我在将其安装到边缘节点后尝试了以下选项
- hdfs dfs -put : 由于内存错误而失败,传输也很慢
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路径]