大家好,我是明哥!

最近有小伙伴问到 hadoop distcp 的使用,对其中的一些细节和容易踩的坑不是很清楚,所以今天我们来看下 hadoop distcp 的原理,细节和容易踩的坑。

1 DistCp 概述

我们知道大数据集群内部都有节点级别和机架级别的容错机制(存储层对应的就是传统的三副本或纠删码机制),但对于一些数据安全性要求更改的场景,比如在金融行业典型的两地三中心场景下,经常有跨区域跨集群灾备的需求,此时就会涉及到跨集群的数据同步。

DistCp (distributed copy) 就是一款跨集群的数据同步工具。

DistCp 可以用来做 hdfs 集群内部或集群之间的大规模的数据同步,由于在底层使用了 MapReduce 框架会通过多个 mapper 来拷贝需要拷贝的文件列表,其性能相比 hdfs dfs -get/put 等通过本地文件系统中转的数据同步方案,要高效快速很多。

同时由于 DistCp 可以跨 hdfs 大版本进行数据同步,且新版本的 DistCp(distcp version 2) 相比老版本的DistCp(legacy DistCp,version 1.2.1)在很多方面都做了优化和改进,所以大规模的数据同步,不论是集群内部还是集群之间,首选的方案都是DistCp。

很多商业的hdfs数据同步方案,其底层都是原生的 DistCp,比如 cdh 的 bdr 工具,比如 tdh 的 backup工具,其原理都是如此。

2 关于集群间数据同步

  • 集群间数据同步,可以从原集群推送数据到目标集群,此时会为会占用原集群 yarn 中的资源;

  • 集群间数据同步,也可以从目标集群发起作业,主动拉取原集群的数据,此时消耗的是目标集群的YARN资源;

  • 如果原集群是生产集群,一般在目标集群执行命令hadoop distcp来发起作业,通过拉的方式来同步数据,此时不会消耗原集群即生产集群的YARN资源;

  • 当原集群和目标集群大版本不同时,(比如在 hadoop 1.x 跟 hadoop 2.x 之间同步数据),需要使用 webhdfs 协议,即通过以下格式指定远端集群:webhdfs://<namenode_hostname>:<http_port>;(当然,既可以从原集群推数据,也可以从目标集群拉数据);

  • 当原集群和目标集群大版本相同时,(比如都是 hadoop 2.x或都是hadoop 3.x),推荐使用 hdfs 协议,此时性能比 webhdfs 更好;

  • 如果 webhdfs 配置了 SSL 加密,则需要使用协议 “swebhdfs://” ;

3 关于开启了 kerberos 安全认证后的数据同步

  • 如果原集群和目标集群都启用了kerberos认证 (hadoop.security.authentication=kerberos),需要首先做 kerberos 的 realm 互信,然后才能通过推或拉的方式执行 dictcp 进行数据同步;

  • 如果原集群与目标集群一个启用了kerberos认证,另一个没有启用kerberos认证,为简单起见,可以在启用了kerberos认证的集群中执行distCp,通过推或拉的方式进行数据同步;

4 DistCp 的底层工作机制

新版 DistCp 底层有以下组件,其各自的职责如下:

  • DistCp Driver:负责解析 DistCp 的命令行参数,并编排协调具体的拷贝任务(首先调用 copy-listing-generator 获得需拷贝的文件列表,然后配置并提交 Map-Reduce 拷贝任务,最后根据配置项返回 MR 任务句柄并推出,或等待 MR任务执行结束;)

  • Copy-listing generator:负责解析给定的 source-paths(目录或文件,可以包含通配符),生成待拷贝的文件/目录列表,并输出到一个 SequenceFile;

  • Input-formats 和 Map-Reduce:负责读取 Copy-listing generator 生成的 SequenceFile 中的待烤包的文件列表,并执行实际的文件拷贝;

5 DistCp 的重要参数讲解

DistCp 提供了多种参数,来控制拷贝任务的各种细节,经常使用到的关键参数有 -update, -delete, -overwrite, -m, -bandwidth,-diff,-p,-i 等:

  • -m <num_maps>:控制 map 任务的最大个数;(实际的 map 任务数,不会大于待拷贝的文件的个数;更多的 map 数不一定会提升整体IO吞吐);

  • -bandwidth:控制每个 map 任务可用的最大带宽,单位 MB;

  • -p[rbugpcaxt]:控制是否保留源文件的属性,rbugpcaxt 分别指:replication number, block size, user, group, permission,checksum-type, acl, xattr,以及 tiemstamp;

  • skipcrccheck:控制检查源和目标文件差异以生成待拷贝文件列表时,是否跳过 CRC 校验;

  • update: 如果源和目标目录下的文件,在 文件大小/块大小/checksum 上有不同,就用;

  • -update: 拷贝目标目录下不存在而源目录下存在的文件,或目标目录下和源目录在文件大小/块大小/checksum 上不同的文件;

  • -overwrite: 覆盖目标目录下的同名文件。(如果某个 map 任务执行失败且没有指定 -i 参数,则所有的待拷贝的文件,包括拷贝失败的文件,都会被重新拷贝);

  • -i: 忽略拷贝过程中某些 MAP 任务的错误,继续执行其余的 map拷贝任务,而不是直接失败整个作业;(默认情况下,如果有某个 map 任务失败的次数达到了 mapreduce.map.maxattempts,则未完成的 map 任务都会被 kill;);

  • -delete: 删除目标目录下存在,但源目录下不存在的文件;该参数只能和 -update 或 -overwrite 配合使用;

  • -diff 和 -rdiff:控制是否结合使用快照机制,会基于两个快照的差异(snapshot diff)来确定待拷贝的文件列表,以下要点需要注意:

    • -diff 和 -rdiff,需要配合选项 -update 一起使用;

    • -diff 和 -rdiff,不能和 -delete 一起使用,否则会报错:java.lang.IllegalArgumentException: -delete and -diff/-rdiff are mutually exclusive. The -delete option will be ignored;

    • 该命令的前提条件:需要源目录下有指定的两个快照 from_snapshot 和 to_snapshot;

    • 该命令的前提条件:需要目标目录下有快照 from_snapshot;

    • 该命令的前提条件:需要目标目录在前期制作了 from_snapshot 快照后,没有新的文件写操作 (create, rename, delete);

    • 该命令执行完毕后,目标目录下并不会自动创建快照 to_snapshot,如果后续还需要基于快照来做增量同步,需要手工在同步完毕后对目标目录制作快照 to_snapshot,为后续基于快照的同步(hadoop distcp -diff -update)做好准备;

6 易踩的坑 - skipcrccheck

  • 参数 -skipcrccheck 的意思是 “Whether to skip CRC checks between source and target paths.”,即是否跳过原路径和目标路径下文件的 crc 校验(CRC:Cyclic Redundancy Check)。

  • 如果指定了该参数,会跳过crc校验,同步作业速度会快些;

  • 但指定该参数后,由于不校验 crc,而是通过文件名和文件大小来发现哪些文件需要进行同步,在极端情况下,可能会漏掉某些需要同步的小文件,比如某些只有少数几条记录的小文件,从而造成数据不一致;

  • 下图展示的就是,某两个 hive orc 表都只有1条记录,对应的 HDFS 文件也比较小且都是 299 BYTE, 指定参数 skipcrccheck 执行同步操作时,就遗漏了该文件,造成了源目录与目标目录数据的不一致:“sudo -u hdfs hadoop distcp -update -delete -skipcrccheck -pugpb hdfs://nameservice1/user/hive/warehouse/hs_liming.db/test_single_row_scp hdfs://nameservice1/user/hive/warehouse/hs_liming.db/test_single_row_scp2“:

skipcrccheck 的坑-hdfs

skipcrccheck 的坑-hive sql

7 关于 hive 的跨集群数据同步

  • 关于 hive的跨集群数据同步,hive 社区在推动 hive replication 的方案,但因为该方案的各种前提和限制,目前该方案在业界采用的比较少;

  • 市面上采用的较多的hive的跨集群数据同步,是对hive的元数据和数据分别进行数据同步;

  • 对于 hive 数据的同步,本质上就是对于底层 hdfs 数据的同步,可以采用上述hdfs的distcp方案;

  • 对于hive元数据的同步,本质上就是对底层 metastore db,如 mysql/posggresql 等rdbms中的数据的同步,可以采用成熟的 mysqldump 和 source方案。

8 常用命令总结

  • 执行数据同步操作时,需要停止对目标目录的其它写操作;

  • 当没有对原目录的写操作时(即停止了对源目录的写操作),可以使用以下命令来跨集群同步数据:hadoop distcp -delete -update -pugpb -m 10 -bandwidth 5 hdfs://xx.xx/ hdfs://yy.yy/

  • 当有对原目录的写操作时(即有对原目录的并发写操作),需要结合快照机制来同步数据:hadoop distcp -diff <from_snapshot> <to_snapshot> -update -pugpb

  • 结合快照机制来同步数据时,有以下前提要求:

    • 需要源目录下有指定的两个快照 from_snapshot 和 to_snapshot;

    • 需要目标目录下有快照 from_snapshot;

    • 需要目标目录在前期制作了 from_snapshot 快照后,没有新的文件写操作如 create/rename/delete (即要求目标目录的当前状态跟原目录的from-snapshot一致);

    • 该命令执行完毕后,目标目录下并不会自动创建快照 to_snapshot,如果后续还需要基于快照来做增量同步,需要手工在同步完毕后对目标目录制作快照 to_snapshot,为后续基于快照的同步(hadoop distcp -diff -update)做好准备;

一篇文章彻底掌握 HDFS 跨集群跨版本数据同步工具 hadoop disctp相关推荐

  1. k8s集群下搭建数据同步工具-canal:canal-admin篇

    k8s集群下搭建数据同步工具-canal:canal-admin篇 前言 容器化 canal-admin 环境准备 k8s集群创建pod canal-admin 前言 本文使用v1.1.4版本的can ...

  2. 不懂就问:ZooKeeper 集群如何进行数据同步?

    本文作者:HelloGitHub-老荀 Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费开源.有趣.入门级的 ZooKeeper 教程,面向有编程基础的新手. 项 ...

  3. 同程旅行Hadoop集群跨机房迁移实践

    本文作者:郭飞.现任同程旅行技术专家. Apache Hadoop.Hive.Spark  contributor 背景 随着同程旅行业务和数据规模越来越大,原有的机房不足以支撑未来几年的扩容需求,同 ...

  4. 实现Kubernetes跨集群服务应用的高可用

    我们在进行生产环境部署时得到的一个明确的需求,是Kubernetes用户希望服务部署能够zone.跨区域.跨集群甚至跨云边界(译者:如跨云供应商).相比单集群多zone部署,跨集群服务提供按地域分布, ...

  5. Elasticsearch:跨集群复制 Cross-cluster replication(CCR)

    跨集群复制(CCR)功能支持将远程集群中的索引复制到本地集群. 可以在一些常见的生产用例中使用此功能: 灾难恢复(DR)/高可用性(HA):如果主群集发生故障,则进行灾难恢复. 辅助群集可以用作热备份 ...

  6. 基于 Alluxio 的 HDFS 多集群统一入口的实现

    回顾:大数据平台技术栈 (ps:可点击查看),今天就来说说其中的Alluxio! 本文作者郭业俊,同济大学自动化专业硕士毕业,现担任苏宁易购大数据存储平台负责人.主要负责苏宁Hadoop分布式文件系统 ...

  7. 数据中心安全风控_平安银行Hadoop集群跨数据中心迁移项目告捷项目骨干专访

    Hadoop集群跨数据中心迁移 平安银行东莞数据中心建成 平安银行科技中心零售大数据团队 平安银行科技中心科技运营中心 群迁告捷 经过平安银行科技运营中心和大数据团队的不懈努力,作为平安银行AI战略转 ...

  8. 08 Confluent_Kafka权威指南 第八章:跨集群数据镜像

    文章目录 CHAPTER 8 Cross-Cluster Data Mirror 跨集群数据镜像 Use Cases of Cross-Cluster Mirroring 跨集群镜像用例 Multic ...

  9. PG跨服务器的数据拷贝以及往pl/proxy集群中插入数据

    上一篇文章我介绍了pl/proxy集群的部署,现在需要往这个集群里导入数据.导入的数据源和待导入的目标库在两个不同服务器的pg数据库上.用postgres_fdw技术可以实现这个功能. 首先需要在待导 ...

  10. 滴滴 Elasticsearch 集群跨版本升级与平台重构之路

    分享嘉宾:赵情融 滴滴专家工程师 编辑整理:王洪达 出品平台:DataFunTalk 导读:前不久,滴滴ES团队将维护的30多个ES集群,3500多个ES节点,8PB的数据,从2.3.3跨大版本无缝升 ...

最新文章

  1. Java Web 项目配置 环境搭建 如何安装jdk jre
  2. ScrollView 嵌套 ListView 只显示第一行的源码分析
  3. 【PHPWord】插入Excel对象
  4. CSS3的过渡和动画
  5. e站app改内置hosts_e-Mobile安卓下载-e
  6. Vue常用指令v-show
  7. 使用PHP处理POST上传时$_FILES数组为何为空
  8. java 并行 执行进度_关于java:Java8流的顺序执行和并行执行产生不同的结果?
  9. oracle group by用法_从OceanBase TPCC测试报告看ORACLE兼容性进展
  10. Sqlite数据库相关
  11. MFC不能多线程操作控件的原因
  12. 基于JAVA+SpringMVC+Mybatis+MYSQL的医院在线预约挂号系统
  13. linxu 获取指定字符的前后多少行
  14. jq+html+css 实现简易版网易云音乐
  15. 在线教育网校系统源码,搭建可以解决培训考试的教学平台
  16. 抖音小程序微信支付php,抖音头条小程序微信支付开通绑定最全教程!
  17. 【JavaScript】DOM编程-DHTML与Windows对象
  18. 认识中药(4)--陈皮
  19. YDLIDAR G4雷达的unity使用相关+北阳雷达
  20. 分布式任务调度平台之 xxl-job配置部署

热门文章

  1. tomato(番茄)固件的简单设置截图
  2. 2.3 WSN的MAC协议
  3. 离线语音识别与语音转写初探
  4. Python 局域网扫描存活主机开放端口
  5. 三角函数公式和图像大全
  6. SimNow仿真交易【官方环境介绍】 期货仿真环境地址 期货模拟交易
  7. SQL 2008安装时反复提示重启和安装.net framework 3.5
  8. ISIS协议(华为面试)
  9. HTML-CSS常用元素居中对齐方法
  10. 计算机视觉的发展历程