S3DistCp (s3-dist-cp) - Amazon EMR
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

S3DistCp (s3-dist-cp)

Apache DistCp 是一种开源工具,可用于复制大量数据。S3DistCp 是 的扩展,经优化可与 AWS(尤其是 DistCp)结合使用。Amazon S3版本 4.0 及更高版本中的 S3DistCp 命令为 Amazon EMR,您可以将其作为集群或命令行中的步骤添加。s3-dist-cp使用 S3DistCp,您可以将大量数据从 Amazon S3 高效地复制到 HDFS 中,供 Amazon EMR 集群中的后续步骤进行处理。您还可以使用 S3DistCp 在 Amazon S3 存储桶之间或从 HDFS 向 Amazon S3 复制数据。对于跨存储桶和跨 S3DistCp 账户并行复制大量对象,AWS 可扩展性和效率更高。

有关演示 S3DistCP 在实际方案中的灵活性的特定命令,请参阅 大数据博客上的S3DistCp使用 的七个提示AWS。

与 DistCp 相似,S3DistCp 使用 MapReduce 以分布式方式进行复制。它在几个服务器之间共享复制、错误处理、恢复和报告任务。有关 Apache DistCp 开源项目的更多信息,请参阅 Apache Hadoop 文档中的 DistCp 指南

如果 S3DistCp 无法复制部分或全部指定文件,集群步骤将失败,并返回非零错误代码。如果发生这种情况,S3DistCp 不会清理部分复制的文件。

重要

S3DistCp 不支持包含下划线字符的 Amazon S3 存储桶名称。

S3DistCp 不支持连接 Parquet 文件。请改用 PySpark。有关更多信息,请参阅连结 Amazon EMR 中的 Parquet 文件

S3DistCp 选项

调用 S3DistCp 时,您可以指定更改数据复制和压缩方式的选项。下表描述了这些选项。选项是用参数列表添加到步骤的。下表中显示了 S3DistCp 参数的示例。

选项 Description 必填
--src=LOCATION

待复制数据的位置。可以是 HDFS 或 Amazon S3 位置。

示例:--src=s3:///logs/j-3GYXXXXXX9IOJ/node

重要

S3DistCp 不支持包含下划线字符的 Amazon S3 存储桶名称。

--dest=LOCATION

数据的目标位置。可以是 HDFS 或 Amazon S3 位置。

示例:--dest=hdfs:///output

重要

S3DistCp 不支持包含下划线字符的 Amazon S3 存储桶名称。

--srcPattern=PATTERN

一个正则表达式,用于筛选 --src 中数据子集的复制操作。 如果既未指定 --srcPattern,也未指定 --groupBy,则 --src 的所有数据都将复制到 --dest

如果正则表达式参数包含特殊字符,如星号 (*),那么必须将正则表达式或整个 --args 字符串括在单引号 (') 中。

示例:--srcPattern=.*daemons.*-hadoop-.*

--groupBy=PATTERN

一个正则表达式,它使 S3DistCp 连接与表达式匹配的文件。例如,您可以使用此选项把一个小时内写入的所有日志文件组合成为单个文件。已连接文件的文件名是与该分组的正则表达式相匹配的值。

圆括号表明文件应使用的分组方式,与圆括号内的语句匹配的所有项目都组合成单个输出文件。如果正则表达式不包含圆括号内的语句,集群将在 S3DistCp 步骤中失败,并返回错误。

如果正则表达式参数包含特殊字符,如星号 (*),那么必须将正则表达式或整个 --args 字符串括在单引号 (') 中。

如果指定 --groupBy,则仅复制与指定的模式匹配的文件。您不需要同时指定 --groupBy--srcPattern

示例:--groupBy=.*subnetid.*([0-9]+-[0-9]+-[0-9]+-[0-9]+).*

--targetSize=SIZE

要根据 --groupBy 选项创建的文件的大小,以兆字节 (MiB) 为单位。此值必须是整数。设置 --targetSize 后,S3DistCp 将尝试匹配此大小;复制的文件的实际大小可能大于或小于此值。基于数据文件大小聚合任务,因此目标文件大小将可能匹配源数据文件大小。

如果由 --groupBy 连接的文件大于 --targetSize 的值,则将这些文件分解成部分文件,并在末尾附加一个数值按顺序命名。例如,连接成 myfile.gz 的文件将分为几个部分,如下所示: myfile0.gzmyfile1.gz

示例:--targetSize=2

--appendToLastFile

指定将文件从 S3DistCp 复制到已存在的 HDFS 时 Amazon S3 的行为。它向现有文件附加新文件数据。如果将 --appendToLastFile--groupBy 结合使用,则将新数据附加到与相同的组匹配的文件。与 --targetSize 结合使用时,此选项也具有 --groupBy. 行为

--outputCodec=CODEC

指定用于所复制文件的压缩编解码器。这可以采用以下值: gzipgzlzosnappynone。 您可以使用此选项,例如,将使用 Gzip 压缩的输入文件转换为 LZO 压缩的输出文件,或者在复制操作中解压缩文件。如果选择输出编解码器,则系统会在文件名末尾追加适当的扩展名 (例如,对于 gzgzip,将追加扩展名 .gz)。如果不为 --outputCodec 指定值,则复制的文件不会出现压缩方面的变化。

示例:--outputCodec=lzo

--s3ServerSideEncryption

确保目标数据使用 SSL 传输,并在 Amazon S3 中使用 AWS 服务端密钥自动加密。使用 S3DistCp 检索数据时,不会自动取消加密对象。如果尝试将未加密的对象复制到需要加密的 Amazon S3 存储桶,则操作将失败。有关更多信息,请参阅使用数据加密

示例:--s3ServerSideEncryption

--deleteOnSuccess

如果复制操作成功,此选项将导致 S3DistCp 从源位置删除复制的文件。如果您以计划任务的形式将输出文件 (如日志文件) 从一个位置复制到另一个位置,又不想复制两次相同的文件,那么这个选项会非常有用。

示例:--deleteOnSuccess

--disableMultipartUpload

禁用分段上传。

示例:--disableMultipartUpload

--multipartUploadChunkSize=SIZE

分段上传的分段大小,以 MiB 为单位。默认情况下,它在写入 Amazon S3 时使用分段上传。默认区块大小为 16 个 MiB。

示例:--multipartUploadChunkSize=32

--numberFiles

在输出文件之前加上序号。计数从 0 开始,除非 --startingIndex 指定一个不同的值。

示例:--numberFiles

--startingIndex=INDEX

使用 --numberFiles 指定序列中的第一个数字。

示例:--startingIndex=1

--outputManifest=FILENAME

创建一个使用 Gzip 压缩的文本文件,其中包含由 S3DistCp 复制的所有文件的列表。

示例:--outputManifest=manifest-1.gz

--previousManifest=PATH

读取使用 S3DistCp 标记在上次调用 --outputManifest 期间创建的清单文件。设置 --previousManifest 标记后,S3DistCp 将从复制操作中排除清单中列出的文件。如果同时指定 --outputManifest--previousManifest,则之前清单中列出的文件也会出现在新的清单文件中,但不会复制这些文件。

示例:--previousManifest=/usr/bin/manifest-1.gz

--requirePreviousManifest

需要在上次调用 S3DistCp 期间创建的之前清单。 如果此项设置为 false,则未指定之前的清单时不会生成错误。默认值为 true。

--copyFromManifest

反转 --previousManifest 的行为,使 S3DistCp 使用指定的清单文件作为要复制的文件列表,而不是要从复制中排除的文件列表。

示例:--copyFromManifest --previousManifest=/usr/bin/manifest-1.gz

--s3Endpoint=ENDPOINT

指定上传文件时要使用的 Amazon S3 终端节点。此选项会同时设置源位置和目标位置的终端节点。如果未设置,则默认终端节点为 s3.amazonaws.com。 有关 Amazon S3 终端节点的列表,请参阅区域和终端节点

示例:--s3Endpoint=s3-eu-west-1.amazonaws.com.cn

--storageClass=CLASS

目标为 Amazon S3 时要使用的存储类。有效值是 STANDARD 和 REDUCED_REDUNDANCY。如果未指定此选项,S3DistCp 将尝试保留存储类。

示例:--storageClass=STANDARD

--srcPrefixesFile=PATH

Amazon S3 (s3://)、HDFS (hdfs:///) 或本地文件系统 (file:/) 中包含 src 前缀的文本文件(每行一个前缀)。

如果提供了 srcPrefixesFile,S3DistCp 不会列出 src 路径。相反,它将生成一个源列表,以作为列出在此文件中指定的所有前缀的组合结果。与 src 相比较的相对路径 (而不是这些前缀) 将用于生成目标路径。如果还指定了 srcPattern,则会将它应用于源前缀的组合列表结果以进一步筛选输入。如果使用了 copyFromManifest,则会复制清单中的对象并忽略 srcPrefixesFile

示例:--srcPrefixesFile=PATH

除了上述选项外,S3DistCp 实施 Tool interface (工具接口),这意味着它支持通用选项。

将 S3DistCp 作为集群中的步骤添加

您可以通过将 S3DistCp 作为集群中的步骤添加来调用它。可以使用控制台、CLI 或 API 在启动时向集群或是向正在运行的集群添加步骤。以下示例演示如何向正在运行的集群添加 S3DistCp 步骤。有关向集群添加步骤的更多信息,请参阅 https://docs.amazonaws.cn/emr/latest/ManagementGuide/AddingStepstoaJobFlow.html 中的Amazon EMR 管理指南向集群提交工作

使用 S3DistCp 向正在运行的集群添加 AWS CLI 步骤

有关如何在 AWS CLI 中使用 Amazon EMR 命令的更多信息,请参阅 https://docs.amazonaws.cn/cli/latest/reference/emr

  • 要向集群添加调用 S3DistCp 的步骤,请将指定 S3DistCp 应如何执行复制操作的参数作为参数传递。

    以下示例将守护程序日志从 Amazon S3 复制到 hdfs:///output。 在以下命令中:

    • --cluster-id 指定集群

    • Jar 是 S3DistCp JAR 文件的位置

    • Args 是传递到 S3DistCp 的选项名称/值对的逗号分隔的列表。 有关可用选项的完整列表,请参阅S3DistCp 选项

    要向正在运行的集群添加 S3DistCp 复制步骤,请在 Amazon S3 或本地文件系统中保存的 JSON 文件中将以下内容作为此示例中的 myStep.json。Replace j-3GYXXXXXX9IOK 替换为您的集群 ID 并替换 mybucket 替换为您的 Amazon S3 存储桶名称。

    [ { "Name":"S3DistCp step", "Args":["s3-dist-cp","--s3Endpoint=s3.amazonaws.com","--src=s3://mybucket/logs/j-3GYXXXXXX9IOJ/node/","--dest=hdfs:///output","--srcPattern=.*[a-zA-Z,]+"], "ActionOnFailure":"CONTINUE", "Type":"CUSTOM_JAR", "Jar":"command-runner.jar" } ]
    aws emr add-steps --cluster-id j-3GYXXXXXX9IOK --steps file://./myStep.json

例 从 Amazon S3 向 HDFS 复制日志文件

此示例还说明如何通向正在运行的集群添加步骤将 Amazon S3 存储桶中存储的日志文件复制到 HDFS 中。在此示例中,--srcPattern 选项用于限制复制到守护程序日志的数据。

要使用 --srcPattern 选项将日志文件从 Amazon S3 复制到 HDFS,请在某个 JSON 文件(本例中为 myStep.json)中输入以下内容并保存到 Amazon S3 或本地文件系统中。Replace j-3GYXXXXXX9IOK 替换为您的集群 ID 并替换 mybucket 替换为您的 Amazon S3 存储桶名称。

[ { "Name":"S3DistCp step", "Args":["s3-dist-cp","--s3Endpoint=s3.amazonaws.com","--src=s3://mybucket/logs/j-3GYXXXXXX9IOJ/node/","--dest=hdfs:///output","--srcPattern=.*daemons.*-hadoop-.*"], "ActionOnFailure":"CONTINUE", "Type":"CUSTOM_JAR", "Jar":"command-runner.jar" } ]