从 spark 代码中使 metadata/refresh imapala 无效

Invalidate metadata/refresh imapala from spark code

我正在开发一个 NRT 解决方案,它要求我经常更新 Impala table 上的元数据。

目前这个失效是在我的 spark 代码有 运行 之后完成的。 我想通过直接从我的 Spark 代码执行此操作 refresh/invalidate 来加快速度。

最有效的方法是什么?

REFRESHINVALIDATE METADATA 命令特定于 Impala。
你必须连接到一个 Impala 守护进程才能 运行 这些 - 这会触发 Impala 特定元数据缓存的刷新 (在你的情况下你可能只需要 REFRESH 每个分区中的文件列表,而不是批发 INVALIDATE 从头开始​​重建所有分区及其所有文件的列表)

您可以使用 Spark SqlContext 通过 JDBC 和 读取 数据连接到 Impala -- 但不是 运行任意命令。该死。所以你回到了基础:

  • 下载最新的Cloudera JDBC driver for Impala
  • 将其安装在您运行您的 Spark 作业所在的服务器上
  • 列出您的 *.*.extraClassPath 属性中的所有 JAR
  • 开发一些 Scala 代码以针对 Impala 守护程序和 运行 任意命令(例如 REFRESH somedb.sometable)打开 JDBC 会话 -- 困难的方法

希望Google能找到一些JDBC/Scala代码的例子,比如this one

不需要以上所有步骤,您可以编写以下代码并执行无效元数据查询 impala table.

impala_node_ip_address = "XX.XX.XX.XX"
impala Query = "impala-shell -i "+"\"" + str(impala_node_ip_address) + "\"" + " -k -q " + "\""+"invalidate metadata DBNAME"+"." + "TableName" + "\""

这似乎已被 Impala 3.3.0 修复(参见 "Metadata Performance Improvements" here 部分):

Automatic invalidation of metadata

With automatic metadata management enabled, you no longer have to issue INVALIDATE / REFRESH in a number of conditions.

In Impala 3.3, the following additional event in Hive Metastore can trigger automatic INVALIDATE / REFRESH of Metadata:

  • INSERT into tables and partitions from Impala or from Spark on the same or multiple cluster configuration