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

Amazon s3 我应该如何在s3中对数据进行分区以与hadoop配置单元一起使用?,amazon-s3,hadoop,mapreduce,hive,Amazon S3,Hadoop,Mapreduce,Hive,我有一个s3存储桶,其中包含大约300gb的日志文件,没有特定的顺序 我想使用日期-时间戳对这些数据进行分区,以便在hadoop配置单元中使用,以便将与特定日期相关的日志行聚集在同一个s3“文件夹”中。例如,1月1日的日志条目将位于与以下命名匹配的文件中: s3://bucket1/partitions/created_date=2010-01-01/file1 s3://bucket1/partitions/created_date=2010-01-01/file2 s3://bucket1/

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

我想使用日期-时间戳对这些数据进行分区,以便在hadoop配置单元中使用,以便将与特定日期相关的日志行聚集在同一个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,没有为reducer返回任何内容,但这似乎会创建重复项。使用上面的例子,我在1月1日收到了250万条条目,而不是140万条


有人知道如何最好地处理这个问题吗?

如果Hadoop在任务跟踪器中有空闲的插槽,它将运行同一任务的多个副本。如果您的输出格式没有正确忽略产生的重复输出键和值,这可能是S3的情况;我从来没用过它,你应该关掉投机执行。如果作业是仅映射的,请将mapred.map.tasks.思辨性.execution设置为false。如果您有一个reducer,请将mapred.reduce.tasks.思辨.execution设置为false。查看以了解更多信息。

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

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;
事实上,我还没有查找语法,所以您可能需要参考来更正它