我正在使用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在一个节点上创建文件的副本是正常的,我想理解这个行为吗?
答案 0 :(得分:0)
s3distcp是封闭源码;我无法对其内部细节进行详细评论。
当HDFS创建数据副本时,它会尝试将一个块保存到本地计算机,然后再将其他两个块保存到其他位置(假设复制== 3)。无论运行哪个主机,distcp工作进程最终都会拥有整个文件的副本。因此,如果只有一个主机用于副本,则会填满。
FWIW,我不相信你需要做那个distcp,而不是你可以直接从S3读取和过滤数据,将结果保存到hdfs。您的spark工作人员将进行过滤,并将其块写回运行这些工作者和链中其他主机的计算机。对于短期群集,您还可以尝试降低hdfs复制因子(2?),因此可以节省整个群集中的HDFS数据,但代价是可以减少火花来安排数据旁边的工作