hive 或 impala 中的计算表统计信息如何加速 Spark SQL 中的查询?

Posted

技术标签:

【中文标题】hive 或 impala 中的计算表统计信息如何加速 Spark SQL 中的查询?【英文标题】:How does computing table stats in hive or impala speed up queries in Spark SQL? 【发布时间】:2017-01-30 15:48:20 【问题描述】:

为了提高性能(例如连接),建议首先计算表静态。

在 Hive 中我可以做到::

analyze table <table name> compute statistics;

在黑斑羚中:

compute stats <table name>;

我的 spark 应用程序(从 hive 表中读取)是否也受益于预先计算的统计信息?如果是,我需要运行哪一个?他们是否都将统计信息保存在 hive 元存储中?我在 Cloudera 5.5.4 上使用 spark 1.6.1

注意: 在 spark 1.6.1 (https://spark.apache.org/docs/1.6.1/sql-programming-guide.html) 的 Docs of the parameter spark.sql.autoBroadcastJoinThreshold 中我发现了一个提示:

请注意,目前仅支持 Hive Metastore 的统计信息 ANALYZE TABLE COMPUTE STATISTICS 命令所在的表 noscan 已运行。

【问题讨论】:

是否会分析 Hive 中的表并计算 impala 存储中相同元存储或不同位置的存储统计信息?因为我们只在 impala 中运行计算统计信息,但也使用 hive 来运行复杂的查询。 【参考方案1】:

这里是即将推出的 Spark 2.3.0(可能一些功能已经在 2.2.1 或更早版本中发布)。

我的 spark 应用程序(从 hive 表中读取)是否也受益于预先计算的统计信息?

如果 Impala 或 Hive 将表统计信息(例如表大小或行数)记录在 Spark 可以读取的表元数据中的 Hive 元存储中(并转换为自己的 Spark 统计信息以进行查询计划),则可以。

您可以使用spark-shell 中的DESCRIBE EXTENDED SQL 命令轻松查看。

scala> spark.version
res0: String = 2.4.0-SNAPSHOT

scala> sql("DESC EXTENDED t1 id").show
+--------------+----------+
|info_name     |info_value|
+--------------+----------+
|col_name      |id        |
|data_type     |int       |
|comment       |NULL      |
|min           |0         |
|max           |1         |
|num_nulls     |0         |
|distinct_count|2         |
|avg_col_len   |4         |
|max_col_len   |4         |
|histogram     |NULL      |
+--------------+----------+

ANALYZE TABLE COMPUTE STATISTICS noscan 计算 Spark 使用的一个统计数据,即表的总大小(由于noscan 选项,没有行计数指标)。如果 Impala 和 Hive 将其记录到“正确”位置,Spark SQL 将在 DESC EXTENDED 中显示它。

使用DESC EXTENDED tableName 获取表级统计信息,看看您是否找到了由 Impala 或 Hive 生成​​的那些。如果它们在 DESC EXTENDED 的输出中,它们将用于优化连接(并且还为聚合和过滤器启用基于成本的优化)。


列统计信息存储在表属性中(以 Spark 特定的序列化格式),我真的怀疑 Impala 或 Hive 是否可以计算统计信息并将它们存储为 Spark SQL 兼容格式。

【讨论】:

嗨@laskowski,我们想使用 Spark-Cassandra-Connector 通过 Spark 从 Cassandra 查询数据。有趣的是,所有 Cassandra 表都将注册为“临时视图”。请问是否也可以分析临时视图?我试过但失败了。现在确定是因为配置错误还是不受支持。非常感谢您的提示。 “我想知道是否也可以分析临时视图吗?我试过但失败了。” 不可能。临时视图是临时的,因此不能利用任何像元存储这样的永久存储。此外,我认为你不需要那个。所有ANALYZE TABLE 都是为了向规划者提供足够的信息,连接器应该自己轻松处理以提供足够的信息。【参考方案2】:

我假设您在 Spark(或)带有 Hive 上下文的 Spark-Sql 上使用 Hive。如果是这种情况,您应该在 hive 中运行分析。

分析表<...> 通常需要在表创建后或有重大插入/更改时运行。如果这是 MR 或 spark 作业,您可以在加载步骤结束时执行此操作。

在分析时,如果您在 spark 上使用 hive - 请同时使用下面链接中的配置。您可以在会话级别为每个查询设置此项。我在生产中使用了这个链接https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark%3A+Getting+Started中的参数,它工作正常。

【讨论】:

【参考方案3】:

据我了解,impala 上的计算统计数据是最新的实现,让您无需调整配置单元设置。

来自官方文档:

如果您使用基于 Hive 的方法收集统计信息,请参阅 Hive wiki 获取有关 Hive 所需配置的信息 边。 Cloudera 建议使用 Impala COMPUTE STATS 语句来 避免潜在的配置和可扩展性问题 统计数据收集过程。

如果您运行 Hive 语句 ANALYZE TABLE COMPUTE STATISTICS FOR COLUMNS,Impala 只能使用生成的列统计信息,如果 表未分区。 Impala 无法使用 Hive 生成​​的列 分区表的统计信息。

有用的链接: https://www.cloudera.com/documentation/enterprise/5-5-x/topics/impala_perf_stats.html

【讨论】:

不幸的是,这仅回答了 Impala 的问题,而不是 Spark 是否可以使用据此计算的统计数据。

以上是关于hive 或 impala 中的计算表统计信息如何加速 Spark SQL 中的查询?的主要内容,如果未能解决你的问题,请参考以下文章

impala 实操

如何摆脱 Hive/Impala 中的重复计数

通过 Hive 或 Impala 或 Pig 中的字符串匹配连接表

使用 Impala 或 Hive 提取表列中的多个字符串元素

如何安装SAS并配置连接Hive/Impala

如何使 Hive 查询利用存储在 Metastore 中的统计信息