博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDFS的distcp命令两个HDFS集群间传送数据
阅读量:7089 次
发布时间:2019-06-28

本文共 1485 字,大约阅读时间需要 4 分钟。

 Java API等多种接口对HDFS访问模型都集中于单线程的存取,如果要对一个文件集进行操作,就需要编写一个程序来执行并行操作。HDFs提供了一个非常实用的程序——distcp ,用来在Hadoop文件系统中并行地复制大数据量文件。distcp一般适用于在两个HDFS集群间传送数据的情况。如果两个集群都运行在同一个Hadoop版本上,那么可以使用HDFS模式:

  hadoop  distcp  hdfs://NameNode1/foo  hdfs://NameNode2/bar

  这条命令会将第一个集群中的/foo文件夹以及文件央下的文件复制到第二个集群中的/bar目录下,即在第二个集群中会以/bar/foo的目录结构出现。如果/bar目录不存在,则系统会新建一个。也可以指定多个数据源,并且所有的内容都会被复制到目标路径。需要注意的是,源路径必须是绝对路径。即 hdfs://NameNode1/foo

  默认情况下,虽然distcp会跳过在目标路径上已经存在的文件,但是通过-overwirte选项可以选择对这些文件进行覆盖重写,也可以使用,-update选项仅对更新过的文件进行重写

  distcp操作有很多选项可以设置,比如忽略失败、限制文件或者复制的数据量等。直接输入指令或者不附加选项则可以查看此操作的使用说明。即distcp。具体实现时,distcp操作会被解析为一个MapReduce操作来执行,当没有Reducer操作时,复制操作被作为Map操作并行地在集群节点中运行。因此,每个文件都可被当做一个Map操作来执行复制操作。而distcp会通过执行多个文件聚集捆绑操作,尽可能地保证每个Map操作执行相同数量的数据。那么,执行distcp时,Map操作如何确定呢?由于系统需要保证每个Map操作执行的数据量是合理的,来最大化地减少Map执行的开销,而按规定,每个Map最少要执行256MB的数据量(除非复制的全部数据量小于256MB)。比如要复制1GB的数据,那么系统就会分配4个Map任务,当数据量非常大时,就需要限制执行的Map任务数,以限制网络带宽和集群的使用率。默认情况下,每个集群的一个节点最多执行20个Map任务。比如,要复制1000GB数据到100节点的集群中,那么系统就会分配2000个Map任务(每个节点20个),也就是说,每个节点会平均复制512MB。 还可以通过调整distcp的-m参数来减少Map任务量,比如-m 1000就意味着分配1000个Maps,每个节点分配1GB数据量

  如果尝试使用distcp进行HDFS集群间的复制,使用HDFS模式之后,HDFS运行在不同的Hadoop版本之上,复制将会因为RPC系统的不匹配而失败。为了纠正这个错误,可以使用基干HTTP的HFTP进行访问。因为任务要在目标集群中执行,所以HDFS的RPC版本需要匹配,在HFTF模式下运行的代码如下:

  hadoop  distcp  hftp://NameNode1:50070/foo  hdfs://NameNode2/bar
需要注惫的是,要定义访问源的URI中NameNode的网络接口,这个接口会通过dfs.http.address的属性值设定,默认值为50070.

 

  distcp即dist分布式,cp复制。用于在集群内部及集群之间复制数据。即分布式复制!!!

本文转自 yntmdr 51CTO博客,原文链接:http://blog.51cto.com/yntmdr/1852034,如需转载请自行联系原作者
你可能感兴趣的文章
HttpUrlConnection的setDoOutput与setDoInput的区别
查看>>
Knockoutjs自学记录(一)~本地新建展示实例
查看>>
常量和数据类型
查看>>
javascript DOM操作
查看>>
Ajax
查看>>
mysql使用小结
查看>>
测试lua的效率
查看>>
vuex相关(actions和mutation的异曲同工)
查看>>
解决Maven项目相互依赖/循环依赖/双向依赖的问题
查看>>
UML
查看>>
HTTP 返回码中 301 与 302 的区别
查看>>
App自动化测试探索(二)MAC环境搭建iOS+Python+Appium测试环境
查看>>
使用MATPLOTLIB 制图(散点图,热力图)
查看>>
《深入PHP:面向对象、模式与实践》(一)
查看>>
[06] JavaScript 类型
查看>>
求最大值及其下标
查看>>
关于类型“LinkButton”的控件“xxx”必须放在具有 runat=server 的窗体标记内问题的解决方案...
查看>>
Javascript:DOM表格操作
查看>>
解决WCF传输大数据量时出错并提示:远程主机强迫关闭了一个现有的连接
查看>>
蓝桥杯-波动数列
查看>>