指定从配置单元插入生成的最小文件数

ha5z0ras  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(269)

我使用aws emr上的配置单元将查询结果插入到按日期分区的配置单元表中。虽然每天的总输出大小是相似的,但是生成的文件的数量是不同的,通常在6到8之间,但是有时它只创建一个大文件。我重新运行了几次查询,以防文件的数量恰好受到集群中节点可用性的影响,但看起来是一致的。
所以我的问题是(a)是什么决定了生成多少个文件,以及(b)有没有办法指定每个文件的最小文件数或(甚至更好)最大大小?

byqmnocz

byqmnocz1#

过程中生成的文件数 INSERT ... SELECT 取决于在final reducer上运行的进程数(如果在tez上运行,则为final reducer vertex)加上每个配置的reducer的字节数。
如果表已分区并且没有 DISTRIBUTE BY 在最坏的情况下,每个reducer在每个分区中创建文件。这会在减速器上产生高压,并可能导致oom异常。
要确保reducer每个只写一个分区文件,请添加 DISTRIBUTE BY partition_column 在查询结束时。
如果数据量太大,并且您希望使用更多的缩减器来提高并行性并为每个分区创建更多的文件,请向distribute by中添加随机数,例如使用以下方法: FLOOR(RAND()*100.0)%10 -它将通过随机的10个bucket另外分发数据,因此在每个分区中将有10个文件。
最后,插入的句子将如下所示:

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;

如果你有太多的数据,Hive将启动更多的减速机处理不超过 bytes per reducer 每种工艺都有规定。缩减器越多,生成的文件就越多。减少此设置可能会增加正在运行的还原程序的数量,并且每个还原程序将至少创建一个文件。如果分区列不在 distribute by 然后每个reducer可以在每个分区中创建文件。
长话短说,用

DISTRIBUTE BY  part_col, FLOOR(RAND()*100.0)%10 -- 10 files per partition

如果每个分区需要20个文件,请使用floor(rand()*100.0)%20;-如果您有足够的数据,这将保证每个分区至少有20个文件,但不能保证每个文件的最大大小。
字节/缩减器设置不能保证它是固定的最小文件数。文件数将取决于总数据大小/bytes.per.reducer。此设置将保证每个文件的最大大小。
但最好使用一些均匀分布的键或低基数的组合,而不是随机的,因为在容器重新启动的情况下,rand()可能会为相同的行生成不同的值,并且可能会导致数据重复或丢失(某些reducer输出中已经存在的相同数据将再次分发给另一个reducer)。您可以在一些可用的键上计算类似的函数,而不是 rand() 以较低的基数获得大致均匀分布的密钥。
您可以将这两种方法结合使用:字节/缩减器限制+分发方式来控制最小文件数和最大文件大小。
同时阅读关于使用 distribute by 要在减速器之间均匀分布数据:https://stackoverflow.com/a/38475807/2700344

相关问题