问题摘要:
每当我将数据插入到动态分区表中时,花费的时间就会花费很多时间来更新Metastore中的分区统计信息。
更多详情:
我有几个查询从一个配置单元表中选择数据并将其插入到另一个动态分区为大约8000个分区的表中。查询快速准确地完成。输出文件很快就会复制到分区目录中。但是这会发生在每个分区:
INFO HiveMetaStore.audit (HiveMetaStore.java:logAuditEvent(253)) - ugi=hive ip=unknown-ip-addr cmd=append_partition : db=default tbl=some_table[14463,1410]
WARN hive.log (MetaStoreUtils.java:updatePartitionStatsFast(284)) - Updating partition stats fast for: some_table
WARN hive.log (MetaStoreUtils.java:updatePartitionStatsFast(292)) - Updated size to 1042
每次这样的分区更新大约需要500毫秒。但是当这些更新发生时,Hive会对整个表格进行独占锁定,并且有8000个这样的分区,这意味着我的表被锁定了不可接受的长时间。
在我看来,必须某种方式来禁用这些分区统计信息,而不会过于严重地影响Hive的性能;毕竟,我可以手动将文件复制到这些分区,而根本不涉及Hive。
我已经尝试了一些" hive.stats"设置,但这些设置的文档很少,所以我不确切知道他们应该做什么。具体来说,我尝试过设置:
set hive.stats.autogather=false;
set hive.stats.collect.rawdatasize=false;
有关如何防止Hive试图跟踪分区统计信息的任何建议将非常感谢!
答案 0 :(得分:1)
使用set hive.stats.autogather=false
不会在应用程序中生效。原因是当创建Hive连接时,它会将配置单元配置为Metastore,一旦配置完成,就不能再进行修改了。
您可以通过两种方式禁用统计信息:
使用Hive shell,键入hive --hiveconf hive.stats.autogather=false
。
在hive-site.xml
中更新以下内容并重新启动Hive会话。
<property>
<name>hive.stats.autogather</name>
<value>false</value>
</property>
答案 1 :(得分:0)
https://cwiki.apache.org/confluence/display/Hive/StatsDev
根据Hive文档,这应该能够禁用分区的统计信息:
set hive.stats.autogather=false;