COSDistcp 工具

最后更新时间:2021-01-20 15:16:41

    功能说明

    COSDistCp 是一款基于 MapReduce 的分布式文件拷贝工具,主要用于 HDFS 和 COS 之间的数据拷贝,COSDistCp 提供文件过滤、压缩和文件聚合、读取带宽限制、文件属性保留等实用拷贝功能,同时基于 COS 支持的特性,COSDistCp 工具还可提供基于长度、CRC 校验和的增量拷贝和实时检验功能。

    使用环境

    系统环境

    支持 Linux 系统。

    软件依赖

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

    下载与安装

    获取 COSDistCp jar 包

    下载 cos-distcp-1.2.jar 包

    说明:

    用户可根据 jar 包的 MD5 校验值 确认下载的 jar 包是否完整。

    安装说明

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

    原理说明

    COSDistCp 基于 MapReduce 框架实现,在 Mapper 中对文件进行分组,在 Reducer 进程中使用多线程对文件进行拷贝、压缩、数据校验和文件属性保留等工作。当文件迁移或校验失败的时候,任务可能会执行失败。当您的源文件系统有文件新增或文件内容发生变化时,您可通过 skipMode 和 diffMode 模式,通过对比文件的长度或 CRC 校验值,实现文件的增量迁移。

    参数说明

    您可使用命令 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 解释
    --reducerNumber=VALUE 指定 reducer 进程数目
    示例:--reducerNumber=10
    10
    --workerNumber=VALUE 指定每个 reducer 中的拷贝线程数,COSDistCp 在每个 reducer 中创建该参数大小的拷贝线程池
    示例:--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
    keep
    --deleteOnSuccess 指定源文件拷贝到目标目录成功时,立即删除源文件
    示例:--deleteOnSuccess
    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-checksum(长度 + CRC 值)
    示例:--skipMode=length
    none
    --checkMode=MODE 当文件拷贝完成的时候,校验源文件和目标文件是否相同,不同则停止拷贝,可选none(不校验)、 length (长度)、checksum(CRC值)和 length-checksum(长度 + CRC 值)
    示例:--checkMode=length-checksum
    none
    --diffMode=MODE 指定获取差异文件列表的准则,可选 length (长度)、checksum(CRC值)和 length-checksum(长度 + CRC 值)
    示例:--diffMode=length-checksum
    --diffOutput=LOCATION 指定差异文件列表的输出目录,该输出目录必须为空
    示例:--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

    使用示例

    查看 help 选项

    以参数--help执行命令,查看 COSDistCp 支持的参数,示例如下:

    hadoop jar cos-distcp-${version}.jar --help

    以上命令中, ${version} 为 COSDistCp 版本号,例如 1.0 版本的 COSDistCp jar 包名为 cos-distcp-1.0.jar。

    指定待迁移文件的源目录和目标目录

    以参数--src--dest执行命令,示例如下:

    hadoop jar cos-distcp-${version}.jar --src /data/warehouse --dest cosn://examplebucket-1250000000/data/warehouse

    对输入文件进行正则表达式过滤

    以参数--srcPattern执行命令,只同步 /data/warehouse/logs 目录下,以 .log 结尾的日志文件,示例如下:

    hadoop jar cos-distcp-${version}.jar  --src /data/warehouse/logs --dest cosn://examplebucket-1250000000/data/warehouse --srcPattern='.*/logs/.*\.log'

    指定 reducer 数目以及每个 reducer 进程内拷贝线程数

    以参数--reducerNumber--workersNumber执行命令,COSDistCp 采用多进程+多线程的拷贝架构,您可以:

    • 通过 --reducerNumber 指定 reducer 进程数目
    • 通过 --workerNumber 指定每个 reducer 内的拷贝线程数
    hadoop jar cos-distcp-${version}.jar --src /data/warehouse/ --dest cosn://examplebucket-1250000000/data/warehouse --reducerNumber=10 --workerNumber=5

    删除源文件

    以参数--deleteOnSuccess执行命令,将 /data/warehouse目录下文件从 HDFS 同步到 COS 后,立即删除源目录中的对应文件:

    hadoop jar cos-distcp-${version}.jar --src /data/warehouse --dest cosn://examplebucket-1250000000/data/warehouse --deleteOnSuccess

    注意:

    指定该选项后每迁移完一个文件,立即删除对应的源文件,并非整个迁移完成后,再删除源文件,请谨慎使用。

    限制单文件读取带宽

    以参数--bandWidth执行命令,数值单位为MB。限制每个迁移文件的读取带宽为 10MB/s,示例如下:

    hadoop jar cos-distcp-${version}.jar  --src /data/warehouse --dest cosn://examplebucket-1250000000/data/warehouse --bandWidth=10

    指定 Hadoop-COS 的文件检验和类型

    以参数--cosChecksumType执行命令,默认 CRC32C,可选 CRC32C 和 CRC64。

    hadoop jar cos-distcp-${version}.jar  --src /data/warehouse --dest cosn://examplebucket-1250000000/data/warehouse --cosChecksumType=CRC32C

    跳过具有相同长度的文件

    以参数--skipMode执行命令。跳过具有源和目标具有相同长度文件的拷贝:

    hadoop jar cos-distcp-${version}.jar  --src /data/warehouse --dest cosn://examplebucket-1250000000/data/warehouse  --skipMode=length

    --skipMode选项用于在拷贝文件前,校验源文件和目标文件是否相同,若相同则跳过,可选 none(不校验)、length(长度)、checksum(CRC 值)和 length-checksum(长度 + CRC 值)。

    如果源和目标文件系统的校验和算法不同,则会读取源端文件计算新的校验和。如果您的源是 HDFS,您可以通过如下方式,确定 HDFS 源是否支持 COMPOSITE-CRC32C 校验算法:

    hadoop fs  -Ddfs.checksum.combine.mode=COMPOSITE_CRC -checksum /data/test.txt
    /data/test.txt  COMPOSITE-CRC32C        6a732798

    校验源文件和目标文件是否具有相同 CRC

    以参数--checkMode执行命令,文件拷贝完成时,校验源文件和目标文件校验和是否一致。

    从非 COS 文件系统同步到 COS 时,如果源的 CRC 算法和 Hadoop-COS 的 CRC 算法不一致,则拷贝时计算 CRC,并在拷贝完成后,获取目标 COS 文件的 CRC,和计算得到的源文件 CRC 对比校验:

    hadoop jar cos-distcp-${version}.jar   --src /data/warehouse --dest cosn://examplebucket-1250000000/data/warehouse --checkMode=checksum

    指定目标文件的压缩类型

    以参数--outputCodec执行命令,您可通过该参数,将 HDFS 中的数据实时压缩备份到 COS,节省存储成本。参数可选值为:keep、none、gzip、lzop、snappy,none 选项保存的目标文件为未压缩状态,keep 保持原来文件的压缩状态。示例如下:

    hadoop jar cos-distcp-${version}.jar --src /data/warehouse/logs --dest cosn://examplebucket-1250000000/data/warehouse/logs-gzip --outputCodec=gzip

    注意:

    其中除 keep 选项外,皆会先对文件先解压,随后转换为目标压缩类型,因此,除 keep 选项外,可能会由于压缩参数等不一致,导致目标文件和源文件不一致,但解压后的文件一致。

    多目录同步

    新建一个本地文件(例如 srcPrefixes.txt),在该文件中添加需要迁移的多个目录,添加之后,可通过 cat 命令查看,示例如下:

    cat srcPrefixes.txt 
    /data/warehouse/20181121/
    /data/warehouse/20181122/

    使用 --srcPrefixesFile 参数指定该文件,执行迁移命令:

    hadoop jar  cos-distcp-${version}.jar --src /data/warehouse  --srcPrefixesFile file:///usr/local/service/hadoop/srcPrefixes.txt --dest  cosn://examplebucket-1250000000/data/warehouse/ --reducerNumber=20

    生成目标清单文件和指定上一次清单输出文件

    以参数--outputManifest--previousManifest执行命令。

    • --outputManifest 该选项首先会在本地生成一个 gzip 压缩的 manifest.gz,并在迁移成功时,移动到 --dest 所指定的目录下。
    • --previousManifest 指定上一次 --outputManifest 输出文件,COSDistCp 会跳过相同长度大小的文件:
    hadoop jar cos-distcp-${version}.jar --src /data/warehouse --dest  cosn://examplebucket-1250000000/data/warehouse/ --outputManifest=manifest.gz --previousManifest= cosn://examplebucket-1250000000/data/warehouse/manifest-2020-01-10.gz

    注意:

    上述命令的增量迁移,只能同步文件大小变化的文件,无法同步文件内容发生变化的文件。如果文件内容可能发生变化,请参考 --diffMode 使用示例,根据文件的 CRC 确定文件发生变化的文件列表。

    根据 CRC 获取差异文件列表和增量迁移

    以参数--diffMode--diffOutput执行命令:

    • --diffMode 可选值为 length 和 length-checksum。
      • --diffMode=length表示根据文件大小是否相同,获取差异文件列表。
      • --diffMode=length-checksum,根据文件大小和 CRC 检验和是否相同,获取差异文件列表。
    • --diffOutput 指定 diff 操作的输出目录。

    以下示例中,根据文件大小和 CRC 值校验源和目标文件是否相同, 指定 mapred.max.split.size 为 100KB:

    hadoop jar cos-distcp-${version}.jar -Dmapred.max.split.size=102400  --src /data/warehouse --dest cosn://examplebucket-1250000000/data/warehouse/ --diffMode=length-checksum --diffOutput=/tmp/diff-output

    注意:

    如果目标文件系统为 COS,且源文件系统的 CRC 算法与之不同,则 COSDistCp 会拉取源文件计算新的 CRC,以进行相同 CRC 算法值的对比。

    以上命令执行成功后,会在 HDFS 的 /tmp/diff-output 目录下,生成差异文件列表,以下类型的源文件信息包含在输出中:

    1. 源文件系统存在,目标文件系统不存在
    2. 源文件系统和目标文件系统大小不同
    3. 源文件系统和目标文件系统 CRC 算法或值不同

    您可以通过如下命令,合并差异文件列表:

    hadoop fs -getmerge /tmp/diff-output diff-manifest
    gzip diff-manifest

    执行如下命令,根据差异文件列表进行增量迁移:

    hadoop  jar cos-distcp-${version}.jar --reducerNumber=20 --src /data/warehouse --dest cosn://examplebucket-1250000000/data/warehouse/ --previousManifest=file:///usr/local/service/hadoop/diff-manifest.gz –copyFromManifest

    指定 COS 文件的存储类型

    以参数--storageClass执行命令,示例如下:

    hadoop jar cos-distcp-${version}.jar --src /data/warehouse --dest cosn://examplebucket-1250000000/data/warehouse/ --outputManifest=manifest-2020-01-10.gz --storageClass=STANDARD_IA

    拷贝文件的元信息

    以参数--preserveStatus执行命令,将源文件或源目录的 user、group、permission 和 timestamps(modification time 和 access time)拷贝到目标文件或目标目录,示例如下:

    hadoop jar cos-distcp-${version}.jar --src /data/warehouse --dest cosn://examplebucket-1250000000/data/warehouse/ --preserveStatus=ugpt

    Was this page helpful?

    本页内容是否解决了您的问题?

    • 完全没帮助
    • 文档较差
    • 文档一般
    • 文档不错
    • 文档很好
    反馈
    帮助