HDFS文件拷贝

1.如何将hdfs上数据,从源目录src,拷贝到目标目录des下。
2.如果数据量特别大,如何拷贝?
 
 

1.如何将hdfs上数据,从源目录src,拷贝到目标目录des下。

在hdfs中,关于数据拷贝,这里涉及到一个命令
hadoop fs -cp URI [URI …] <dest>
使用方法:hadoop fs -cp URI [URI …] <dest>
将文件从源路径复制到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。
示例:
hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2
hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2 /user/hadoop/dir
返回值:成功返回0,失败返回-1。
这里可以参考hadoop官网说明:http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html#cp

2.如果数据量特别大,如何拷贝?

如果在hdfs上,拷贝的数据量比较大,我们可以使用distcp这个命令。
hadoop distcp hdfs://nn1:8020/foo/bar  hdfs://nn2:8020/bar/foo
当执行distcp时,会发现命令会调用mapreduce执行数据拷贝,而且只有map任务没有reduce
hadoop distcp可以指定一些参数,例如:

hadoop distcp -Dmapreduce.map.failure.maxpercent=90 -Dmapreduce.job.queuename=abc -i -update hdfs://namenodeip:port/srcurl hdfs://namenodeip:port/desurl

 

Map数目

DistCp会尝试着均分需要拷贝的内容,这样每个map拷贝差不多相等大小的内容。 但因为文件是最小的拷贝粒度,所以配置增加同时拷贝(如map)的数目不一定会增加实际同时拷贝的数目以及总吞吐量。
如果没使用-m选项,DistCp会尝试在调度工作时指定map的数目 为 min (total_bytes / bytes.per.map, 20 * num_task_trackers), 其中bytes.per.map默认是256MB。
建议对于长时间运行或定期运行的作业,根据源和目标集群大小、拷贝数量大小以及带宽调整map的数目。
distcp把一大堆文件平均分摊开交给map去执行,每个文件单独一个map任务。那么默认会分成几个map合适呢?首先按256mb平均分,如果总大小低于256mb,distcp只会分配一个map。但如果平分得结果出现节点得map数大于20的情况,每个节点的map数就会按20算,看下流程图:
你可以通过-m手动设置,如果为了hdfs的均衡,最好是将maps设的多一些,将block分摊开来。

 

 

不同HDFS版本间的拷贝

对于不同Hadoop版本间的拷贝,用户应该使用HftpFileSystem。 这是一个只读文件系统,所以DistCp必须运行在目标端集群上(更确切的说是在能够写入目标集群的TaskTracker上)。 源的格式是hftp://<dfs.http.address>/<path> (默认情况dfs.http.address是 <namenode>:50070)。
如果两个集群间的版本不一致,那么使用hdfs可能就会产生错误,因为rpc系统不兼容。那么这时候你可以使用基于http协议的hftp协议,但目标地址还必须是hdfs的,象这样:
hadoop distcp hftp://namenode:50070/user/hadoop/input hdfs://namenode:9000/user/hadoop/input1
推荐用hftp的替代协议webhdfs,源地址和目标地址都可以使用webhdfs,可以完全兼容
hadoop distcp webhdfs://namenode:50070/user/hadoop/input webhdfs://namenode:50070/user/hadoop/input1

Map/Reduce和副效应

像前面提到的,map拷贝输入文件失败时,会带来一些副效应。
除非使用了-i,任务产生的日志会被新的尝试替换掉。
除非使用了-overwrite,文件被之前的map成功拷贝后当又一次执行拷贝时会被标记为 “被忽略”。
如果map失败了mapred.map.max.attempts次,剩下的map任务会被终止(除非使用了-i)。
如果mapred.speculative.execution被设置为 final和true,则拷贝的结果是未定义的。
这里可以参考hadoop官网说明:http://hadoop.apache.org/docs/r1.0.4/cn/distcp.html

文件拷贝涉及到的情况:

①同一个集群中,小量文件拷贝
②同一个集群中,大量文件拷贝
③不同集群中,同版本hadoop,数据拷贝
④不同集群中,不同版本hadoop,数据拷贝
等。

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注