我想询问配置单元分区的数量以及它们将如何影响性能。
让我以一个真实的例子来思考这一点;
我有一个外部表,预计每天有来自多个源的大约5亿行,它将有5个分区列。
一天内,这导致了250个分区,预计1年的保留期将达到约75K。。我想这是一个巨大的数字,因为当我检查时,hive可以达到10公里,但之后的性能会很差。。(有人告诉我,每个表的分区不应超过1K(。
主要是将从此表中选择的查询
其中50%应使用分区的确切顺序。。25%应仅使用1-3个分区,而不使用其他2个分区。25%仅使用第一分区
那么,你认为即使保留一个月,这也能很好地工作吗?或者只有开始日期就足够了。。假设其他4列正态分布(假设500M/250个分区,每个分区应有2M行(。
我会选择3个分区列,因为这将a(精确匹配50%的查询配置文件,b(大幅减少(修剪(其他50%的扫描分区数量。同时,您将不会面临增加Hive MetaStore(HMS(堆内存和增强HMS后端数据库的压力,以便使用250 x 364=91000个分区高效工作。
自从引入10K限制以来,已经做出了重大努力来改进HMS中与分区相关的操作。例如,参见JIRA HIVE-13884,它提供了保持低数字的动机,并描述了处理高数字的方式:
PartitionPruner请求所有分区或基于分区关于筛选器表达式。在任何一种情况下,如果分区的数量访问量很大,HMS可能会有很大的内存压力服务器端。…PartitionPruner[can]首先获取分区名称(而不是分区规范(,并在分区数为超过了配置的值。否则,获取分区规范。
请注意,分区规范(如上所述(和每个分区收集的统计信息(为了高效查询,总是建议使用(构成了HMS应该存储和缓存的大量数据,以获得良好的性能。