如何在 Amazon EMR 集群上将大量数据从 Amazon S3 复制到 HDFS?

上次更新日期:2021 年 11 月 22 日

我想将大量数据从 Amazon Simple Storage Service (Amazon S3) 复制到 Amazon EMR 集群。

简短描述

使用 S3DistCp 在 Amazon S3 和 Amazon EMR 集群之间复制数据。S3DistCp 默认安装在 Amazon EMR 集群上。要调用 S3DistCp,请在启动时或集群运行后将其作为一个步骤添加。

解决方法

要使用 AWS 命令行界面 (AWS CLI) 将 S3DistCp 步骤添加到正在运行的集群,请参阅 添加 S3DistCp 作为集群中的步骤

注意:如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

要使用控制台添加 S3DistCp 步骤,请执行以下操作:

1.    打开 Amazon EMR 控制台,然后选择 Clusters(集群)。

2.    从列表中选择 Amazon EMR 集群,然后选择 Steps

3.    选择 Add step,然后选择以下选项:

对于 Step type,选择 Custom JAR
对于 Name,输入 S3DistCp 步骤的名称。
对于 JAR location,输入 command-runner.jar。有关更多信息,请参阅 Command Runner
对于 Arguments,输入与以下选项类似的选项s3-dist-cp --src=s3://s3distcp-source/input-data --dest=hdfs:///output-folder1
对于 Action on failure(失败时的操作),选择 Continue(继续)。

4.    选择 Add

5.    当步骤 Status(状态)更改为 Completed(已完成)时,请验证文件已复制到集群:

$ hadoop fs -ls hdfs:///output-folder1/

请注意:最佳做法是将小文件合并为几个大文件(使用 groupBy 选项),然后使用 outputCodec 选项压缩大文件

问题排查

要对 S3DistCp 进行问题排查,请查看步骤和任务日志。

1.    打开 Amazon EMR 控制台,然后选择 Clusters(集群)。

2.    从列表中选择 EMR 集群,然后选择 Steps(步骤)。

3.    在 Log files 列中,选择相应步骤日志:

controller:关于步骤处理的信息。如果在加载时步骤失败,您可以在此日志中找到堆栈跟踪。
syslog:来自非 Amazon 软件的日志,例如 Apache 和 Hadoop。
stderr:Hadoop 处理该步骤时 Hadoop 的标准错误通道。
stdout:Hadoop 处理该步骤时 Hadoop 的标准输出通道。

如果无法在步骤日志中找到失败的根本原因,请查看 S3DistCp 任务日志:

1.    打开 Amazon EMR 控制台,然后选择 Clusters(集群)。

2.    从列表中选择 EMR 集群,然后选择 Steps(步骤)。

3.    在 Log files(日志文件)列中,选择 View jobs(查看作业)。

4.    在 Actions 列中,选择 View tasks

5.    如果任务失败,选择 View attempts(查看尝试)查看任务日志。

常见错误

Reducer 任务因内存不足而失败:

如果在步骤的 stderr 日志中看到与以下错误消息类似的错误消息,则表示 S3DistCp 任务因内存不足而无法处理 Reducer 任务:

Container killed on request. Exit code is 143
Container exited with a non-zero exit code 143
Container [pid=19135,containerID=container_1494287247949_0005_01_000003] is running beyond virtual memory limits. Current usage: 569.0 MB of 1.4 GB physical memory used; 3.0 GB of 3.0 GB virtual memory used. Killing container.

要解决此问题,请使用以下选项之一增加 Reducer 任务的内存资源:

Amazon S3 权限错误:

如果在步骤的 stderr 日志中看到与以下错误消息类似的错误消息,则表示 S3DistCp 因权限问题而无法访问 Amazon S3:

Exception in thread "main" com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: REQUEST_ID

要解决此问题,请参阅 权限错误


这篇文章对您有帮助吗?


您是否需要账单或技术支持?