Cloudera Impala INVALIDATE METADATA

5

正如Impala教程中所讨论的那样,Impala使用一个被Hive共享的元数据存储。但是如果你在Hive上创建或修改表格,需要执行INVALIDATE METADATAREFRESH命令来通知Impala更新更改。

因此,我感到困惑,我的问题是:如果元数据数据库是共享的,为什么需要由Impala执行INVALIDATE METADATAREFRESH命令?

如果是为了Impala缓存元数据,为什么守护程序不会在出现缓存失误时自动更新其缓存而不需要手动刷新元数据?

任何帮助都将不胜感激。

3个回答

6

好的!让我们从评论中的问题开始,什么是集中式元存储的好处。

使用集中式元存储不需要用户在两个不同位置维护元数据,一个用于Hive,一个用于Impala。用户可以有一个中央存储库,两个工具都可以访问此位置以获取任何元数据信息。

现在,第二部分,为什么在元存储共享时需要执行INVALIDATE METADATA或REFRESH操作?

Impala利用大规模并行处理范例来完成工作。它将元数据保留在执行器节点上,而不是针对每个查询从集中式元存储读取,这样可以完全跳过冷启动,在读取元数据时节省大量时间。

INVALIDATE METADATA / REFRESH会将元数据/块信息传播到执行器节点。

为什么要手动执行?

在早期版本的Impala中,没有catalogd进程。需要通过上述命令传播元数据更新。从Impala 1.2开始,添加了catalogd进程,该过程将Impala SQL语句中的元数据更改传递给群集中的所有节点。

因此,无需手动执行!

希望能对你有所帮助。


一个非常清晰的解释。在我看来,每次对底层数据进行修改(如添加或删除数据文件)后,都应该使用 INVALIDATE METADATA。 - Ameba Spugnosa

4

@masoumeh 当你通过Impala SQL语句修改表格时,无需使用INVALIDATE METADATA or REFRESH,这项工作由catalogd完成。但是,当您插入:

  1. 一个新的表通过HIVEsqoop import .... --hive-import ...,那么您需要通过Impala-Shell执行:INVALIDATE METADATA tableName

  2. 新的数据文件添加到现有表中(追加数据),那么您需要执行:REFRESH tableName,因为您想要的是最后一次添加信息的元数据。


3

这是一个共享的过程,但是Impala会缓存元数据并在其优化器中使用统计信息,但如果在Hive中更改了元数据,则必须手动告诉Impala刷新其缓存,这有点不方便。但是,如果您在Impala中创建/更改表格,则无需在Hive端执行任何操作。


谢谢回复。我已经学习了Impala的缓存机制,因为它似乎不够成熟,所以我对自己的理解产生了怀疑!我认为在出现缓存未命中时使用与Hive共享的数据库并手动刷新缓存是不合理的,这是Impala的一个弱点!尽管存在这种机制,但Impala共享元数据数据库的好处是什么? - masoumeh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接