S3DistCp (s3-dist-cp)
Apache DistCp 是一款开源工具,可以用于复制大量数据。S3DistCp 类似于 DistCp,但经过优化后可以处理 Amazon,尤其是 Amazon S3。Amazon EMR 4.0 及更高版本中的 S3DistCp 命令为 s3-dist-cp
,您可以将其作为集群或命令行中的步骤添加。使用 S3DistCp 能有效地从 Amazon S3 复制大量数据到 HDFS,供 Amazon EMR 集群中的后续步骤进行处理。您还可以使用 S3DistCp 在 Amazon S3 存储桶之间或从 HDFS 向 Amazon S3 复制数据。若要在存储桶之间和 Amazon 账户之间并行复制大量对象,S3DistCp 可扩展性更强,也更高效。
有关演示 S3DistCP 在实际场景中灵活性的特定命令,请参阅 Amazon 大数据博客中的 Seven tips for using S3DistCp
与 DistCp 一样,S3DistCp 使用 MapReduce 以分布式方式进行复制。它在几个服务器之间共享复制、错误处理、恢复和报告任务。有关 Apache DistCp 开源项目的更多信息,请参阅 Apache Hadoop 文档中的 DistCp 指南
如果 S3DistCp 无法复制部分或全部指定文件,集群步骤会失败,并返回一个非零错误代码。如果发生此情况,S3DistCp 将不会清理部分复制的文件。
重要
S3DistCp 不支持包含下划线字符的 Amazon S3 存储桶名称。
S3DistCp 不支持连结 Parquet 文件。请改用 PySpark。有关更多信息,请参阅在 Amazon EMR 中串连 parquet 文件
为避免在使用 S3DistCP 将单个文件(而不是目录)从 S3 复制到 HDFS 时出现复制错误,请使用 Amazon EMR 版本 5.33.0 或更高版本或 Amazon EMR 6.3.0 或更高版本。
S3DistCp 选项
虽然 S3DistCp 与 DistCp 类似,但前者支持不同的选项组来改变复制和压缩数据的方式。
调用 S3DistCp 时,您可以指定下表中所述的选项。选项是用参数列表添加到步骤的。下表是 S3DistCp 参数的示例。
选项 | 描述 | 必填 |
---|---|---|
‑‑src=LOCATION
|
待复制数据的位置。可以是 HDFS 或 Amazon S3 位置。 示例: 重要S3DistCp 不支持包含下划线字符的 Amazon S3 存储桶名称。 |
是 |
‑‑dest=LOCATION
|
数据的目标位置。可以是 HDFS 或 Amazon S3 位置。 示例: 重要S3DistCp 不支持包含下划线字符的 Amazon S3 存储桶名称。 |
是 |
‑‑srcPattern=PATTERN
|
该正则表达式 如果正则表达式参数包含特殊字符,如星号(*),那么必须将正则表达式或整个 示例: |
否 |
‑‑groupBy=PATTERN
|
该正则表达式 圆括号表明文件应使用的分组方式,与圆括号内的语句匹配的所有项目都组合成单个输出文件。如果正则表达式不包括圆括号内的语句,则集群将在执行 S3DistCp 步骤时失败,并返回错误。 如果正则表达式参数包含特殊字符,如星号(*),那么必须将正则表达式或整个 如果指定 示例: |
否 |
‑‑targetSize=SIZE
|
要根据 如果由 示例: |
否 |
‑‑appendToLastFile |
指定将文件从 Amazon S3 复制到已存在的 HDFS 时 S3DistCp 的行为。它向现有文件附加新文件数据。如果将 |
否 |
‑‑outputCodec=CODEC
|
指定用于所复制文件的压缩编解码器。取值可以是: 示例: |
否 |
‑‑s3ServerSideEncryption
|
确保目标数据使用 SSL 传输,并在 Amazon S3 中使用 Amazon 服务端密钥自动加密。使用 S3DistCp 检索数据时,不会自动取消加密对象。如果尝试将未加密的对象复制到需要加密的 Amazon S3 存储桶,则操作将失败。有关更多信息,请参阅使用数据加密。 示例: |
否 |
‑‑deleteOnSuccess
|
如果复制操作成功,此选项会让 S3DistCp 从源位置删除已复制的文件。如果您以计划任务的形式将输出文件 (如日志文件) 从一个位置复制到另一个位置,又不想复制两次相同的文件,那么这个选项会非常有用。 示例: |
否 |
‑‑disableMultipartUpload
|
禁用分段上载。 示例: |
否 |
‑‑multipartUploadChunkSize=SIZE
|
Amazon S3 分段上传中每个分段的大小,以 MiB 为单位。S3DistCp 在复制的数据大于 示例: |
否 |
‑‑numberFiles
|
在输出文件之前加上序号。计数从 0 开始,除非 示例: |
否 |
‑‑startingIndex=INDEX
|
使用 示例: |
否 |
‑‑outputManifest=FILENAME
|
创建使用 Gzip 压缩的文本文件,其中包含由 S3DistCp 复制的所有文件的列表。 示例: |
否 |
‑‑previousManifest=PATH
|
读取清单文件,该文件使用 示例: |
否 |
‑‑requirePreviousManifest |
需要对 S3DistCp 进行的上一次调用期间创建的之前清单。如果将它设置为 false,则不指定之前的清单也不会生成错误。默认值为 true。 |
否 |
‑‑copyFromManifest
|
反转 示例: |
否 |
‑‑s3Endpoint=ENDPOINT |
指定上载文件时要使用的 Amazon S3 终端节点。此选项会同时设置源位置和目标位置的终端节点。如果未设置,则默认终端节点是 示例: |
否 |
‑‑storageClass=CLASS |
目标为 Amazon S3 时要使用的存储类。有效值是 STANDARD 和 REDUCED_REDUNDANCY。如果不指定此选项,则 S3DistCp 尝试保留存储类。 示例: |
否 |
‑‑srcPrefixesFile=PATH |
Amazon S3(s3://)、HDFS(hdfs:///)或本地文件系统(file:/)中包含 如果提供了 示例: |
否 |
除了上述选项外,S3DistCp 还执行 Tool interface
添加 S3DistCp 作为集群中的步骤
您可以添加 S3DistCp 作为集群中的步骤进行调用。可以使用控制台、CLI 或 API 在启动时向集群或是向正在运行的集群添加步骤。以下示例说明如何向正在运行的集群添加 S3DistCp 步骤。有关向集群添加步骤的更多信息,请参阅《Amazon EMR 管理指南》中的向集群提交工作。
使用 Amazon CLI 向正在运行的集群添加 S3DistCp 步骤
有关在 Amazon CLI 中使用 Amazon EMR 命令的更多信息,请参阅 Amazon CLI 命令参考。
-
要向集群添加调用 S3DistCp 的步骤,请将实参传递给指定 S3DistCp 应如何执行复制操作的形参。
以下示例将守护进程日志从 Amazon S3 复制到
hdfs:///output
。在以下命令中:-
‑‑cluster-id
指定集群 -
Jar
是 S3DistCp JAR 文件的位置。如需有关如何使用 command-runner.jar 在群集上运行命令的示例,请参阅提交自定义 JAR 步骤以运行脚本或命令。 -
Args
是传递到 S3DistCp 的选项名称–值对的逗号分隔的列表。有关可用选项的完整列表,请参阅S3DistCp 选项。
要向正在运行的集群添加 S3DistCp 复制步骤,请在某个 JSON 文件(本例中为
)中输入以下内容并保存到 Amazon S3 或本地文件系统中。将myStep.json
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 文件(本例中为
)中输入以下内容并保存到 Amazon S3 或本地文件系统中。将 myStep.json
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" } ]