正如在impala教程中讨论的那样,Impala使用Hive共享的Metastore。但有人提到,如果使用配置单元在表上创建或执行某些版本,则应执行INVALIDATE METADATA
或REFRESH
命令以通知impala有关更改。
所以我感到困惑,我的问题是:如果共享元数据库,为什么需要用impala执行INVALIDATE METADATA
或REFRESH
?
如果它是用于通过impala缓存元数据,为什么守护进程不会在缓存未命中时自动更新缓存而无需手动刷新元数据?
任何帮助表示赞赏。
好!让我们从评论中的问题开始,即集中式元存储的好处是什么。
拥有一个中央元存储不需要用户在两个不同的位置维护元数据,每个位置用于Hive和Impala。用户可以拥有一个中央存储库,这两个工具都可以访问此位置以获取任何元数据信息。
现在,第二部分,为什么在共享元存储时需要执行INVALIDATE METADATA或REFRESH?
Impala利用大规模并行处理范例来完成工作。它不是从每个查询的集中式元存储中读取,而是倾向于将元数据与执行器节点保持在一起,以便它可以完全绕过COLD STARTS,其中可能花费大量时间来读取元数据。
INVALIDATE METADATA / REFRESH将元数据/块信息传播到执行程序节点。
为什么要手动?
在早期版本的Impala中,编目进程不存在。元数据更新需要通过上述命令传播。启动Impala 1.2后,将添加catalogd,此过程会将元数据更改从Impala SQL语句中继到集群中的所有节点。
因此无需手动完成!
希望有所帮助。
它是共享的,但Impala缓存元数据并在其优化器中使用其统计信息,但如果它在配置单元中更改,则必须手动告诉impala刷新其缓存,这有点不方便。但是如果你在impala中创建/更改表,则不必在hive端做任何事情。
@masoumeh当您通过Impala SQL语句修改表时不需要INVALIDATE METADATA or REFRESH
,此作业由catalogd完成。但是当你插入:
sqoop import .... --hive-import ...
然后你必须做:INVALIDATE METADATA tableName
通过Impala-Shell。existing
表(附加数据)然后你必须:REFRESH tableName
,因为你唯一想要的是最后添加的信息的元数据。