Impala中无效元数据和刷新命令之间的区别?

时间:2017-02-15 01:24:54

标签: impala invalidation

我在此链接中看到了Impala version 1.1

  

自Impala 1.1起,REFRESH语句仅适用于现有表。对于新表,您需要发出" INVALIDATE METADATA"言。

对于Impala的更高版本,这仍然适用吗?

2 个答案:

答案 0 :(得分:4)

根据Cloudera的Impala guide(Cloudera Enterprise 5.8),5.9保持不变:

  

INVALIDATE METADATA和REFRESH是对应物:INVALIDATE METADATA   等待在后续查询需要时重新加载元数据,但是   重新加载表的所有元数据,这可能是昂贵的   操作,尤其是对于具有许多分区的大型表。 REFRESH   立即重新加载元数据,但仅加载块位置   新添加的数据文件的数据,使其成本更低   总体。如果数据以更广泛的方式改变,例如存在   由HDFS平衡器重组,使用INVALIDATE METADATA来避免   减少本地读取的性能损失。如果您使用Impala   版本1.0,INVALIDATE METADATA语句就像   Impala 1.0 REFRESH声明确实如此,而Impala 1.1 REFRESH则是   针对将新数据文件添加到的常见用例进行了优化   现有表,因此现在需要表名参数。

与处理现有表有关:

  

表名是[REFRESH]的必需参数。刷新所有元数据   表,使用INVALIDATE METADATA命令。   因为REFRESH table_name仅适用于当前的表   当您在中创建新表时,Impala节点已经知道   在Hive shell中,输入INVALIDATE METADATA new_table,然后才能看到   impala-shell中的新表。一旦Impala知道了这个表,你就可以   在为该表添加数据文件后发出REFRESH table_name。

所以它似乎确实保持不变。我相信CDH 5.9附带Impala 2.7。

答案 1 :(得分:2)

根据Impala文档Invalidate MetadaRefresh

INVALIDATE METADATA语句

INVALIDATE METADATA语句将一个或所有表的元数据标记为陈旧。下次Impala服务针对元数据无效的表执行查询时,Impala会在查询继续之前重新加载关联的元数据。由于与REFRESH语句完成的增量元数据更新相比,这是一个非常昂贵的操作,因此,尽可能使用REFRESH而不是INVALIDATE METADATA。

在Hive和其他Hive客户端(例如SparkSQL)中,在Impala之外进行以下更改时,

INVALIDATE METADATA是必需的:

  • 现有表的元数据发生了变化。
  • 添加了新表,Impala将使用这些表。
  • 服务器或数据库级别的Sentry特权已更改。
  • 块元数据发生更改,但文件保持不变(HDFS重新平衡)。 UDF罐子发生了变化。
  • 不再查询某些表,您想从目录和协调器缓存中删除其元数据以减少内存需求。

当impalad进行更改时,不需要INVALIDATE METADATA。

刷新声明

REFRESH语句从metastore数据库中重新加载表的元数据,并从HDFS NameNode中重新加载文件并阻止元数据。 REFRESH用于避免Impala与外部元数据源(即Hive Metastore(HMS)和NameNode)之间的不一致。

用法说明:

表名是必需的参数,该表必须已经存在并且对于Impala而言是已知的。

仅重新加载指定表的元数据。

在Impala之外发生以下情况之一后,请使用REFRESH语句为特定表加载最新的元存储元数据:

  • 删除,添加或修改文件。
    例如,将新数据文件加载到表的HDFS数据目录中之后,追加到现有的HDFS文件中,然后通过INSERT或LOAD DATA从Hive插入数据。
  • 删除,添加或修改分区。
    例如,在Hive中发出ALTER TABLE或其他修改表的SQL语句后