> 文章列表 > 【Hadoop-CosDistcp】通过CosDistcp的方式迁移Cos中的数据至HDFS

【Hadoop-CosDistcp】通过CosDistcp的方式迁移Cos中的数据至HDFS

【Hadoop-CosDistcp】通过CosDistcp的方式迁移Cos中的数据至HDFS

【Hadoop-CosDistcp】通过CosDistcp的方式迁移Cos中的数据至HDFS

  • 1)功能说明
  • 2)使用环境
  • 3)下载与安装
  • 4)原理说明
  • 5)参数说明
  • 6)使用示例
  • 7)迁移 Cos 中的数据至 HDFS 及数据校验
    • 7.1.数据迁移
    • 7.2.数据校验
    • 7.3.数据补充
    • 7.4.总结

1)功能说明

COSDistCp 是一款基于 MapReduce 的分布式文件拷贝工具,主要用于 HDFS 和 COS 之间的数据拷贝,它主要具有以下功能点:

  • 根据长度、CRC 校验和,进行文件的增量迁移、数据校验
  • 对源目录中的文件进行正则表达式过滤
  • 对源目录中的文件进行解压缩 ,并转换为预期的压缩格式
  • 基于正则表达式,对文本文件进行聚合
  • 保留源文件和源目录的用户、组、扩展属性和时间
  • 配置告警和 Prometheus 监控
  • 统计文件大小分布
  • 对读取带宽进行限速

2)使用环境

(1)系统环境:

支持 Linux 系统。

(2)软件依赖:

Hadoop-2.6.0及以上版本、Hadoop-COS 插件 5.9.3 及以上版本。

3)下载与安装

(1)获取 COSDistCp jar 包

Hadoop 2.x 用户可下载 cos-distcp-1.13-2.8.5.jar 包,根据 jar 包的 MD5 校验值 确认下载的 jar 包是否完整。

Hadoop 3.x 用户可下载 cos-distcp-1.13-3.1.0.jar 包,根据 jar 包的 MD5 校验值 确认下载的 jar 包是否完整。

下载地址https://cloud.tencent.com/document/product/436/50272

【Hadoop-CosDistcp】通过CosDistcp的方式迁移Cos中的数据至HDFS

(2)安装说明

在 Hadoop 环境下,安装 Hadoop-COS 后,即可直接运行 COSDistCp 工具

对于环境中未安装和配置 Hadoop-COS 插件的用户,根据 Hadoop 版本,下载对应版本的 COSDistCp jar、Hadoop-COS jar 和 cos_api-bundle jar 包后(相关 jar 包下载地址见上文),指定 Hadoop-COS 相关参数执行拷贝任务,其中 jar 包地址需填本地 jar 所在地址:

hadoop jar cos-distcp-${version}.jar \\
-libjars cos_api-bundle-${version}.jar,hadoop-cos-${version}.jar \\
-Dfs.cosn.credentials.provider=org.apache.hadoop.fs.auth.SimpleCredentialProvider \\
-Dfs.cosn.userinfo.secretId=COS_SECRETID \\
-Dfs.cosn.userinfo.secretKey=COS_SECRETKEY \\
-Dfs.cosn.bucket.region=ap-guangzhou \\
-Dfs.cosn.impl=org.apache.hadoop.fs.CosFileSystem \\
-Dfs.AbstractFileSystem.cosn.impl=org.apache.hadoop.fs.CosN \\
--src /data/warehouse \\
--dest cosn://examplebucket-1250000000/warehouse

下载地址https://cloud.tencent.com/document/product/436/6884

【Hadoop-CosDistcp】通过CosDistcp的方式迁移Cos中的数据至HDFS

4)原理说明

COSDistCp 基于 MapReduce 框架实现,为多进程+多线程的架构,可以对文件进行拷贝、数据校验、压缩、文件属性保留以及拷贝重试等工作。COSDistCp 默认会覆盖目标端已经存在的同名文件,当文件迁移或校验失败的时候,对应的文件会拷贝失败,并会在临时目录下记录迁移失败的文件信息。当您的源目录有文件新增或文件内容发生变化时,您可通过 skipModediffMode 模式,通过对比文件的长度或 CRC 校验值,进行数据校验和进行文件的增量迁移

5)参数说明

您可在hadoop用户下,使用命令 hadoop jar cos-distcp-version.jar --help 查看 COSDistCp 支持的参数选项,其中 version 为版本号,以下为当前版本 COSDistCp 的参数说明:

属性键 说明 默认值 是否必填
–help 输出 COSDistCp 支持的参数选项 示例:–help
–src=LOCATION 指定拷贝的源目录,可以是 HDFS 或者 COS 路径 示例:–src=hdfs://user/logs/
–dest=LOCATION 指定拷贝的目标目录,可以是 HDFS 或者 COS 路径 示例:–dest=cosn://examplebucket-1250000000/user/logs
–srcPattern=PATTERN 指定正则表达式对源目录中的文件进行过滤 示例:--srcPattern='.*\\.log$' 注意:您需要将参数使用单引号包围,以避免符号\\*被 shell 解释
–taskNumber=VALUE 指定拷贝进程数,示例:–taskNumber=10 10
–workerNumber=VALUE 指定拷贝线程数,COSDistCp 在每个拷贝进程中创建该参数大小的拷贝线程池 示例:–workerNumber=4 4
–filesPerMapper=VALUE 指定每个 Mapper 输入文件的行数 示例:–filesPerMapper=10000 500000
–groupBy=PATTERN 指定正则表达式对文本文件进行聚合 示例:–groupBy=‘.group-input/(\\d+)-(\\d+).
–targetSize=VALUE 指定目标文件的大小,单位:MB,与 --groupBy 一起使用 示例:–targetSize=10
–outputCodec=VALUE 指定输出文件的压缩方式,可选 gzip、lzo、snappy、none 和 keep,其中: 1. keep 保持原有文件的压缩方式 2. none 则根据文件后缀对文件进行解压, 示例:–outputCodec=gzip 注意:如果存在文件 /dir/test.gzip 和 /dir/test.gz,指定输出格式为 lzo,最终只会保留一个文件 /dir/test.lzo keep
–deleteOnSuccess 指定源文件拷贝到目标目录成功时,立即删除源文件 示例:–deleteOnSuccess, 注意:1.7 及以上版本不再提供该参数,建议数据迁移成功并使用 --diffMode 校验后,再删除源文件系统的数据 false
–multipartUploadChunkSize=VALUE 指定 Hadoop-COS 插件传输文件到 COS 时分块的大小,COS 支持的最大分块数为 10000,您可根据文件大小,调整分块大小,单位:MB,默认为8MB 示例:–multipartUploadChunkSize=20 8MB
–cosServerSideEncryption 指定文件上传到 COS 时,使用 SSE-COS 作为加解密算法 示例:–cosServerSideEncryption false
–outputManifest=VALUE 指定拷贝完成的时候,在目标目录下生成本次拷贝的目标文件信息列表(GZIP 压缩) 示例:–outputManifest=manifest.gz
–requirePreviousManifest 要求指定 --previousManifest=VALUE 参数,以进行增量拷贝 示例:–requirePreviousManifest false
–previousManifest=LOCATION 前一次拷贝生成的目标文件信息 示例:–previousManifest=cosn://examplebucket-1250000000/big-data/manifest.gz
–copyFromManifest 和 --previousManifest=LOCATION 一起使用,可将 --previousManifest 中的文件,拷贝到目标文件系统 示例:–copyFromManifest false
–storageClass=VALUE 指定对象存储类型,可选值为 STANDARD、STANDARD_IA、ARCHIVE、DEEP_ARCHIVE、INTELLIGENT_TIERING,关于更多支持的存储类型和介绍,请参见 存储类型概述
–srcPrefixesFile=LOCATION 指定本地文件,该文件中每行包含一个需要拷贝的源目录 示例:–srcPrefixesFile=file:///data/migrate-folders.txt
–skipMode=MODE 拷贝文件前,校验源文件和目标文件是否相同,相同则跳过,可选 none(不校验)、length (长度)、checksum(CRC值)、length-mtime(长度+mtime值)和 length-checksum(长度 + CRC 值) 示例:–skipMode=length length-checksum
–checkMode=MODE 当文件拷贝完成的时候,校验源文件和目标文件是否相同,可选 none(不校验)、 length (长度)、checksum(CRC值)、length-mtime(长度+mtime值)和 length-checksum(长度 + CRC 值) 示例:–checkMode=length-checksum length-checksum
–diffMode=MODE 指定获取源和目的目录的差异文件列表,可选 length (长度)、checksum(CRC 值)、length-mtime(长度+mtime值)和 length-checksum(长度 + CRC 值) 示例:–diffMode=length-checksum
–diffOutput=LOCATION 指定 diffMode 的 HDFS 输出目录,该输出目录必须为空 示例:–diffOutput=/diff-output
–cosChecksumType=TYPE 指定 Hadoop-COS 插件使用的 CRC 算法,可选值为 CRC32C 和 CRC64 示例:–cosChecksumType=CRC32C CRC32C
–preserveStatus=VALUE 指定是否将源文件的 user、group、permission、xattr 和 timestamps 元信息拷贝到目标文件,可选值为 ugpxt(即为 user、group、permission、xattr 和 timestamps 的英文首字母) 示例:–preserveStatus=ugpt
–ignoreSrcMiss 忽略存在于文件清单中,但拷贝时不存在的文件 false
–promGatewayAddress=VALUE 指定 MapReduce 任务运行的 Counter 数据推送到的 Prometheus PushGateway 的地址和端口
–promGatewayDeleteOnFinish=VALUE 指定任务完成时,删除 Prometheus PushGateway 中 JobName 的指标集合 示例:–promGatewayDeleteOnFinish=true true
–promGatewayJobName=VALUE 指定上报给 Prometheus PushGateway 的 JobName 示例:–promGatewayJobName=cos-distcp-hive-backup
–promCollectInterval=VALUE 指定收集 MapReduce 任务 Counter 信息的间隔,单位:ms 示例:–promCollectInterval=5000 5000
–promPort=VALUE 指定将 Prometheus 指标暴露给外部的 Server 端口 示例:–promPort=9028
–enableDynamicStrategy 指定开启任务动态分配策略,使迁移速度快的任务迁移更多的文件。 注意:该模式存在一定局限性,例如任务计数器在进程异常的情况下计数不准确,请迁移完成后用 --diffMode 进行数据校验 示例:–enableDynamicStrategy false
–splitRatio=VALUE 指定 Dynamic Strategy 的切分比例,splitRatio 值越大,则任务粒度越小 示例:–splitRatio=8 8
–localTemp=VALUE 指定 Dynamic Strategy 生成的任务信息文件所在的本地文件夹 示例:–localTemp=/tmp /tmp
–taskFilesCopyThreadNum=VALUE 指定 Dynamic Strategy 任务信息文件拷贝到 HDFS 上的并发度 示例:–taskFilesCopyThreadNum=32 32
–statsRange=VALUE 指定统计的区间范围 示例:—statsRange=0,1mb,10mb,100mb,1gb,10gb,inf 0,1mb,10mb,100mb,1gb,10gb,inf
–printStatsOnly 只统计待迁移文件大小的分布信息,不迁移数据 示例:–printStatsOnly
–bandWidth 限制读取每个迁移文件的带宽,单位为:MB/s,默认-1,不限制读取带宽。 示例:–bandWidth=10
–jobName 指定迁移任务的名称。 示例:–jobName=cosdistcp-to-warehouse
–compareWithCompatibleSuffix 使用 --skipMode 和 --diffMode 参数时,是否将源文件的后缀 gzip 转换为 gz,lzop 文件后缀转换为 lzo,进行判断。 示例:–compareWithCompatibleSuffix
–delete 保证源目录和目标目录文件的一致性,将源目录中没有而目标目录中有的文件,移动到独立的 trash 目录下,同时生成文件清单。 注意:不能同时使用 --diffMode 参数
–deleteOutput 指定 delete 的 HDFS 输出目录,该目录必须为空 示例: --deleteOutput=/dele-output

6)使用示例

使用实例较多,这里就不一一说明了,详情可以参考官方文档:https://cloud.tencent.com/document/product/436/50272

【Hadoop-CosDistcp】通过CosDistcp的方式迁移Cos中的数据至HDFS

7)迁移 Cos 中的数据至 HDFS 及数据校验

在企业中进行大规模数据量的迁移,会涉及到很多原因,比如资源队列,网络带宽,任务名称,数据校验,补充差异数据等操作。

  • 网络带宽决定数据的传输速度,如果任务较多的情况下不能让一个任务占用过多带宽,需要合理分配网络资源

  • 数据校验决定数据的准确性,所以对差异数据进行补充也至关重要

下面我将以企业中PB级别的数据迁移为例,进行相关举例演示。

7.1.数据迁移

参数说明

  • -Dmapred.job.queue.name队列名称

  • -bandWidth带宽(每秒的传输速度,单位为M),默认为-1(不限制)

  • jobName在 yarn 上显示的任务名称

yarn jar /opt/corns/cos-distcp-1.12-3.1.0.jar -libjars /opt/corns/cos_api-bundle-5.6.69.jar,/opt/corns/hadoop-cos-3.1.0-8.1.7.jar \\
-Dfs.cosn.credentials.provider=org.apache.hadoop.fs.auth.SimpleCredentialProvider \\
-Dfs.cosn.userinfo.secretId=********************************* \\
-Dfs.cosn.userinfo.secretKey=********************************* \\
-Dfs.cosn.bucket.region=ap-guangzhou \\
-Dfs.cosn.impl=org.apache.hadoop.fs.CosFileSystem \\
-Dfs.AbstractFileSystem.cosn.impl=org.apache.hadoop.fs.CosN \\
-Dmapred.job.queue.name=*** \\
--bandWidth=-1 \\
--jobName=cosdistcp-to-hdfs \\
--src cosn://test-bucekt01/test/ \\
--dest hdfs://nameserver/tmp/test/

7.2.数据校验

参数说明

  • -Dmapred.job.queue.name队列名称

  • -bandWidth带宽(每秒的传输速度,单位为 M),默认为-1(不限制)

  • jobName在 yarn 上显示的任务名称

  • -diffMode数据校验模式(详情参考上面表格)

  • -diffOutput数据校验结果输出到 HDFS 上的目录(输出目录必须为空)

判断数据校验结果

1、如果目录中没有 failed 目录,则数据校验结果为完全一致。

2、如果目录中存在 failed 目录,则进入目录中查看异常数据清单,内容信息如下

① 源和目的文件相同,记录为 SUCCESS

② 目标文件不存在,记录为 DEST_MISS

③ 存在源目录的清单中,但是校验时源文件不存在,记录为 SRC_MISS

④ 源文件和目标文件大小不同,记录为:LENGTH_DIFF

⑤ 源文件和目标文件 CRC 算法值不同,记录为:CHECKSUM_DIFF

⑥ 由于读取权限不够等因素导致 diff 操作失败,记录为:DIFF_FAILED

⑦ 源为目录,目的为文件,记录为:TYPE_DIFF

查看是否有 failed 目录:

【Hadoop-CosDistcp】通过CosDistcp的方式迁移Cos中的数据至HDFS

进入目录查看存在异常数据清单文件:

【Hadoop-CosDistcp】通过CosDistcp的方式迁移Cos中的数据至HDFS

查看异常数据清单文件内容:

【Hadoop-CosDistcp】通过CosDistcp的方式迁移Cos中的数据至HDFS

yarn jar /opt/corns/cos-distcp-1.12-3.1.0.jar -libjars /opt/corns/cos_api-bundle-5.6.69.jar,/opt/corns/hadoop-cos-3.1.0-8.1.7.jar \\
-Dfs.cosn.credentials.provider=org.apache.hadoop.fs.auth.SimpleCredentialProvider \\
-Dfs.cosn.userinfo.secretId=********************************* \\
-Dfs.cosn.userinfo.secretKey=********************************* \\
-Dfs.cosn.bucket.region=ap-guangzhou \\
-Dfs.cosn.impl=org.apache.hadoop.fs.CosFileSystem \\
-Dfs.AbstractFileSystem.cosn.impl=org.apache.hadoop.fs.CosN \\
-Dmapred.job.queue.name=*** \\
--bandWidth=-1 \\
--jobName=cosdistcp-to-hdfs-check \\
--diffMode=length-checksum \\
--diffOutput=/tmp/diff_output \\
--src cosn://test-bucekt01/test/ \\
--dest hdfs://nameserver/tmp/test/

7.3.数据补充

补充数据需要将上面校验结果中的差异数据清单拉取到 Linux 本地(如果有多个文件,可以先进行合并操作),并压缩成 gzip,然后补充命令指定此gzip文件即可完成数据补充。

合并文件到本地
【Hadoop-CosDistcp】通过CosDistcp的方式迁移Cos中的数据至HDFS
压缩文件
【Hadoop-CosDistcp】通过CosDistcp的方式迁移Cos中的数据至HDFS

# 合并文件到 Linux 的/opt/diff_output/中,形成合并后的 diff-manifest文件
hadoop fs -getmerge /tmp/diff_output/failed /opt/diff_output/diff-manifest
# 过滤掉 SRC_MISS 清单信息后压缩成 gzip 文件
grep -v '"comment":"SRC_MISS"' /opt/diff_output/diff-manifest |gzip > /opt/diff_output/diff-manifest.gz

参数说明

  • -Dmapred.job.queue.name队列名称

  • -bandWidth带宽(每秒的传输速度,单位为 M),默认为-1(不限制)

  • jobName在 yarn 上显示的任务名称

  • -previousManifest指定需要补充数据的清单(详情参考上面表格)

  • -copyFromManifest按照清单补充数据(详情参考上面表格)

yarn jar /opt/corns/cos-distcp-1.12-3.1.0.jar -libjars /opt/corns/cos_api-bundle-5.6.69.jar,/opt/corns/hadoop-cos-3.1.0-8.1.7.jar \\
-Dfs.cosn.credentials.provider=org.apache.hadoop.fs.auth.SimpleCredentialProvider \\
-Dfs.cosn.userinfo.secretId=********************************* \\
-Dfs.cosn.userinfo.secretKey=********************************* \\
-Dfs.cosn.bucket.region=ap-guangzhou \\
-Dfs.cosn.impl=org.apache.hadoop.fs.CosFileSystem \\
-Dfs.AbstractFileSystem.cosn.impl=org.apache.hadoop.fs.CosN \\
-Dmapred.job.queue.name=*** \\
--bandWidth=-1 \\
--jobName=cosdistcp-to-hdfs-bc \\
--src cosn://test-bucekt01/test/ \\
--dest hdfs://nameserver/tmp/test/ \\
--previousManifest=file:///opt/diff_output/diff-manifest.gz \\
--copyFromManifest

7.4.总结

1、如果已经迁移过的文件,重新启动程序后不会重复迁移,会继续迁移数据。

2、迁移完成后执行数据校验脚本,会在 HDFS 指定目录下产生校验清单,如果没有 failed 目录,则没有问题,如果有failed目录,此目录下会生成一个或多个文件,里面记录着校验结果

3、将校验的结果文件进行 merge 操作后,会在 Linux 本地生成一个合并后的文件,将合并后的文件过滤 SRC_MISS 后压缩成 .gz 文件

4、执行补充数据的 Shell 命令,指定此压缩文件(指向的压缩文件必须在 Linux 本地,且类型必须为 gzip),即可将未迁移的数据进行补充迁移。