Cloudera Impala 使元数据无效

Cloudera Impala INVALIDATE METADATA

正如在 impala 教程中讨论的那样,Impala 使用 Hive 共享的 Metastore。但已经提到,如果您使用配置单元在表上创建或执行某些版本,您应该执行 INVALIDATE METADATAREFRESH 命令以通知 impala 有关更改。

所以我很困惑,我的问题是:如果元数据数据库是共享的,为什么 impala 需要执行 INVALIDATE METADATAREFRESH

如果它是为了 impala 缓存元数据,为什么守护进程在 缓存未命中 时不更新它们的缓存而不需要刷新手动元数据?

感谢任何帮助。

它是共享的,但 Impala 缓存元数据并在其优化器中使用其统计信息,但如果它在 hive 中发生更改,则必须手动告诉 impala 刷新其缓存,这是有点不方便。 但是,如果您在 impala 中 create/change 个表,则无需在配置单元端执行任何操作。

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

拥有中央元存储不需要用户在两个不同的位置维护元数据,Hive 和 Impala 各一个。用户可以拥有一个中央存储库,并且这两种工具都可以访问此位置以获取任何元数据信息。

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

Impala 利用大规模并行处理范例来完成工作。它不是为每个查询从集中式元存储中读取,而是倾向于将元数据保存在执行器节点中,以便它可以完全绕过可能会花费大量时间读取元数据的冷启动。

INVALIDATE METADATA/REFRESH 将 metadata/block 信息传播到执行程序节点。

为什么要手动?

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

因此无需手动操作!

希望对您有所帮助。

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

  1. a NEW table 通过 HIVEsqoop import .... --hive-import ... 然后你必须做: INVALIDATE METADATA tableName 通过 Impala-Shell。

  2. 新数据文件existingtable(附加数据)然后你必须:REFRESH tableName因为您唯一需要的是最后添加的信息的元数据。