-->

蜂巢 - 跨文件拆分数据(Hive — split data across files)

2019-09-02 07:08发布

有没有一种方法来指示配置单元的数据拆分成多个输出文件? 或者,也许封顶输出文件的大小。

我打算用红移,其中建议拆分数据分成多个文件,以允许并行装载http://docs.aws.amazon.com/redshift/latest/dg/t_splitting-data-files.html

我们在蜂巢全部进行预处理出的数据,我想知道是否有创造的一种方式,说这可能使复制到红移快10页1GB的文件。

我一直在寻找https://cwiki.apache.org/Hive/adminmanual-configuration.html和https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties但我无法找到任何东西

Answer 1:

有几个方法,你可以去分割蜂巢输出。 第一,最简单的方法是设置减速机的数量。 由于每减少写入自己的输出文件,指定减速的数量将对应于写输出文件的数量。 请注意,某些蜂房查询将不会导致您指定(例如,减速机的数量SELECT COUNT(*) FROM some_table总是导致一个减速)。 要指定查询之前运行该减速器的数量:

set mapred.reduce.tasks=10

你可以拆分成多个输出文件的另一种方法是将有蜂巢插入您的查询的结果到分区表。 这将导致每个分区至少一个文件。 为了使这个道理你必须有一些合理的列进行分区上。 例如,你不会想分区上的唯一的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

为了获得更为精细的控制,您可以编写自己的脚本减少传递给蜂房,有降低脚本写入多个文件。 一旦你写你自己的减速器,你可以做几乎任何你想要的。

最后,你可以放弃试图操纵蜂房输出到您想要的文件的数量,只是打破他们除了自己一旦蜂巢完成。 默认情况下,配置单元存储它的表解压缩,并以纯文本形式在它的仓库目录(例如, /apps/hive/warehouse/table_to_export_to_redshift )。 您可以使用Hadoop的shell命令,MapReduce的工作,猪,或将它们拉入Linux和你喜欢的除了打破它们。

我没有与任何红移经验,所以由红移不管出于什么原因我的一些建议可能不适合食用。

有两点要注意:分割文件到更多,更小的文件一般是不好的Hadoop。 你可能会得到红移的速度增长,但如果文件是由Hadoop的生态系统的其它部分(MapReduce的,蜂巢,猪等)消耗,你可能会看到性能的损失,如果该文件是太小(虽然1GB就可以了) 。 另外,还要确保额外的处理/开发人员的时间是值得的节省时间,你得到的并联红移数据加载。



文章来源: Hive — split data across files