distcp本地文件到hadoop

问题描述 投票:0回答:1

我在本地文件系统上有一个1Gb的文件tmpdist_testfle。

我可以复制它。hadoop fs -put file:///tmp/dist_testfile maprfs:///

但不能 distcp 它。吩咐 hadoop distcp file:///tmp/dist_testfile maprfs:///它刺破了FileNotFoundException异常。

20/05/19 15:57:40 INFO tools.DistCp: DistCp job-id: job_1588609058920_0136
20/05/19 15:57:40 INFO mapreduce.Job: Running job: job_1588609058920_0136
20/05/19 15:57:46 INFO mapreduce.Job: Job job_1588609058920_0136 running in uber mode : false
20/05/19 15:57:46 INFO mapreduce.Job:  map 0% reduce 0%
20/05/19 15:57:50 INFO mapreduce.Job: Task Id : attempt_1588609058920_0136_m_000000_0, Status : FAILED
Error: java.io.IOException: org.apache.hadoop.tools.mapred.RetriableFileCopyCommand$CopyReadException: java.io.FileNotFoundException: File file:///tmp/dist_testfile does not exist
    at org.apache.hadoop.tools.mapred.CopyMapper.map(CopyMapper.java:250)
    at org.apache.hadoop.tools.mapred.CopyMapper.map(CopyMapper.java:52)
    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:346)
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163)
    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:1669)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: org.apache.hadoop.tools.mapred.RetriableFileCopyCommand$CopyReadException: java.io.FileNotFoundException: File file:///tmp/dist_testfile does not exist
    ... 10 more

为什么会抛出Exception。最后,如何用 distcp 从本地 FS 复制文件到 hadoop?

hadoop hdfs mapr distcp
1个回答
0
投票

问题中没有足够的信息来确定是否能给你一个完整的答案。特别是,还不太清楚你的MapR集群是否与你的本地数据所在的地方是远程的。

如果我们暂时从对 distcp 的关注中拉回来一点,正常情况下,将文件从本地文件存储复制到 MapR 系统中的方式根本不使用 hadoop 命令。那些命令往往启动速度非常慢,而且会消耗大量的内存,使简单的任务变得复杂。因此,我可以这样做来复制一个文件

cp /tmp/dist_testfile /mapr/metrics-cluster/home/tdunning/tmp-dir

这其中有一些微妙的地方。首先,我们使用的是普通的Linux命令。我们本来也可以使用rsync来做增量拷贝。这对于相对较小的文件(小于几GB)来说是非常好的,因为单进程有限的传输速率(通常小于2GB)被大大加快的启动时间所抵消。其次,这假定我们已经在本地机器上挂载了MapR文件系统。这可以使用NFS或POSIX驱动来完成(通常后者更好)。第三,我已经在命令中命名了我要传输到的集群(metrics-cluster)。如果配置为允许访问,这可以是任何我可以看到的集群,近的或远的。

这一切都很好,很好。使用这种风格往往比使用更复杂的工具要好得多。编写简单的程序,甚至是复杂的程序,在Kubernetes下运行也是如此。

另一方面,如果你想要的不是传输一个文件,而是调试如何让distcp工作,那么我们就要另辟蹊径了。

调试 distcp 的第一步是确定一些东西

a) distcp是否可以访问提供HDFS实现的MapR jars,从而可以访问MapR FS?最简单的方法是使用MapR提供的distcp,因为它已经预集成了一切。因为 hadoop fs 命令似乎可以工作,看来你有一个有效的MapR安装,但有可能你的distcp来自该安装之外。

b) 本地机器是否被正确配置为访问你要写入的集群?同样,鉴于 hadoop fs 命令工作,看来你是这样做的。

c) distcp的参数是否完全正确。根据我的经验,这是最常见的问题。像 distcp 这样的各种 hadoop 命令的参数解析是出了名的脆弱。一部分原因是代码,但另一部分原因是像tab键这样简单的文件完成方式依赖于shell通过正常路径名访问文件。当你开始包括文件系统方案时,这一点就会被打破。我不能对你的命令语法发表太多评论,因为我几乎从不使用 distcp(我使用更简单的方法),但我可以说,我听说有很多用户很难让它按预期工作。也许用正确的方式憋住你的嘴就是答案(顺便说一句,那是个玩笑)。

d)最后,你可以验证一下你的Hadoop配置文件中本地文件系统的配置是否正确?我曾有用户把file:改成local:,然后他们就非常困惑了。

© www.soinside.com 2019 - 2024. All rights reserved.