Hive - 跨文件拆分数据

时间:2013-05-08 20:28:17

标签: amazon-web-services hive elastic-map-reduce amazon-redshift

有没有办法指示Hive将数据拆分成多个输出文件?或者可能限制输出文件的大小。

我打算使用Redshift,建议将数据拆分为多个文件以允许并行加载http://docs.aws.amazon.com/redshift/latest/dg/t_splitting-data-files.html

我们预先处理配置单元中的所有数据,我想知道是否有一种方法可以创建,例如10个1GB文件可能会使复制速度更快。

我在查看https://cwiki.apache.org/Hive/adminmanual-configuration.htmlhttps://cwiki.apache.org/confluence/display/Hive/Configuration+Properties,但我找不到任何内容

1 个答案:

答案 0 :(得分:11)

有两种方法可以分割Hive输出。第一种也是最简单的方法是设置减速器的数量。由于每个都减少了对其自己的输出文件的写入,因此您指定的reducer数量将与写入的输出文件数量相对应。请注意,某些Hive查询不会导致您指定的reducer数量(例如,SELECT COUNT(*) FROM some_table总是会产生一个reducer)。要在查询之前指定减速器的数量,请执行以下操作:

set mapred.reduce.tasks=10

您可以拆分成多个输出文件的另一种方法是让Hive将查询结果插入到分区表中。这将导致每个分区至少有一个文件。为了理所当然,你必须有一些合理的分区列。例如,您不希望在唯一的id列上进行分区,或者每个记录都有一个文件。这种方法至少可以保证每个分区的输出文件,最多numPartitions * numReducers。这是一个示例(不要过于担心hive.exec.dynamic.partition.mode,需要设置此查询才能工作)。

hive.exec.dynamic.partition.mode=nonstrict

CREATE TABLE table_to_export_to_redshift (
  id INT,
  value INT
)
PARTITIONED BY (country STRING)

INSERT OVERWRITE TABLE table_to_export_to_redshift
PARTITION (country)
SELECT id, value, country
FROM some_table

要获得更精细的控制,您可以编写自己的reduce脚本以传递给配置单元,并将该reduce脚本写入多个文件。一旦你编写了自己的减速机,你可以做任何你想做的事情。

最后,您可以放弃尝试操作Hive输出所需数量的文件,并在Hive完成后将它们分开。默认情况下,Hive将其表未压缩并以纯文本形式存储在其仓库目录(例如/apps/hive/warehouse/table_to_export_to_redshift)中。您可以使用Hadoop shell命令,MapReduce作业,Pig,或将它们拉入Linux并根据需要将它们分开。

我对Redshift没有任何经验,因此我的一些建议可能不适合Redshift因任何原因而消费。

一些注意事项:将文件拆分为更多更小的文件通常对Hadoop不利。你可能会为Redshift增加速度,但如果文件被Hadoop生态系统的其他部分(MapReduce,Hive,Pig等)消耗,如果文件太小(如果1GB就可以了),你可能会看到性能下降。还要确保额外的处理/开发时间值得您节省时间,以便与Redshift数据负载并行。