Hadoop复制一个目录?

Posted

技术标签:

【中文标题】Hadoop复制一个目录?【英文标题】:Hadoop copy a directory? 【发布时间】:2011-01-17 19:23:23 【问题描述】:

是否有可以将整个本地目录复制到 HDFS 的 HDFS API?我找到了一个用于复制文件的 API,但是否有用于目录的 API?

【问题讨论】:

【参考方案1】:

使用Hadoop FS shell。具体来说:

$ hadoop fs -copyFromLocal /path/to/local hdfs:///path/to/hdfs

如果您想以编程方式执行此操作,请创建两个文件系统(一个本地和一个 HDFS)并使用 the FileUtil class

【讨论】:

我需要以编程方式执行此操作。不是来自外壳 hadoop fs 支持从文件共享复制吗?我从来没有成功地做到这一点【参考方案2】:

我尝试使用

从目录中复制
/hadoop/core/bin/hadoop fs -copyFromLocal /home/grad04/lopez/TPCDSkew/ /export/hadoop1/lopez/Join/TPCDSkew

它给了我一个错误,说 Target is a directory 。然后我将其修改为

/hadoop/core/bin/hadoop fs -copyFromLocal /home/grad04/lopez/TPCDSkew/*.* /export/hadoop1/lopez/Join/TPCDSkew

它有效。

【讨论】:

这是参考hadoop 0.20版本的。 这个问题现在已经修复,不再需要这个符号。但是 OP 没有指定 hadoop 版本,所以这个答案可能仍然适用于旧版本。【参考方案3】:

在 Hadoop 版本中:

Hadoop 2.4.0.2.1.1.0-390

(可能稍后;我只测试了这个特定版本,因为它是我拥有的那个)

您可以使用copyFromLocal 递归复制整个目录而无需任何特殊符号,例如:

hadoop fs -copyFromLocal /path/on/disk /path/on/hdfs

即使/path/on/disk 是一个包含子目录和文件的目录,它也可以工作。

【讨论】:

【参考方案4】:

您也可以使用put 命令:

$ hadoop fs -put /local/path hdfs:/path

【讨论】:

【参考方案5】:

对于程序员,你也可以使用copyFromLocalFile。这是一个例子:

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.FileSystem
import org.apache.hadoop.fs.Path

val hdfsConfig = new Configuration
val hdfsURI = "hdfs://127.0.0.1:9000/hdfsData"
val hdfs = FileSystem.get(new URI(hdfsURI), hdfsConfig)

val oriPath = new Path("#your_localpath/customer.csv")
val targetFile = new Path("hdfs://your_hdfspath/customer.csv")
hdfs.copyFromLocalFile(oriPath, targetFile)

【讨论】:

这是单个文件,OP要求一个目录

以上是关于Hadoop复制一个目录?的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop distcp 用法/附避坑指南

hadoop开发MapReduce程序

熟悉常用的 Linux 操作和 Hadoop 操作

windows下本地调试hadoop代码,远程调试hadoop节点。

Linux系统文件与目录练习题

Hadoop集群日常运维