将不同S3文件夹中的文件作为输入传递给mapreduce

时间:2014-08-25 19:17:27

标签: hadoop amazon-web-services amazon-s3 mapreduce

我们的日志文件存储在S3上的年/月/日/小时桶中。请参阅下面的结构。

如何在day = 20上传递所有日志作为我的地图缩减程序的输入?

例如:

bucket = logs / year = 2014 / month = 8 / day = 20 / hour = 1 / log1_1.txt

bucket = logs / year = 2014 / month = 8 / day = 20 / hour = 2 / log2_1.txt

bucket = logs / year = 2014 / month = 8 / day = 20 / hour = 2 / log2_2.txt

bucket = logs / year = 2014 / month = 8 / day = 20 / hour = 2 / log2_3.txt

bucket = logs / year = 2014 / month = 8 / day = 20 / hour = 3 / log3_1.txt

bucket = logs / year = 2014 / month = 8 / day = 20 / hour = 4 / log4_1.txt

1 个答案:

答案 0 :(得分:2)

当您说“桶”时,您实际上是指不同的S3存储桶,还是指存储桶中的文件夹/目录?创建那么多桶将最终达到您可以创建的桶数量的S3帐户限制。

假设你的意思是存储桶中的文件夹/目录,请使用s3distcp作为EMR集群中的一个步骤,将想要的日志复制到HDFS,然后使用HDFS目录作为MR程序的输入

s3distcp使用src目录和srcPattern来过滤src中找到的项目。在您的示例中,您可以执行以下操作:

./elastic-mapreduce --jobflow JobFlowID --jar \
/home/hadoop/lib/emr-s3distcp-1.0.jar \
--arg --src --arg s3://logs/ \
--arg --srcPattern --arg '.*day-20.*'
--arg --dest --arg hdfs://input/

路径中具有day = 20的所有日志文件将使用JobFlowID复制到EMR群集的HDFS上的输入目录中。