跨平台传输方案

最近在做一个小任务,将一个CDH平台中Hive的部分数据同步到另一个平台中。毕竟我也刚开始工作,在正式开始做之前,首先进行了一段时间的练习,下面的内容就是练习时写的文档中的内容。如果哪里有错误或者疏漏,希望各位网友能够指出。

第一篇:HDFS的上传与下载:https://www.cnblogs.com/BlackString/p/10552553.html

第二篇:Hive中数据的导入与导出:https://www.cnblogs.com/BlackString/p/10552806.html

第三篇:Hive分区表的导入与导出:https://www.cnblogs.com/BlackString/p/10552901.html

 

跨集群传输文件

1. 跨集群传输文件的几种方式

  跨集群传输文件,据我现在所知的,有两种方式,分别是

  1)将文件从一个HDFS集群落地到Linux(服务器)上,然后通过scp命令将文件传输到另外一个HDFS集群的某个节点中,然后再从这个节点上传到HDFS中;

  2)使用distcp命令,直接从一个HDFS集群中传输到另外一个HDFS集群中。

  这两种方式都能达到一个HDFS集群中的数据转移到另外一个HDFS集群中的目的,但是显而易见的,前者显得极为繁琐,相比之下,后者只需要一条指令就可以将大量数据进行转移。

 

  2. distcp指令

  1)distcp简介

    Java API等多种接口对HDFS访问模型都集中于单线程的存取,如果要对一个文件集进行操作,就需要编写一个程序来执行并行操作。

    HDFS提供了一个非常实用的程序--distcp ,用来在Hadoop文件系统中并行地复制大数据量文件。

    distcp一般适用于在两个HDFS集群间传送数据的情况。如果两个集群都运行在同一个Hadoop版本上,那么可以使用HDFS模式,如:

      hadoop distcp hdfs://NameNode01/old hdfs://NEWNameNode01/new

    这条命令会将第一个集群中的/old文件夹以及文件夹下的文件复制到第二个集群中的/new目录下,即在第二个集群中会以/new/old的目录结构出现。

    如果/new目录不存在,则系统会新建一个。也可以指定多个数据源,并且所有的内容都会被复制到目标路径。

    需要注意的是,源路径必须是绝对路径,如:

      hdfs://NameNode1/old

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

    distcp操作有很多选项可以设置,比如忽略失败、限制文件或者复制的数据量等。直接输入指令或者不附加选项则可以查看此操作的使用说明,即:distcp。

 

  2)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://NameNode01:50070/old hdfs://NEWNameNode01/new

    一个文件的复制

      hadoop distcp hftp://192.168.2.50:50070/user/log.txt hdfs://192.168.XX.XX/tmp

    需要注意的是,要定义访问源的URI中NameNode的网络接口,这个接口会通过dfs.http.address的属性值设定,默认值为50070.

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

    例子:

    使用distcp.bytes.per.map控制map数量,mapreduce.job.queuename指定队列,mapreduce.job.name指定job名称
      hadoop distcp -Ddistcp.bytes.per.map=1073741824 -Dmapreduce.job.queuename=hive -Dmapreduce.job.name=cpdata

                hdfs://cloudcluster/apps/hive/warehouse/db/data hdfs://192.168.XX.XX:8020/user/hive/warehouse/db/data

 

  3)Map数目
    distcp会尝试着均分需要拷贝的内容,这样每个map拷贝差不多相等大小的内容。 但因为文件是最小的拷贝粒度,所以配置增加同时拷贝(如map)的数目不一定会增加实际同时拷贝的数目以及总吞吐量。
    如果没使用-m选项,distcp会尝试在调度工作时指定map的数目 为 min (total_bytes / bytes.per.map, 20 num_task_trackers), 其中bytes.per.map默认是256MB。
    建议对于长时间运行或定期运行的作业,根据源和目标集群大小、拷贝数量大小以及带宽调整map的数目。

      hadoop distcp -Ddistcp.bytes.per.map=1073741824 -Ddfs.client.socket-timeout=240000000 -Dipc.client.connect.timeout=40000000 -i -update

                 hdfs://master1:8020/foo/a hdfs://master1:8020/foo/b hdfs://master2:8020/bar/foo

 

  4)不同HDFS版本间的拷贝
    对于不同Hadoop版本间的拷贝,用户应该使用HftpFileSystem。 这是一个只读文件系统,所以distcp必须运行在目标端集群上(更确切的说是在能够写入目标集群的TaskTracker上)。

    源的格式是 hftp://<dfs.http.address>/<path> (默认情况dfs.http.address是 <namenode>:50070)。

 

3. distcp指令练习

 前几篇文档中所使用的文件夹 /user/test 中包含了数个数据表的数据,在这里就使用这个文件夹进行练习。

  1)在测试集群中新建一个 /user/testFolder文件夹,接下来我们就将文件传输到这个文件夹中;

      [root@BD07 ~] hadoop fs -mkdir /user/testFolder

  2)到练习集群中传输文件到测试集群中:

      [root@DataCenter2 Test] hadoop distcp /user/test hdfs://10.128.XX.XXX/user/testFolder

  3)传输完成后,到测试集群中查看 /user/testFolder文件夹,发现其中多出了一个test文件夹,查看其中的数据,发现正是练习集群中的数据:

      [root@BD07 ~] hadoop fs -ls /user/test/test
      -rw-r--r-- 3 root mapred 1392 2019-03-15 16:51 /user/test/test/_metadata
      drwxr-xr-x - root mapred 0 2019-03-15 16:51 /user/test/test/data
      drwxr-xr-x - root mapred 0 2019-03-15 16:51 /user/test/test/test01
      drwxr-xr-x - root mapred 0 2019-03-15 16:51 /user/test/test/test02
      drwxr-xr-x - root mapred 0 2019-03-15 16:51 /user/test/test/test03
      drwxr-xr-x - root mapred 0 2019-03-15 16:51 /user/test/test/test04
      drwxr-xr-x - root mapred 0 2019-03-15 16:51 /user/test/test/test05

  4)切换节点查看HDFS的数据,发现仍然可以查看到这些数据,证明数据传输成功了。

 

至此,该系列文档正式结束。

转载于:https://www.cnblogs.com/BlackString/p/10553010.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值