Impala的命令COMPUTE STATS
COMPUTE STATS主要作用:
收集有关表中数据的容量和分布以及所有相关列和分区的信息。这些信息存储在metastore数据库中,Impala使用这些信息来帮助优化查询。例如,如果Impala可以确定一个表是大是小,或者有很多或很少不同的值,它就可以为一个连接查询或插入操作适当地组织并行化工作。
语法:
COMPUTE STATS [db_name.]table_name
COMPUTE INCREMENTAL STATS [db_name.]table_name [PARTITION (partition_spec)]
(PARTITION)只允许分区子句与增量子句组合使用。对于计算增量统计,它是可选的,对于删除增量统计,它是必需的。当您在COMPUTE INCREMENTAL STATS或DROP INCREMENTAL STATS语句中通过PARTITION (partition_spec)子句指定分区时,必须在规范中包含所有分区列,并为所有分区键列指定常量值。
最初,Impala依赖于用户来运行Hive分析表语句,但是这种收集统计数据的方法被证明是不可靠且难以使用的。Impala COMPUTE STATS语句从头开始构建,以提高该操作的可靠性和用户友好性。COMPUTE STATS不需要任何设置步骤或特殊配置。您只运行一个Impala COMPUTE STATS语句来收集表和列的统计信息,而不是针对每种统计信息分别运行Hive ANALYZE表语句。
COMPUTE INCREMENTAL STATS变体是分区表的快捷方式,它只在分区的一个子集上工作,而不是整个表。增量特性使它适合于具有许多分区的大型表,在这些表中,每次添加或删除一个分区时,完整的COMPUTE STATS操作都要花费很长时间。有关详细使用情况,请参见增量统计的概述。
计算增量统计仅适用于分区表。如果对未分区表使用INCREMENTAL子句,Impala会自动使用原始的COMPUTE STATS语句。这样的表在显示表stats输出的Incremental stats列下显示false。
Note:由于许多性能最关键、资源最密集的操作都依赖于表和列统计信息来构建准确、高效的计划,因此计算统计信息是ETL过程最后的一个重要步骤。
在慢速查询的性能调优期间,或在内存不足的情况下进行故障排除时,第一步是在所有表上运行COMPUTE STATS:
准确的统计数据有助于Impala为连接查询构建高效的查询计划,提高性能并减少内存使用。
准确的统计数据有助于Impala有效地将插入操作分配到拼花表中,提高性能并减少内存使用。
准确的统计数据可以帮助Impala估计每个查询所需的内存,这在使用资源管理特性(如许可控制和纱线资源管理框架)时非常重要。统计数据帮助Impala实现高并发性,充分利用可用内存,避免与其他Hadoop组件的工作负载争用。
复杂类型的考虑:
目前,COMPUTE STATS语句创建的统计信息不包括关于复杂类型列的信息。复杂列的列统计指标总是显示为-1。对于涉及复杂类型列的查询,Impala使用启发式方法来估计这些列中的数据分布。
HBase注意事项:
COMPUTE STATS也适用于HBase表。为HBase表收集的统计信息与为hdfs支持的表收集的统计信息有所不同,但是在连接查询中涉及到HBase表时,仍然使用元数据进行优化。
性能注意事项:
COMPUTE STATS收集的统计信息用于优化连接查询、向拼花表插入操作和其他资源密集型SQL语句。
对于大型表,COMPUTE STATS语句本身可能需要很长时间,您可能需要调优它的性能。
COMPUTE STATS语句不能与EXPLAIN语句或impala-shell中的SUMMARY命令一起工作。
您可以使用impala-shell中的概要文件语句来整体检查语句的计时信息。
如果一个基本的COMPUTE STATS语句对于一个分区表花费了很长时间,那么可以考虑切换到COMPUTE INCREMENTAL STATS语法,以便每次只分析新添加的分区。
文件格式注意事项:
COMPUTE STATS语句处理使用Impala支持的任何文件格式创建的表。有关使用不同文件格式的详细信息,请参见Impala如何处理Hadoop文件格式。根据表的文件格式,以下考虑适用于计算统计信息。
COMPUTE STATS语句对文本表没有任何限制。这些表可以通过Impala或Hive创建。
COMPUTE STATS语句适用于拼花表。这些表可以通过Impala或Hive创建。
COMPUTE STATS语句可以不受CDH 5.4 / Impala 2.2或更高版本中Avro表的限制。在以前的版本中,COMPUTE STATS只适用于通过Hive创建的Avro表,并且要求CREATE TABLE语句使用sql风格的列名和类型,而不是Avro风格的模式规范。
COMPUTE STATS语句对RCFile表没有任何限制。这些表可以通过Impala或Hive创建。
COMPUTE STATS语句可以处理没有限制的SequenceFile表。这些表可以通过Impala或Hive创建。
COMPUTE STATS语句处理分区表,不管所有分区使用相同的文件格式,还是通过ALTER TABLE定义某些分区以使用不同的文件格式。
DDL语句类型:
取消:当在内部运行INSERT或SELECT操作时,某些多阶段语句(创建表作为SELECT和COMPUTE STATS)可以在某些阶段取消。取消这个语句,使用ctrl - c从impala-shell解释器,取消按钮看页面的色调,行动>从查询列表中取消Cloudera经理,或取消从动态查询列表中(为特定节点)的查询选项卡上的黑斑羚web UI(端口25000)。
目前,CDH 4下的COMPUTE STATS语句不存储小数列的任何统计信息。当Impala在CDH 5下运行时,它在metastore数据库中对DECIMAL有更好的支持,COMPUTE STATS确实收集了DECIMAL列的统计信息,而Impala使用这些统计信息来优化查询性能。
Note:在Impala 1.4.0之前,COMPUTE STATS统计每个列中的空值数量,并将该数字记录在metastore数据库中。因为Impala目前在查询规划期间不使用空计数,所以Impala 1.4.0及更高版本通过跳过这个空计数来加速COMPUTE STATS语句。
内部细节:
在后台,COMPUTE STATS语句执行两条语句:一条通过count(*)函数计算表中每个分区(或者未分区的整个表)的行数,另一条通过NDV()函数计算每列中不同值的近似数量。您可能在监视和诊断显示中看到这些查询。影响其他查询的性能、可伸缩性和执行的因素(如并行执行、内存使用、允许控制和超时)也适用于COMPUTE STATS语句运行的查询。
HDFS权限:
impalad守护进程所运行的用户ID(通常是impala用户)必须具有源目录中所有受影响文件的读权限:未分区表中的所有文件或计算统计表中的分区表;如果是计算增量统计,则为不包含增量统计的分区中的所有文件。它还必须具有所有包含数据文件的相关目录的读取和执行权限。(本质上,COMPUTE STATS需要与它对表运行的底层SELECT查询相同的权限。)