1

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

我想使用日期时间戳对这些数据进行分区以在 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

ETC

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

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

我试过的:

我尝试通过传入一个映射器来使用hadoop-streaming,该映射器收集每个日期的所有日志条目,然后将它们直接写入S3,没有为reducer返回任何内容,但这似乎会产生重复。(使用上面的例子,我在 1 月 1 日得到了 250 万个条目,而不是 140 万个)

有谁知道如何最好地解决这个问题?

4

2 回答 2

0

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

于 2010-12-18T02:44:24.437 回答
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进行更正。

于 2016-05-19T03:22:59.257 回答