Hive:任何禁用分区统计的方法



问题总结:

每当我向动态分区表中插入数据时,太多的时间都花在更新metastore中的分区统计信息上。

更多细节:

我有几个查询,从一个hive表中选择数据并将其插入到另一个表中,该表被动态划分为大约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。

我试过设置一些"蜂巢"。但是关于这些设置的文档很少,所以我不知道它们到底应该做什么。具体来说,我试过设置:

set hive.stats.autogather=false;
set hive.stats.collect.rawdatasize=false;

任何关于如何防止Hive试图跟踪分区统计数据的建议将非常感谢!

使用set hive.stats.autogather=false将不会在应用程序内生效。原因是在创建Hive连接时,会将Hive的配置配置到metastore,一旦配置完成,就不能再修改了。

可以通过以下两种方式禁用统计信息:

1。通过Hive shell

使用Hive shell,输入hive --hiveconf hive.stats.autogather=false

2。更新hive-site.xml

hive-site.xml中更新以下内容,重新启动Hive会话。

<property>
  <name>hive.stats.autogather</name>
  <value>false</value>
</property>

https://cwiki.apache.org/confluence/display/Hive/StatsDev

根据Hive文档,这应该能够禁用分区上的统计信息:

set hive.stats.autogather=false;

最新更新