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