暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

运维日记丨Hdfs HA集群间distcp实现

新运维新数据 2022-12-03
2459

各位新朋友~记得先点蓝字关注我哦~


关于distcp,熟悉Hadoop的人都知道,这是一个用于大规模集群内部和集群之间拷贝数据的工具。


了解distcp

概述:

它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告的生产。他把文件和目录的列表作为map任务的输入,每个任务会完成源列表中部分文件的拷贝。


语法:

    hadoop distcp hdfs://namenode1:port/source hdfs://namenode2:port/destination

    将namenode1上的/source目录下的文件复制到namenode2上/destination目录下。


    多个数据源

      hadoop distcp hdfs://namenode:port/source1 hdfs://namenode:port/source2 hdfs://namenode:port/destination

      将多个数据源保存在一个文件中,并使用-f输出

        hadoop distcp -f hdfs://namenode:port/srclist hdfs://namenode:port/destination


        用法:


        上述只描述了部分常用的参数,更多详细的参数查看distcp官网

        https://hadoop.apache.org/docs/current/hadoop-distcp/DistCp.html


        注意:

        如果另一个客户端仍在写入源文件,则复制可能会失败。在HDFS上尝试覆盖正在目标位置写入的文件也将失败。如果在复制之前(移出)了源文件,则复制将失败,并带有FileNotFoundException。



        在HA中配置distcp

        可是今天小编遇到一个问题,客户的环境是HA,如果按照上述ip:8020的方法也是可以的,但是需要找到作为Active的节点,否则会报错误:

          [root@dest01 ~]# hadoop distcp -p hdfs://src01:8020/tmp/hive/drcc hdfs://dest/tmp
          22/03/21 20:05:13 INFO tools.DistCp: Input Options: DistCpOptions{atomicCommit=false, syncFolder=false, deleteMissing=false, ignoreFailures=false, overwrite=false, append=false, useDiff=false, useRdiff=false, fromSnapshot=null, toSnapshot=null, skipCRC=false, blocking=true, numListstatusThreads=0, maxMaps=20, mapBandwidth=0.0, copyStrategy='uniformsize', preserveStatus=[REPLICATION, BLOCKSIZE, USER, GROUP, PERMISSION, CHECKSUMTYPE, TIMES], atomicWorkPath=null, logPath=null, sourceFileListing=null, sourcePaths=[hdfs://src01:8020/tmp/hive/drcc], targetPath=hdfs://dest/tmp, filtersFile='null', blocksPerChunk=0, copyBufferSize=8192, verboseLog=false}, sourcePaths=[hdfs://src01:8020/tmp/hive/drcc], targetPathExists=true, preserveRawXattrsfalse
          22/03/21 20:05:13 INFO client.RMProxy: Connecting to ResourceManager at dest01/192.168.2.200:8032
          22/03/21 20:05:13 ERROR tools.DistCp: Exception encountered
          org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException): Operation category READ is not supported in state standby. Visit https://s.apache.org/sbnn-error


          上述报错中明显写出在standby状态下不支持read。


          因此我们需要将语法中的IP:8020改成nameservice,他会自动去寻找作为active的节点


          配置HA集群

          修改hdfs-site.xml文件或者在网页上修改。

          1. dfs.nameservices = HAA, HAB

          2. In cluster A:dfs.internal.nameservices = HAA

            In cluster B:dfs.internal.nameservices = HAB

          3. In cluster Adfs.ha.namenodes.HAB = nn1,nn2

            In cluster Bdfs.ha.namenodes.HAA = nn1,nn2

          4. In Cluster A:dfs.namenode.rpc-address.HAB.nn1 =:8020

            dfs.namenode.rpc-address.HAB.nn2 =:8020

            In Cluster B:dfs.namenode.rpc-address.HAA.nn1 =:8020

            dfs.namenode.rpc-address.HAA.nn2 =:8020

          5. In cluster A:dfs.client.failover.proxy.provider. HAB = org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

            In cluster B:dfs.client.failover.proxy.provider. HAA = org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider


          示例:


          当然上述配置完成后需要重启hdfs服务,若生产端无法重启,那么我们只需要配置目标端的参数并重启。


          语法:

            hadoop distcp hdfs://HAA/tmp/testDistcp hdfs://HAB/tmp/
              [root@dest01 ~]# hadoop distcp -p hdfs://mycluster1/tmp/hive/drcc hdfs://dest/tmp
              ……
              22/03/21 19:50:11 INFO mapreduce.Job: Running job: job_1647863205255_0001
              22/03/21 19:50:20 INFO mapreduce.Job: Job job_1647863205255_0001 running in uber mode : false
              22/03/21 19:50:20 INFO mapreduce.Job: map 0% reduce 0%
              22/03/21 19:50:27 INFO mapreduce.Job: map 33% reduce 0%
              22/03/21 19:50:28 INFO mapreduce.Job: map 100% reduce 0%
              22/03/21 19:50:29 INFO mapreduce.Job: Job job_1647863205255_0001 completed successfully
              22/03/21 19:50:29 INFO mapreduce.Job: Counters: 38
              File System Counters
              FILE: Number of bytes read=0
              FILE: Number of bytes written=682062
              FILE: Number of read operations=0
              FILE: Number of large read operations=0
              FILE: Number of write operations=0
              HDFS: Number of bytes read=2846
              HDFS: Number of bytes written=8
              HDFS: Number of read operations=48
              HDFS: Number of large read operations=0
              HDFS: Number of write operations=16
              HDFS: Number of bytes read erasure-coded=0
              Job Counters
              Launched map tasks=3
              Other local map tasks=3
              Total time spent by all maps in occupied slots (ms)=17300
              Total time spent by all reduces in occupied slots (ms)=0
              Total time spent by all map tasks (ms)=17300
              Total vcore-milliseconds taken by all map tasks=17300
              Total megabyte-milliseconds taken by all map tasks=17715200
              Map-Reduce Framework
              Map input records=7
              Map output records=0
              Input split bytes=348
              Spilled Records=0
              Failed Shuffles=0
              Merged Map outputs=0
              GC time elapsed (ms)=215
              CPU time spent (ms)=1560
              Physical memory (bytes) snapshot=800432128
              Virtual memory (bytes) snapshot=7767953408
              Total committed heap usage (bytes)=1414004736
              Peak Map Physical memory (bytes)=283295744
              Peak Map Virtual memory (bytes)=2591727616
              File Input Format Counters
              Bytes Read=2490
              File Output Format Counters
              Bytes Written=0
              DistCp Counters
              Bandwidth in Btyes=8
              Bytes Copied=8
              Bytes Expected=8
              Files Copied=1
              DIR_COPY=6


              关于distcp额外知识

              1、在HDFS不通版本之间复制

              两种不同的Hadoop版本之间进行复制(2.X和3.X),通常使用webhdfsfiles系统。与以前的hftpfiles不同,由于webhdfs可以用于读取和写入操作,所以DistCp可以在源和目标集群上运行(HftpFileSystem。这是一个只读文件系统,所以DistCp必须运行在目标端集群上,Hadoop3.x 已经对其废弃使用,使用webhdfs替代)。

                hadoop distcp -update -skipcrccheck -m 50 \
                webhdfs://10.90.48.127:50070/user/hive/warehouse/dm_smssdk_master.db/log_device_phone_dedup/day=20210701 \
                webhdfs://10.90.50.54:9870/user/hive/warehouse/dm_smssdk_master.db/log_device_phone_dedup/day=20210701

                2、安全复制

                使用swebhdfs://命令来使用SSL保护webhdfs


                3、mapreduce和他的副作用

                • 除非指定-overwrite,否则在重新执行时由先前映射成功复制的文件将被标记为“已跳过”。

                • 如果映射失败mapreduce.map.maxattempts次,则其余映射任务将被杀死(除非设置了-i)。

                • 如果将mapreduce.map.speculative设置为final和true,则副本的结果不确定。


                4、distcp和对象存储

                DistCp可与对象存储(例如Amazon S3,Azure WASB和OpenStack Swift)一起使用。

                先决条件

                1)对象存储实现的JAR及其所有依赖项都位于类路径上。

                2)JAR自动注册其捆绑的文件系统客户端,否则可能需要修改配置以声明实现文件系统架构的类。ASF自己的所有对象存储客户端都是自注册的。

                3)对象存储访问凭据必须在群集配置中可用,或者在所有群集主机中都可用。


                DistCp可用于上传数据

                  hadoop distcp -direct hdfs://nn1:8020/datasets/set1 s3a://bucket/datasets/set1


                  下载数据

                    hadoop distcp s3a://bucket/generated/results hdfs://nn1:8020/results






                    美创是国内领先的数据库服务提供商。服务团队拥有PG ACED 1名、Oracle&PG ACE 3人、DSI智库专家5名、DSMM测评师7名、OCM 20余人、数十名Oracle OCP、MySQL OCP、TDSQL TCP、OceanBase OBCP、TiDB PTCP、达梦 DCP、人大金仓、红帽RHCA、中间件weblogic、tuxedo、CISP-DSG、CISSP、CDGA、CDPSE、CZTP、CDSP等认证人员,著有《DBA攻坚指南:左手Oracle,右手MySQL》,《Oracle数据库性能优化方法和最佳实践》,《Oracle内核技术揭秘》,《Oracle DBA实战攻略》等多本数据库书籍。运维各类数据库合计5000余套,精通Oracle、MySQL、SQLServer、DB2、PostgreSQL、MongoDB、Redis、TDSQL、OceanBase、达梦、人大金仓等主流商业和开源数据库。美创拥有完善的运维体系和人员培养体系,并同时提供超融合、私有云整体服务解决方案、数据安全咨询及运营服务方案等,已为金融、政府、企业、能源等多个行业的客户提供量身定制的各类服务,赢得了客户的高度赞誉和广泛认可。




                    文章转载自新运维新数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                    评论