gpt4 book ai didi

hive - 指定从 Hive 插入生成的文件的最小数量

转载 作者:行者123 更新时间:2023-12-04 11:56:01 25 4
gpt4 key购买 nike

我在 AWS EMR 上使用 Hive 将查询结果插入到按日期分区的 Hive 表中。虽然每天的总输出大小相似,但生成的文件数量各不相同,通常在 6 到 8 个之间,但有时它只会创建一个大文件。我重新运行了几次查询,以防万一文件数量碰巧受到集群中节点可用性的影响,但它似乎是一致的。

所以我的问题是
(a) 是什么决定了生成多少文件以及
(b) 有没有办法指定最小文件数或(甚至更好)每个文件的最大大小?

最佳答案

INSERT ... SELECT期间生成的文件数取决于在最终 reducer 上运行的进程数(如果您在 Tez 上运行,则为最终 reducer 顶点)加上配置的每个 reducer 的字节数。

如果表被分区并且没有DISTRIBUTE BY指定,然后在最坏的情况下每个 reducer 在每个分区中创建文件。这会给 reducer 带来很大的压力,并可能导致 OOM 异常。

为了确保reducer每个只写入一个分区文件,添加DISTRIBUTE BY partition_column在您的查询结束时。

如果数据量太大,并且您想要更多的 reducer 来增加并行度并为每个分区创建更多文件,请向分发添加随机数,例如使用: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; 

如果你有太多的数据,Hive 会启动更多的 reducer 来处理不超过 bytes per reducer在每个 reducer 进程上指定。 reducer 越多 - 生成的文件就越多。减少此设置可能会导致运行的 reducer 数量增加,并且它们将为每个 reducer 创建至少一个文件。如果分区列不在 distribute by 中那么每个reducer可能会在每个分区中创建文件。

长话短说,使用
DISTRIBUTE BY  part_col, FLOOR(RAND()*100.0)%10 -- 10 files per partition

如果你想要每个分区 20 个文件,使用 FLOOR(RAND()*100.0)%20; - 如果您有足够的数据,这将保证每个分区至少有 20 个文件,但不能保证每个文件的最大大小。

每个 reducer 设置的字节数不保证它将是固定的最小文件数。文件数量取决于总数据大小/bytes.per.reducer。 此设置将保证每个文件的最大大小。

但最好使用一些均匀分布的 key 或低基数的组合而不是随机 因为在容器重新启动的情况下,rand() 可能会为相同的行产生不同的值,并且可能导致数据重复或丢失(某些 reducer 输出中已经存在的相同数据将再次分配给另一个 reducer )。您可以在一些可用的键上计算类似的函数而不是 rand()获得或多或少均匀分布的低基数 key 。

您可以结合使用这两种方法:每个 reducer 限制的字节数 + 分发方式来控制最小文件数和最大文件大小。

另请阅读有关使用 distribute by 的答案在 reducer 之间均匀分布数据: https://stackoverflow.com/a/38475807/2700344

关于hive - 指定从 Hive 插入生成的文件的最小数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55372028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com