Cloudera Impala 使元数据无效
Cloudera Impala INVALIDATE METADATA
正如在 impala 教程中讨论的那样,Impala 使用 Hive 共享的 Metastore。但已经提到,如果您使用配置单元在表上创建或执行某些版本,您应该执行 INVALIDATE METADATA
或 REFRESH
命令以通知 impala 有关更改。
所以我很困惑,我的问题是:如果元数据数据库是共享的,为什么 impala 需要执行 INVALIDATE METADATA
或 REFRESH
?
如果它是为了 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 完成。
但是当你插入 :
a NEW table 通过 HIVE 即 sqoop import .... --hive-import ...
然后你必须做: INVALIDATE METADATA tableName
通过 Impala-Shell。
新数据文件到existing
table(附加数据)然后你必须:REFRESH tableName
因为您唯一需要的是最后添加的信息的元数据。
正如在 impala 教程中讨论的那样,Impala 使用 Hive 共享的 Metastore。但已经提到,如果您使用配置单元在表上创建或执行某些版本,您应该执行 INVALIDATE METADATA
或 REFRESH
命令以通知 impala 有关更改。
所以我很困惑,我的问题是:如果元数据数据库是共享的,为什么 impala 需要执行 INVALIDATE METADATA
或 REFRESH
?
如果它是为了 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 完成。
但是当你插入 :
a NEW table 通过 HIVE 即
sqoop import .... --hive-import ...
然后你必须做:INVALIDATE METADATA tableName
通过 Impala-Shell。新数据文件到
existing
table(附加数据)然后你必须:REFRESH tableName
因为您唯一需要的是最后添加的信息的元数据。