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
1条答案
按热度按时间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个文件。最后,插入的句子将如下所示:
此配置设置还影响生成的文件数:
如果你有太多的数据,Hive将启动更多的减速机处理不超过
bytes per reducer
每种工艺都有规定。缩减器越多,生成的文件就越多。减少此设置可能会增加正在运行的还原程序的数量,并且每个还原程序将至少创建一个文件。如果分区列不在distribute by
然后每个reducer可以在每个分区中创建文件。长话短说,用
如果每个分区需要20个文件,请使用floor(rand()*100.0)%20;-如果您有足够的数据,这将保证每个分区至少有20个文件,但不能保证每个文件的最大大小。
字节/缩减器设置不能保证它是固定的最小文件数。文件数将取决于总数据大小/bytes.per.reducer。此设置将保证每个文件的最大大小。
但最好使用一些均匀分布的键或低基数的组合,而不是随机的,因为在容器重新启动的情况下,rand()可能会为相同的行生成不同的值,并且可能会导致数据重复或丢失(某些reducer输出中已经存在的相同数据将再次分发给另一个reducer)。您可以在一些可用的键上计算类似的函数,而不是
rand()
以较低的基数获得大致均匀分布的密钥。您可以将这两种方法结合使用:字节/缩减器限制+分发方式来控制最小文件数和最大文件大小。
同时阅读关于使用
distribute by
要在减速器之间均匀分布数据:https://stackoverflow.com/a/38475807/2700344