将1亿个文件写入s3

时间:2012-12-29 11:16:28

标签: hadoop amazon-s3 elastic-map-reduce amazon-emr emr

我的主要目标是根据每条记录的ID将记录分成文件,目前有超过150亿条记录,肯定会增加。我需要使用Amazon EMR的可扩展解决方案。我已经为一个拥有大约9亿条记录的小型数据集完成了这项工作。

输入文件采用csv格式,其中一个字段需要是输出中的文件名。 所以说有以下输入记录:

awesomeId1, somedetail1, somedetail2
awesomeID1, somedetail3, somedetail4
awesomeID2, somedetail5, somedetail6

所以现在2个文件应该作为输出,一个名为awesomeID1.dat,另一个名称为awesomeID2.dat,每个文件都有相应ID的记录。

输入大小:每月总计600 GB(gzippef文件的大小),每个文件大约为2 3 GB。我需要一次处理大约6个月或更长时间。所以总数据大小为6 * 600 GB(压缩)。

以前我使用Too many open files根据id值写入s3时出现FileByKeyTextOutputFormat extends MultipleTextOutputFormat<Text, Text>错误。然后正如我已经解释here,而不是将每个文件直接写入s3,我在本地编写它们并以1024个文件的批量移动到s3。

但是现在随着数据量的增加,我收到了来自s3的消息,然后它跳过编写有问题的文件:"Please reduce your request rate."此外,我还要运行一个拥有200 m1.xlarge机器的集群,然后需要大约2个小时,因此它也非常昂贵!

我希望有一个可扩展的解决方案,如果将来再次增加数据量,这个解决方案不会失败。

任何建议?

1 个答案:

答案 0 :(得分:0)

以下是有关SlowDown错误的一些信息:https://forums.aws.amazon.com/message.jspa?messageID=89722#89816您应按字母顺序插入S3。此外,限制是动态的,并随着时间的推移重新调整,因此减速并尝试稍后提高您的费率。

也许您最好使用数据库而不是文件系统?总数据集有多大?

DynamoDB可能非常适合,但每月1美元/ GB可能会很昂贵。 (因为它使用SSD进行后备存储。)

RDS是另一种选择。其定价为0.10美元/ GB /月。

更好的办法可能是在EC2上托管自己的NoSQL或其他数据存储区,例如在新的hs1.8xlarge实例上。您可以仅在需要时启动它,并在不需要时将其备份到S3。