我应该如何对 s3 中的数据进行分区以与 hadoop hive 一起使用?
Posted
技术标签:
【中文标题】我应该如何对 s3 中的数据进行分区以与 hadoop hive 一起使用?【英文标题】:How should I partition data in s3 for use with hadoop hive? 【发布时间】:2010-12-15 20:02:03 【问题描述】:我有一个 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
等
对我来说,转换数据的最佳方式是什么?我最好只运行一个脚本,一次读取每个文件并将数据输出到正确的 s3 位置?
我确信有一个使用 hadoop 的好方法,有人可以告诉我那是什么吗?
我的尝试:
我尝试使用 hadoop-streaming,方法是传入一个映射器,该映射器收集每个日期的所有日志条目,然后将它们直接写入 S3,没有为减速器返回任何内容,但这似乎会产生重复。 (使用上面的例子,我在 1 月 1 日得到了 250 万个条目,而不是 140 万个)
有没有人知道如何最好地解决这个问题?
【问题讨论】:
【参考方案1】:如果 Hadoop 在任务跟踪器中有空闲槽,它将运行同一任务的多个副本。如果您的输出格式没有正确忽略生成的重复输出键和值(S3 可能就是这种情况;我从未使用过它),您应该关闭推测执行。如果您的作业是仅限地图的,请将 mapred.map.tasks.speculative.execution
设置为 false。如果您有减速器,请将 mapred.reduce.tasks.speculative.execution
设置为 false。查看 Hadoop: The Definitive Guide 了解更多信息。
【讨论】:
【参考方案2】:为什么不在这些数据上创建一个外部表,然后使用 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更正一下。
【讨论】:
以上是关于我应该如何对 s3 中的数据进行分区以与 hadoop hive 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
Spark - 从 S3 读取分区数据 - 分区是如何发生的?
按事件时间对 Kinesis firehose S3 记录进行分区