Hive 分区方案及其对性能的影响

Posted

技术标签:

【中文标题】Hive 分区方案及其对性能的影响【英文标题】:Hive partition scenario and how it impacts performance 【发布时间】:2019-10-27 16:27:13 【问题描述】:

我想询问有关 hive 分区数以及它们将如何影响性能的问题。

让我用一个真实的例子来反映这一点;

我有一个外部表,预计每天有大约 5 亿行来自多个来源,它应该有 5 个分区列。

一天,这导致了 250 个分区,并期望保留 1 年,大约 75K.. 我想这是一个巨大的数字,因为当我检查时,hive 可以达到 10K,但之后性能是会很糟糕..(有人告诉我每个表的分区不应超过 1K)。

主要是将从该表中选择的查询

其中 50% 应使用分区的确切顺序。 25% 应仅使用 1-3 个分区,而不使用其他 2 个。 25% 只使用第一个分区

那么,您认为即使保留 1 个月,这也能很好地发挥作用?或者只有开始日期就足够了..假设其他 4 列正态分布(比如说 500M/250 个分区,每个分区我们将有 2M 行)。

【问题讨论】:

不清楚日期的粒度是多少。如果按 yyyy-MM 进行分区,那么一天内不会出现分区爆炸式增长 日期掩码为 yyyMMdd 我需要这个,因为数据总是主要在特定日期访问 每个分区 500M/250 ~ 2M 行?一排平均有多大?您绝对不希望任何单个分区小于 HDFS 块大小。 是的,它比 hdfs 块大,因为我在加载所有数据后在表上进行插入覆盖.. 【参考方案1】:

我会选择 3 个分区列,因为这将 a) 完全匹配约 50% 的查询配置文件,并且 b) 大幅减少(修剪)其他 50% 的扫描分区数量。同时,您无需增加 Hive MetaStore (HMS) 堆内存并增强 HMS 后端数据库以在 250 x 364 = 91,000 个分区上高效工作。

自从引入 10K 限制以来,已经为改进 HMS 中与分区相关的操作做出了重大努力。参见例如 JIRA HIVE-13884,它提供了保持该数字低的动机,并描述了处理高数字的方式:

PartitionPruner 请求所有分区或基于分区 关于过滤器表达式。在任何一种情况下,如果分区数 访问量很大 HMS 可能存在很大的内存压力 服务器端。 ... PartitionPruner [可以]首先获取分区名称(而不是 分区规格)并在分区数时抛出异常 超过配置值。否则,获取分区规范。

请注意,分区规范(上面提到的)和收集的统计信息每个分区(始终建议具有高效查询)是 HMS 应存储和缓存以实现良好性能的大量数据的组成部分。

【讨论】:

@AmrHamza 当然,如果/当您对查询模式有更好的了解时,可以进一步改进这种方法。例如,如果大多数查询针对的是最新数据(比如说,一个月),那么您可以将最后 30 天保留在包含所有 5 个分区列的“在线”表中,并将旧数据暂存到“归档”表中将仅按日期分区。然后,您可以在两个表之间的 UNION 之上创建一个视图,为客户端提供无缝接口。 首先感谢您的详细解答。我同意你的这种归档方法。 但这会引发一个问题。对于归档数据,或者说每天仅对如此大量的数据进行分区,我们是否有洞察力或基准来说明我可以说我不需要在 hive 上进行分区的行数?我从 db 背景问这个问题,因为它总是需要分区才能访问。但是例如在 hive 上,我可以说例如,对于超过 x 百万行的实践,查询会很慢等等? 我知道您提到这些数据很可能已存档,因此延迟不是一个因素。但我问这个,因为我想了解实际上在蜂巢上对一张巨大的桌子进行分类的原因。这将迫使我寻找一个分区来增加性能。 @AmrHamza 我认为没有数字。 Hive 在 MapReduce 上运行时,将根据文件中 blocks 的数量在多个映射器之间拆分文件处理。因此,文件大小本身并不重要,它转化为将(并且可以)并行运行的映射器数量。分区提供了性能提升,因为它允许根据搜索条件消除整个文件目录,而不是因为它会产生更小的文件。

以上是关于Hive 分区方案及其对性能的影响的主要内容,如果未能解决你的问题,请参考以下文章

Hive优化之小文件问题及其解决方案

使用字符串分区键与整数分区键的 Hive/Impala 性能

BigQuery 中 Hive 的显示分区的替代方案

我们可以在 Hive 表的分区内有分区吗?

如何处理 hive 分区以提高性能与过度分区

Hive 分区、分桶和排序表 - 多个插入