我将把工作分为两部分:
我有大量数据(大约1 TB,分成数百个文件),我通过distcp从S3复制到HDFS
这个数据将由hadoop流媒体作业(一个简单的映射器和缩减器,用python编写)执行
现在,我必须等到所有数据都被复制到HDFS
,然后才能开始我的实际工作。这是一个问题:考虑到DISTCP
本身就是一个map-reduce作业,有没有办法可以“简化”这两个作业,即第二个作业是否可以开始处理已经复制的数据(例如distcp
已经复制了几个文件,第二个作业在技术上已经开始了吗?
我希望我已经清楚了。
答案 0 :(得分:1)
您可以使用S3InputFormat(https://github.com/ATLANTBH/emr-s3-io)直接向您的映射器读取数据。但请注意,如果作业失败,您将重新下载所有数据。 所以,我建议在处理之前下载所有数据。如果您不需要一次处理整个数据,可以在distcp启动后启动mapreduce。但你应该编写自己的FileInputFormat扩展,它将记录某个地方(在输入目录中,我猜)处理了哪些文件,并在每次调用时过滤掉处理过的文件(在方法getSplits()中)并仅处理经过处理的文件。