我在AWS EMR上使用Hive将查询结果插入日期分区的Hive表中。尽管每天的总输出大小相似,但生成的文件数不同,通常在6到8之间,但有些天只创建一个大文件。我重新运行了查询几次,以防文件数量受群集中节点可用性的影响,但似乎是一致的。
(a) 是什么确定生成的文件数?
(b) 是否有一种方法可以指定最小文件数或(更好的)每个文件的最大大小?
INSERT ... SELECT
生成的文件数量取决于最终Reducer上运行的进程数(如果在Tez上运行,则为最终Reducer顶点)加上配置的每个Reducer字节数。
如果表被分区且未指定DISTRIBUTE BY
,则在最坏情况下,每个Reducer都会在每个分区中创建文件。这会对Reducer造成很大的压力,并可能导致OOM异常。
为确保Reducers仅编写一个分区文件,请在查询末尾添加DISTRIBUTE BY partition_column
。
如果数据量太大,您希望增加并行性并在每个分区中创建更多文件,则将随机数添加到分布式中,例如使用此代码:FLOOR(RAND()*100.0)%10
- 它将通过随机10个桶将数据额外分配,因此每个分区将有10个文件。
最后,您的INSERT语句将如下所示:
INSERT OVERWRITE table PARTITION(part_col)
SELECT *
FROM src
DISTRIBUTE BY part_col, FLOOR(RAND()*100.0)%10; --10 files per partition
此配置设置还影响生成的文件数量:
set hive.exec.reducers.bytes.per.reducer=67108864;
DISTRIBUTE BY part_col, FLOOR(RAND()*100.0)%10 -- 10 files per partition