我应该如何在s3中对数据进行分区以便与hadoop配置单元一起使用?

时间:2010-12-15 20:02:03

标签: amazon-s3 hadoop mapreduce hive

我有一个包含大约300gb日志文件的s3存储桶,没有特别的顺序。

我想使用日期时间戳对这些数据进行分区以便在hadoop-hive中使用,以便与特定日期相关的日志行在同一个s3'文件夹中聚集在一起。例如,1月1日的日志条目将位于与以下命名匹配的文件中:

s3://bucket1/partitions/created_date=2010-01-01/file1
s3://bucket1/partitions/created_date=2010-01-01/file2
s3://bucket1/partitions/created_date=2010-01-01/file3

对我来说,转换数据的最佳方式是什么?我最好只运行一个脚本,一次读入每个文件并将数据输出到正确的s3位置?

我确信有一个使用hadoop的好方法,有人可以告诉我那是什么吗?

我尝试了什么:

我尝试使用hadoop-streaming传入一个收集了每个日期的所有日志条目的映射器,然后将这些日志条目直接写入S3,为reducer返回任何内容,但这似乎创建了重复项。 (使用上面的例子,我最终得到了1月1日的250万条,而不是140万条)

有没有人有任何想法如何最好地接近这个?

2 个答案:

答案 0 :(得分:0)

如果Hadoop在任务跟踪器中有空闲插槽,它将运行同一任务的多个副本。如果您的输出格式没有正确地忽略生成的重复输出键和值(可能是S3的情况;我从未使用它),您应该关闭推测执行。如果您的工作仅限地图,请将mapred.map.tasks.speculative.execution设置为false。如果您有减速器,请将mapred.reduce.tasks.speculative.execution设置为false。查看 Hadoop: The Definitive Guide 以获取更多信息。

答案 1 :(得分:0)

为什么不在这些数据上创建外部表,然后使用hive创建新表?

create table partitioned (some_field string, timestamp string, created_date date) partition(created_date);
insert overwrite partitioned partition(created_date) as select some_field, timestamp, date(timestamp) from orig_external_table;

事实上,我还没有查找语法,因此您可能需要参考https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-InsertingdataintoHiveTablesfromqueries进行更正。