开发者学堂课程【数据湖 JindoFS + OSS 实操干货36讲:数据无忧利用 checksum 迁移 HDFS 数据到 0SS】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/833/detail/13962
数据无忧利用 checksum 迁移 HDFS 数据到 0SS
内容介绍
一、简述
二、Checksum 技术科普
三、DistCp 技术解密
四、Jindo DistCp 操作实战
一、简述
1.DistCp & Jindo DistCp
(1)DistCp (分布式拷贝)是用于大规模集群内部和集群之间拷贝数据的工具。使用Map/Reduce实现文件分发, 错误处理和恢复,以及报告生成。
(2)Jindo DistCp,则是基于JindoFS SDK的阿里云数据迁移工具。JindoDistCp由阿里云E-MapReduce团队开发,目前支持HDFS/OSS/S3之间的数据拷贝场景,提供多种个性化拷贝参数和多种拷贝策略。
重点优化HDFS到OSS的数据拷贝,通过定制化CopyCommitter,实现NO- Rename拷贝,并保证数据拷贝落地的完整性、一致性。
(3)Jindo DistCp具体文档,参见
https://github.com/aliyn/alibabacloud-jindofs/tree/master/docs/indo_distcp
2.数据迁移场景中的 Checksum
(1)大数据迁移使用场景:迁移后完整性校验、差异比对/增量拷贝。
(2)完整性校验的场景,特别是异构存储介质间的迁移场景。由于异构存储介质间,默认的数据校验方式往往无法通用。
现有的方案往往只能跳过数据完整性校验,这使得在迁移出现问题时无法及时发现。
(3)现有的增量拷贝方案中,开源的 Hadoop DistCp 和 S3 DistCp 也会做差异比较,在异构存储介质间只能对文件名,文件大小做比较,不能真实反应源文件和目标文件是完全否一致。
哪怕在同构存储介质间,在做差异比较时,往往也需要将目标存储介质的数据重新读取,并计算一次校验和。
二、Checksum 技术科普
1.数据校验和,可用于差错检测和完整性校验,
常见的算法有:
●奇偶校验——奇偶校验介绍:奇偶校验是最简单的校验算法。
具体做法是,在原始数据外,新增一位奇偶校验位。
奇偶校验位有两种类型:
以偶校验位来说,如果一组给定数据位中1的个数是奇数,补一个bit为1,使得总的1的个数是偶数。
例: 0000001,补一个bit为1,0000011.
以奇校验位来说,如果给定一组数据位中1的个数是奇数,补一个bit为0,使得总的1的个数是奇数。
例: 000001,补一个bit为0,00000010。
●MD5
●SHA-1
●SHA-256
●SHA-512
●CRC32
●CRC64
2.数据摘要算法
●MD5、SHA-1、SHA-256、SHA-512都是数据摘要算法,均被广泛作为密码的散列函数。
●但由于MD5、SHA-1已经被证明为不安全的算法,目前建议使用较新的SHA-256和SHA-512。
●所有算法的输入均可以是不定长的数据。MD5输出是16字节(128位),SHA-1输 出为20字节(160位) ,SHA-256为32字节(256位), SHA- 512为64字节(512位)。
●可以看到,SHA算法的输出长度更长,因此更难发生碰撞,数据也更为安全。但运算速度与MD5 相比,也更慢。
3.循环冗余校验
●循环冗余校验又称CRC (Cyclic redundancy check),将待发送的比特串看做是系数为0或者1的多项式。
● M= 1001010
●M(x)= 1*x^6+ 0*x^5 + 0*x^4 + 1*x^3 +0*x^2 +1*x^1 + 0*x^0
●M(x)= x^6 + x^3+ x
●CRC 编码时,发送方和接收方必须预先商定一个生成多项式G(x)。
●发送方将比特串和生成多项式G(x)进行运算得到校验码,在比特串尾附加校验码,使得带校验码的比特串的多项式能被G(x)整除。接收方接收到后,除以G(x),若有余数,则传输有错。
4.CRC 的优缺点
●CRC 算法的优点是算法实现相对简单、运算速度较快。而且错误检错能力很强,因此被广泛应用于通信数据校验。
●缺点是输出长度较短,容易被伪造,碰撞率高。
●性能参考: CRC32 > CRC64 > MD5> SHA-1 > SHA-512 > SHA-256
●BenchmarkMD5_ 100MB-8 6 175423280 ns/op
●BenchmarkSHA1 100MB-8 7 176478051 ns/op
●BenchmarkSHA256 100MB-8 3 344191216 ns/op
●BenchmarkSHA512 _100MB-8 5 226938072 ns/op
●BenchmarkCRC32IEEE _100MB-8 117 10500107 ns/op
●BenchmarkCRC32Castagnoli_ 100MB-8 98 12991050 ns/op
●BenchmarkCRC64 100MB-8 13 86377178 ns/op
三、DistCp 技术解密
1.Hadoop DistCp
●默认Checksum 算法: CRC32
●跳过Checksum 校验的参数: -skipcrccheck
●差异比较 :直接调用参数-diff
●增量拷贝:直接调用参数-update
●Hadoop3.1.1以上版本,支持了全新组合式 CRC 文件 Checksum.让,Hadoop实现与外部存储系统一致的CRC算法, 以满足 HDFS 和其他外部存储系统进行差异对比。
但该方案有以下缺点:源存储介质和目标存储介质必须使用相同的 Checksum算法,如果是往云上迁移,往往只能改变源端私有化存储介质的 Checksum 算法,去适配目标介质,有一定改造成本。
2.Hadoop Checksum 详解
HDFS如何处理文件校验和
HDFS使用 CRC32C,后者是一种基于 Castagno 多项式的32位循环冗余校验码(CRC)。
用于在不同环境中保持数据完整:
●对于静态数据,Hadoop DataNodes不断根据存储的CRC来验证数据,以检测和修复位衰减。
●对于传输中的数据,DataNode发送已知的 CRC 以及相应的批量数据,HDFS客户端库协同计算每个 CRC 分块,井与 DataNode 接收的CRC 进行比较。
●为便于HDFS进行管理,块级校验和用于对 DataNode 上的各个快文件进行低级手动完整性检查。
●对于任息应用展用例,F1leSysten 接口定义了getFileChecksum, HDFS 实现使用其存储的细粒度CRC来定义文件级校验和。
对于大多数日常使用而言,CRC 在应用层中是透明使用的。唯-使用的CRC是CRC32C分块,它们已经预先计算并与块数据一起存储在元数据文件中。分块的大小由dfs .bytes-per-checksum定义,默认值为512字节。
https://cloud.qoogle com/architecture/hadop/validating-data-transfers?hl=zh-cn
3.Hadoop 默认文件校验和类型的缺点
默认情况下,在使用 Hadoop 时,所有面向 API 的校验和均采 用 CRC32C 分块级联的 MDS 形式,要么在块级通过低级 DataTransferProtocol 实现,要么在文件级过高级 FileSyotem 接口实现。
文件级校验和定义为所有块级校验和级联的 MD5 码,其中每个块级校验和是CRC分块级联的 MD5 码,因此被称为MDSNDSCRC32FleChecksum.这实际上是一种按需的三层 Merdle 树。
文件级校验和的这种定义对 HDFS 的实现及其具体数据布局很敏感,即分块大小(默认为512字节)和块大小(默认为128MB)。因此,这种默认文件校验和不适用于以下任何情况:
●HDFS 中相同文件(但每个文件的块大小配置不同)的两个不同副本。
●配置了不同块或分块大小的两个不同 HDFS 实例。
●HDFS 和非 HDFS 兼容Hadoop文件系统 (HCFS )的组合,例如Cloud Storage.
下图演示了采用不同文件系统配置的同一文件如何生成不同的校验和:
https//cloud qoogle com/architecture/hadoop/validating-data transfers?hl=zh-cn
4.Hadoop 全新组合式 CRC 文件校验和的工作原理
ApcheHadop1.1发布了个新的校验和类型以解决上述缺点。该类型反映在HDFS-13056中。
dfs.checksum.combine.made-COPOSITE_CRC 配置的新类型将金新的合式块线CRC和维合式文件投 CRC 定义为计对已存储分快 CRC 的数学组合式 CRC,使用此类型普换使用组合式 CRC 的 MD 5码。可以计算代表整个块或文件的单个 CRC,直其控立于分快CRC 的较低级粒度。
CRC 组合具有许多优势:效事高;允许生成的校验和与分块或块完全无关;允许对分得文件和复制文件、不同HDFS实机以及HOFS私其他外部存储系模进行惹异对比。(如需详拒了解 CRC 算法,请点击PDF下载。)
使用全新的组合式CRC校验和类型,如需在 Hadoop 中使用全新的组合式 CRC 校验和类型。
请将 dfs.checksum.combine.mode 属性设置为
CORPOSITLCRC (而不是默认值MDSRDSCRC) ,将文件从一个位置复看到另一个位置时,分块级校验和类型
(即dfs.checksum.type属性款认为 CRC32C)也必须在这两个位置匹配。
5.S3 DistCp
●默认 Checksum 算法: MD5
●不支持扩展 Checksum
●不支持差异比较功能
●不支持一键增量拷贝功能经
●拷贝结束时,在 -outputManifest 参数指定的路径下生成 Manifes 文件。
●下次拷贝时,指定 -previousManifest 参数,获取 Manifest 中的差 异文件列表来实现增量拷贝。
●其他云厂商
●同样不支持一键增量拷贝功能。
●差异比较时,往往需要拉取源文件重复计算 Checksum。
6.Jindo DistCp
●Checksum 算法:默认 CRC32, 支持 CRC64
●Checksum 相关的参数:默认开启,禁用参数-disableChecksum
●差异比对,增量拷贝方式与Hadoop社区对齐:
●--diff :指定为差异比较模式。
●--update :指定为增量Copy模式。
默认先比较是否存在,再比较文件大小,最后比较文件 Checksum。
●如果不希望比较文件 Checksum,可以通过增加- disableChecksum 参数来关闭,即只比较文件名和文件大小。
●差异比较/增量比较时不重复计算。
四、Jindo DistCp 操作实战
1.Jindo DistCp 操作实战
●下载
●执行命令
●hadoop jar jindo-distcp-3.5.0.jar --src /user/root/random-data --dest oss://yanbin-hd2-test/distcp/ --parallelism 10
●-src : hdfs的源路径
●--dest : oss 的目标路径
●--ossKey : oss 的AccessKey
●--ossSecret : oss 的AccessSecret
● --ossEndPoint : oss 的 endpoint 信息, 可以公网或者内网的 endpoint
●-- pallelism :任务并发大小,根据集群资源可调整。
2.Jindo DistCp 高阶使用实战
●禁用 Checksum
●hadoop jar jind-distcp-3.5.0.jar --src /user/root/random-data --dest oss://yanbinhd2-test/distcp/--parallelism 10 --disableChecksum
●增量拷贝
● hadoop jar jindo-distcp-3.5.0.jar --src /user/root/random-data --dest oss://yanbin-hd2-test/distcp/ --parallelism 10 --update
●差异比较时,启用 CMS 警告
●export cmsAccessKeyld=
●export cmsAccessSecret=
●export cmsRegion=cn-shanghai
●export cmsToken=
●export cmsLevel=WARN
●hadoop jar jindo-distcp-3.5.0.jar --src /use/root/random-data --dest oss://yanbinhd2-test/distcp/ --diff --enableCMS