从 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 上下文中看到执行此操作的方法。【问题讨论】:
关于 SparkHiveContext
:它使作业能够在客户端/服务器模式下与 Hive Metastore 交互。但它完全不知道其他作业同时对 Metastore 做什么——即其他 Spark 作业、Pig 作业、Impala 查询、Hive CLI 查询、HiveServer2 查询、Hue 浏览会话......
【参考方案1】:
REFRESH
和 INVALIDATE METADATA
命令特定于 Impala。
您必须连接到 Impala 守护程序才能运行这些 - 这会触发 Impala 特定元数据缓存的刷新 (在您的情况下,您可能只需要每个分区中文件列表的 REFRESH
,而不是批发INVALIDATE
从头开始重建所有分区及其所有文件的列表)
您可以使用 Spark SqlContext
通过 JDBC 连接到 Impala 并读取数据——但不能运行任意命令。该死。所以你回到了基础:
*.*.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 无效的主要内容,如果未能解决你的问题,请参考以下文章
当结构中的所有值都为空时,如何在 Scala spark 中使结构为空?