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

时间:2016-07-06 09:29:39

标签: hadoop apache-spark impala

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

目前,这个失效是在我的火花代码运行后完成的。 我希望通过直接从我的Spark代码执行刷新/无效来加快速度。

什么是最有效的方法?

  • Oozie太慢了(开头30秒?不,谢谢)
  • 对(边缘)节点的SSH操作似乎是一个有效的解决方案,但感觉“hackish”
  • 我没有看到从Spark的hive上下文中做到这一点的方法。

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:1)

似乎此问题已由Impala 3.3.0修复(请参阅“元数据性能改进”一节here):

  

元数据自动失效

     

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

     

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

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

答案 2 :(得分:-1)

不需要上述所有步骤,您可以编写以下代码,并对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" + "\""