6

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

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

我们在 hive 中预处理所有数据,我想知道是否有一种方法可以创建,比如 10 个 1GB 的文件,这可能会使复制到 redshift 的速度更快。

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

4

1 回答 1

11

有几种方法可以拆分 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 数据加载而节省的时间。

于 2013-05-08T21:43:58.507 回答