我的主要目标是根据每条记录的 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
我使用的时候报错FileByKeyTextOutputFormat extends MultipleTextOutputFormat<Text, Text>
根据id值写入s3。然后正如我所解释的here https://stackoverflow.com/questions/12953251/too-many-open-files-in-emr,我没有将每个文件直接写入 s3,而是在本地写入,然后以 1024 个文件为一批批量移动到 s3。
但现在随着数据量的增加,我从 s3 收到以下消息,然后它会跳过写入有问题的文件:"Please reduce your request rate."
另外,我必须在包含 200 台 m1.xlarge 机器的集群上运行,这需要大约 2 小时,因此成本也非常高!
我想要一个scalable如果将来数据量再次增加,该解决方案不会失败。
有什么建议么?