2010-12-15 57 views
1

我有一个s3存储桶,其中包含大约300GB的日志文件,没有特别的顺序。我应该如何分区s3中的数据以用于hadoop配置单元?

我想要使用日期时间戳将这些数据分区以便在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的流然后写那些直接到S3,在减速返回什么,但似乎创造了重复。 (使用上面的例子,我结束了1月1日的250万条目,而不是140万)

有没有人有任何想法如何最好的方法呢?

回答

0

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

0

为什么不在这个数据上创建一个外部表,然后使用配置单元创建新表?

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

相关问题