有几种方法可以拆分 Hive 输出。第一种也是最简单的方法是设置减速器的数量。由于每个都减少对自己输出文件的写入,因此您指定的减少器数量将对应于写入的输出文件的数量。请注意,某些 Hive 查询不会产生您指定的 reducer 数量(例如,SELECT COUNT(*) FROM some_table
总是产生一个 reducer)。要指定 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 脚本写入多个文件。一旦你编写了自己的 reducer,你几乎可以做任何你想做的事情。
最后,您可以放弃尝试操纵 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 数据加载而节省的时间。