我正在开发一个NRT解决方案,要求我经常更新Impala表上的元数据。
目前,这个失效是在我的火花代码运行后完成的。 我希望通过直接从我的Spark代码执行刷新/无效来加快速度。
什么是最有效的方法?
答案 0 :(得分:8)
REFRESH
和INVALIDATE METADATA
命令特定于Impala
您必须连接到Impala守护程序才能运行这些 - 这会触发刷新Impala特定的元数据缓存(在您的情况下,您可能只需要REFRESH
的文件列表每个分区,而不是批发INVALIDATE
,以便从头开始重建所有分区及其所有文件的列表)
您可以使用Spark SqlContext
通过JDBC和读取数据连接到Impala,但不能运行任意命令。该死的。所以你回到了基础:
*.*.extraClassPath
属性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" + "\""