hdfs - s3distcp 从 S3 复制到 EMR HDFS 数据副本始终在一个节点上
问题描述
我正在使用 s3distcp 将 500GB 数据集复制到我的 EMR 集群中。这是一个 12 节点 r4.4xlarge 集群,每个集群都有 750GB 磁盘。它使用 EMR 发布标签emr-5.13.0
,我正在添加 Hadoop: Amazon 2.8.3
、 Ganglia:3.7.2
和 Spark 2.3.0
。我正在使用以下命令将数据复制到集群中:
s3-dist-cp --src=s3://bucket/prefix/ --dest=hdfs:///local/path/ --groupBy=.*(part_).* --targetSize=128 --outputCodec=none
当我查看 Ganglia 或 namenode UI(EMR 集群上的端口 50070)中的磁盘使用情况时,我可以看到一个节点的大部分磁盘已填满,而其他节点的使用百分比相似。单击大量文件(〜50)我可以看到文件的副本始终出现在完整节点上。
我正在使用 Spark 转换这些数据,将其写入 HDFS,然后复制回 S3。我在处理这个数据集时遇到了问题,因为我的任务被杀死了。我不确定这是问题的原因。我不需要在本地复制数据,也不需要解压缩。最初我认为 BZIP2 编解码器不可拆分,解压缩有助于在我的 Spark 作业中获得并行性,但我错了,它是可拆分的。我还发现了hdfs balancer
我用来重新分配副本的命令,看看这是否解决了我的 Spark 问题。
但是,现在我已经看到了我认为奇怪的行为,我想了解 s3distcp/HDFS 始终在一个节点上创建文件副本是否正常?
解决方案
s3distcp 是封闭源代码;我无法详细评论其内部结构。
当 HDFS 创建数据副本时,它会尝试将一个块保存到本地机器,然后在其他地方再保存 2 个(假设复制==3)。无论哪个主机运行 distcp 工作进程,最终都会拥有整个文件的副本。因此,如果仅使用一台主机进行复制,则会填满。
FWIW,我不相信你需要做那个distcp,如果你可以直接从S3读取和过滤数据,将结果保存到hdfs。您的 spark 工作人员将进行过滤,并将他们的块写回运行这些工作人员的机器和链中的其他主机。对于短期集群,您还可以尝试降低 hdfs 复制因子(2?),以便在整个集群中节省 HDFS 数据,代价是少一个地方供 spark 安排与数据相邻的工作
推荐阅读
- azure-functions - 从 Azure Function 应用中的文本中删除 HTML 标记
- ruby-on-rails - AssociationTypeMismatch 的解决方法?
- sql - 如何将 Firebird 中的 IF 与存储过程一起使用?
- html - 为什么我的 div 隐藏在 position:absolute images 后面?
- python - 如何使用 python 进行主题搜索?
- java - Twitter 机器人、Java、Heroku。“状态从 up 变为 crashed”
- c++ - 如何在二进制文件中查找字符串?
- tsql - T-SQL 检查约束的代码是什么?
- mysql - 如何使用 R 将数据框中的数据插入 MySQL 表中的选定列
- python - 解析没有索引的 Json