有没有办法指示Hive将数据拆分成多个输出文件?或者可能限制输出文件的大小.
我打算使用Redshift,它建议将数据拆分成多个文件以允许并行加载http://docs.aws.amazon.com/redshift/latest/dg/t_splitting-data-files.html
我们预先处理hive中的所有数据,我想知道是否有一种方法可以创建,例如10个1GB文件可能会使复制速度更快.
我正在查看https://cwiki.apache.org/Hive/adminmanual-configuration.html和https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties但我找不到任何东西
有两种方法可以分割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脚本以传递给hive,并将该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数据负载并行.