2017-02-27 281 views
1

我正在使用s3disctcp从S3复制31,16,886个文件(300 GB)到HDFS,并花了4天才能复制10,48576个文件。我杀了这个工作,需要理解我如何减少这个时间,或者我做错了什么。从s3复制到hdfs时,s3Distcp太慢

s3-dist-cp --src s3://xml-prod/ --dest hdfs:///Output/XML/ 

它在AWS EMR机器上。

+0

嗯,我使用EMR,m4.4xlarge的更大的实例。 S3和EMR在同一地区。 –

+0

我有同样的观察,因为这篇文章在这里 - > http://stackoverflow.com/questions/38462480/s3-dist-cp-and-hadoop-distcp-job-infinitely-loopin-in-emr –

回答

0

问题在于HDFS及其在处理大量小文件时的糟糕表现。考虑在将文件放入HDFS之前合并文件。 groupbys3distcp command的选项提供了一种做法。

+0

谢谢你的回复丹尼斯。我不确定是否将这些文件合并是一个好主意,因为我必须通过Spark应用程序来使用这些单个文件,该应用程序将从每个单独的Xml中选择需要的列并将其另存为拼花图格式。如果你有任何其他想法,那也可能是好的。每个单独的文件就像一个行/记录。谢谢 –

+0

看起来,保持S3桶中的数据的方式可能需要重新考虑。例如,因为一个文件可以被视为一个记录 - 为什么不把所有的3mln文件分组成很少数量的文件呢? JSON在这里可以很好地工作,请参阅http://stackoverflow.com/questions/16906010/storing-xml-inside-json-object – Denis

+0

嗨丹尼斯,这些真的很大的XML文件,我只需要数据的一个子集。您提出的方法很有趣,但是我仍然需要在EC2或EMR instace的本地下载文件以进一步处理它。 AWS ClI命令不可靠,因为某些文件不会被下载,您需要运行单独的bash脚本来获取这些缺少的文件。我现在正在研究安装S3,看看这是一种简单而快速的方法。 –

0

为什么不将整个过程作为单个应用程序管道的一部分来完成?这样你就不必在HDFS中存储很多小的中间文件。

S3文件阅读器 - > XML解析器 - >选择必填字段 - >木地板作家(与轮换政策单个文件)