从 Spark 代码中使元数据/刷新 imapala 无效

Posted

技术标签:

【中文标题】从 Spark 代码中使元数据/刷新 imapala 无效【英文标题】:Invalidate metadata/refresh imapala from spark code 【发布时间】:2016-07-06 09:29:38 【问题描述】:

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

目前,此失效是在我的 spark 代码运行后完成的。 我想通过直接从我的 Spark 代码执行此刷新/无效来加快速度。

最有效的方法是什么?

Oozie 太慢了(30 秒开销?不,谢谢) 对(边缘)节点的 SSH 操作似乎是一个有效的解决方案,但感觉“骇人听闻” 我也没有从 Spark 的 hive 上下文中看到执行此操作的方法。

【问题讨论】:

关于 Spark HiveContext :它使作业能够在客户端/服务器模式下与 Hive Metastore 交互。但它完全不知道其他作业同时对 Metastore 做什么——即其他 Spark 作业、Pig 作业、Impala 查询、Hive CLI 查询、HiveServer2 查询、Hue 浏览会话...... 【参考方案1】:

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

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

下载最新Cloudera JDBC driver for Impala 将其安装在运行 Spark 作业的服务器上 列出*.*.extraClassPath 属性中的所有JAR 开发一些 Scala 代码来打开一个针对 Impala 守护进程的 JDBC 会话并运行任意命令(例如 REFRESH somedb.sometable)——这很难

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

【讨论】:

【参考方案2】:

似乎这已由 Impala 3.3.0 修复(参见“元数据性能改进”部分here):

元数据自动失效

启用自动元数据管理后,您不再需要在多种情况下发出 INVALIDATE / REFRESH。

在 Impala 3.3 中,Hive Metastore 中的以下附加事件可以触发元数据的自动 INVALIDATE / REFRESH:

在相同或多个集群配置上从 Impala 或 Spark 插入表和分区

【讨论】:

【参考方案3】:

以上所有步骤都不是必需的,您可以编写以下代码并对 impala 表执行无效元数据查询。

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

【讨论】:

如问题中所述,我想从我的代码中做 I,而不是作为外部脚本。除了走 JDBC 路线之外,没有其他选择。

以上是关于从 Spark 代码中使元数据/刷新 imapala 无效的主要内容,如果未能解决你的问题,请参考以下文章

Impala 通过 jdbc 使元数据无效

当结构中的所有值都为空时,如何在 Scala spark 中使结构为空?

如何在 Vue js 中使 localStorage 中的数据具有反应性

在 Spark Streaming 中刷新 RDD

ArcEngine中IMap的选择集刷新问题

csharp 使元组更容易使用