【问题标题】:distcp local file to hadoopdistcp 本地文件到 hadoop
【发布时间】:2020-05-19 16:01:30
【问题描述】:

我在本地文件系统 /tmp/dist_testfle 上有 1 Gb 文件

我可以复制它: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

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

【问题讨论】:

  • DistCp 用于将文件从一个集群复制到另一个集群,而不是从本地复制到 hadoop。
  • 尝试改用“hfs dfs -copyFromLocal local_path clutter_path”命令。

标签: hadoop hdfs mapr distcp


【解决方案1】:

问题中没有足够的信息来确保给您一个完整的答案。特别是,您的 MapR 集群是否远离本地数据所在的位置还不是很清楚。

如果我们暂时从对 distcp 的关注中抽出一点,将文件从本地文件存储复制到 MapR 系统的正常方法根本不使用 hadoop 命令。这些命令往往启动速度很慢,并且会占用大量内存以使简单任务复杂化。因此,我可能会这样做来复制文件

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

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

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

另一方面,如果您想要的不是传输单个文件,而是调试如何使 distcp 工作,我们有不同的鱼。

调试distcp的第一步是确定一些事情

a) distcp 是否有权访问提供可以访问 MapR FS 的 HDFS 实现的 MapR jar?实现这一点的最简单方法是使用 MapR 提供的 distcp,因为它带有预先集成的所有内容。因为hadoop fs 命令似乎有效,看来您安装了有效的 MapR,但您可能有来自该安装之外的 distcp。

b) 本地计算机是否正确配置为访问您要写入的集群?同样,鉴于hadoop fs 命令有效,您似乎可以这样做。

c) 是 distcp 的参数完全正确。根据我的经验,这是最常见的问题。各种 hadoop 命令(如 distcp)中的参数解析是出了名的脆弱。部分原因是代码,但部分原因是因为诸如用于文件完成的 tab 键之类的简单事情取决于 shell 可以通过正常路径名访问文件。当您开始包含文件系统方案时,这会分崩离析。由于我几乎从不使用 distcp(我使用更简单的方法),因此我无法对您的命令语法发表太多评论,但我可以说我听说过许多用户难以让它按预期工作。也许以正确的方式闭嘴就是答案(顺便说一句,那是个玩笑)。

d) 最后,您能否验证一下您的 Hadoop 配置文件中是否正确配置了本地文件系统?我有用户将 file: 更改为 local: 然后他们很困惑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 2019-12-22
    • 2015-08-26
    • 2022-10-22
    • 2013-12-13
    • 2012-10-01
    • 2014-06-22
    相关资源
    最近更新 更多