AWS EMR Bootstrap 操作 "aws s3 cp ..." 下载 11GB 文件由于 [Errno 28] 没有 space 留在设备上而失败

AWS EMR Bootstrap action "aws s3 cp ..." to download 11GB file failing due to [Errno 28] No space left on device

我正在尝试使用 AWS 控制台启动一个 EMR 集群(包括 HBase 和 Zookeeper),该集群的启动脚本从 s3 下载 11GB 的数据,然后将该文件放入 HDFS。 我有一个 shell 脚本,其中包含行

aws s3 cp s3://path/to/eleven/gb/of/data local/ --recursive
hdfs dfs -put local/ /

脚本在 s3 上,当我启动集群时,我包含一个 Bootstrap 操作,指向 s3 上的 shell 脚本。

但是,集群无法启动并出现此错误:

Terminated with errors: On the master instance (i-036fb1c03d99115a8), bootstrap action 1 returned a non-zero return code

当我查看日志时,我在 stderr 输出中看到了这个

download failed: s3://path/to/eleven/gb/of/data/d/95d969cadfa644de8d1b2793e0df7822 to local/d/95d969cadfa644de8d1b2793e0df7822 [Errno 28] No space left on device

stdout输出的最后一行是

Completed 5.1 GiB/11.0 GiB (49.5 MiB/s) with 1 file(s) remaining

在集群的配置中,对于每个节点,我都将根设备 EBS 卷大小设置为 100GB,所以我不太清楚为什么下载 5.1 后设备上没有 space GB 的数据。

EMR bootstrap 作为 hadoop 用户运行,工作目录 /home/hadoop.
主目录没有太多存储空间。

根据您的配置,它似乎限制为 5.1 GB。


您可以将文件放在主目录以外的其他位置(例如 /etc/temp)。

或者更好的方法是使用 1 步过程而不是 2 步过程,即使用 s3-dist-cp 从 S3 直接复制到 HDFS。 您可以找到更多详细信息 here.
而且我认为这将是无需任何配置更改的最佳解决方案,因为 EMR 预装了 s3-dist-cp。它还可以通过并行复制文件来节省时间。


还有一个方法:
您可以使用 EMRFS.
而不是 HDFS 有了这个你根本不需要下载,但比普通的 S3 成本更高。但也有很多优势。 您可以从 this

开始