查询具有大量列的 Hive 表时,是不是可以减少 MetaStore 检查的数量?

Posted

技术标签:

【中文标题】查询具有大量列的 Hive 表时,是不是可以减少 MetaStore 检查的数量?【英文标题】:Is it possible to reduce the number of MetaStore checks when querying a Hive table with lots of columns?查询具有大量列的 Hive 表时,是否可以减少 MetaStore 检查的数量? 【发布时间】:2020-01-09 13:48:33 【问题描述】:

我在 databricks 上使用 spark sql,它使用 Hive 元存储,并且我正在尝试设置一个使用相当多列 (20+) 的作业/查询。

运行 Metastore 验证检查所需的时间与我的查询中包含的列数呈线性关系 - 有没有办法跳过这一步?还是预先计算检查?或者至少让 Metastore 每个表只检查一次,而不是每列检查一次?

一个小例子是,当我运行以下命令时,即使在调用 display 或 collect 之前,元存储检查器也会发生一次:

new_table = table.withColumn("new_col1", F.col("col1")

当我运行以下命令时,元存储检查器会发生多次,因此需要更长的时间:

new_table = (table
.withColumn("new_col1", F.col("col1")
.withColumn("new_col2", F.col("col2")
.withColumn("new_col3", F.col("col3")
.withColumn("new_col4", F.col("col4")
.withColumn("new_col5", F.col("col5")
)

元存储检查它在驱动程序节点中的表现如下:

20/01/09 11:29:24 INFO HiveMetaStore: 6: get_database: xxx
20/01/09 11:29:24 INFO audit: ugi=root    ip=unknown-ip-addr    cmd=get_database: xxx

用户对数据块的看法是:

Performing Hive catalog operation: databaseExists
Performing Hive catalog operation: tableExists
Performing Hive catalog operation: getRawTable
Running command...

我很想知道是否有人可以确认这就是它的工作方式(每列一次元存储检查),以及我是否只需要计划元存储检查的开销。

【问题讨论】:

为什么不关闭 Metastore 验证? hive.metastore.schema.verification false hive.metastore.schema.verification.record.version false 另外,什么是spark版本?你可以看看这个:kb.databricks.com/metastore/hive-metastore-troubleshooting.html 【参考方案1】:

我对这种行为感到惊讶,因为它不适合 Spark 处理模型,并且我无法在 Scala 中复制它。它可能是 PySpark 特有的,但我对此表示怀疑,因为 PySpark 只是用于创建 Spark 计划的 API。

然而,正在发生的事情是,在每个withColumn(...) 之后分析该计划。如果计划很大,这可能需要一段时间。但是,有一个简单的优化。用df.select(F.col("*"), F.col("col2").as("new_col2"), ...) 替换对独立 列的多个withColumn(...) 调用。在这种情况下,将只执行一次分析。

在某些超大型计划的情况下,我们为单个笔记本单元节省了 10 多分钟的分析时间。

【讨论】:

以上是关于查询具有大量列的 Hive 表时,是不是可以减少 MetaStore 检查的数量?的主要内容,如果未能解决你的问题,请参考以下文章

Hive分区表

加载到 Hive 分区 Parquet 表时内存不足

ORA-00907 在尝试创建具有自动列的表时

从 PySpark 查询 Hive 表时出错

PostgreSQL 查询帮助:如何检查多个列的值是不是同时增加/减少

Hive 命令行 如果它不是在后台映射减少作业,则选择查询时间不正确