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