Impala 中invalidate metadata和refresh

首先了解一下:Impala如何融入Hadoop生態系統html

Impala使用了Hadoop生態系統中許多熟悉的組件。Impala能夠做爲消費者和生產者與其餘Hadoop組件交換數據,所以它能夠以靈活的方式適合您的ETL和ELT管道。sql


How Impala Works with Hive
Impala的一個主要目標是使SQL-on-Hadoop操做足夠快速和高效,以吸引新的用戶類別,並向新的用例類型開放Hadoop。在實用的狀況下,它利用現有的Apache Hive基礎設施(許多Hadoop用戶已經擁有這些基礎設施)來執行長時間運行的、面向批處理的SQL查詢。
特別是,Impala將它的表定義保存在傳統的MySQL或PostgreSQL數據庫(稱爲metastore)中,Hive將這類數據保存在這個數據庫中。所以,只要全部列都使用Impala支持的數據類型、文件格式和壓縮編解碼器,Impala就能夠訪問Hive定義或加載的表。
最初關注查詢特性和性能意味着Impala能夠用SELECT語句讀取比用INSERT語句寫入更多類型的數據。要使用Avro、RCFile或SequenceFile文件格式查詢數據,可使用Hive加載數據。
Impala查詢優化器還可使用表統計信息和列統計信息。最初,您使用Hive中的analysis TABLE語句收集這些信息;在Impala 1.2.2或更高版本中,使用Impala COMPUTE STATS語句。計算統計須要更少的設置,更可靠,不須要在impala-shell和Hive shell之間來回切換

shell

Overview of Impala Metadata and the Metastore
正如在《Impala如何與Hive一塊兒工做》中討論的,Impala在名爲metastore的中央數據庫中維護關於表定義的信息。Impala還跟蹤數據文件低層特徵的其餘元數據:
HDFS中塊的物理位置。對於具備大量數據或多個分區的表,檢索表的全部元數據可能很是耗時,在某些狀況下須要幾分鐘。所以,每一個Impala節點緩存全部這些元數據,以便未來對同一個表進行查詢時重用。
若是更新了表定義或表中的數據,則集羣中的全部其餘Impala守護進程必須在對該表發出查詢以前接收最新的元數據,替換已過時的緩存元數據。數據庫

在Impala 1.2及更高版本中,對於經過Impala發出的全部DDL和DML語句,元數據更新是自動的,經過catalogd守護進程進行協調。
經過hive中DDL和DML發行,或手動更改在HDFS文件,你仍然使用REFRESH語句(當新的數據文件被添加到現有表)或失效元數據語句(全新的表,或刪除一個表後,執行一個HDFS平衡操做,或刪除數據文件)。發出INVALIDATE METADATA自己將檢索由metastore跟蹤的全部表的元數據。若是您知道只有特定的表在Impala以外被更改,那麼您能夠爲每一個受影響的表發出REFRESH table_name,以僅檢索這些表的最新元數據

緩存

How Impala Uses HDFS網絡

Impala使用分佈式文件系統HDFS做爲它的主要數據存儲介質。Impala依靠HDFS提供的冗餘來防止單個節點上的硬件或網絡中斷。Impala表數據使用熟悉的HDFS文件格式和壓縮編解碼器在HDFS中物理地表示爲數據文件。當新表的目錄中出現數據文件時,Impala將讀取全部文件,而不考慮文件名。新數據被添加到由Impala控制名稱的文件中異步

 

INVALIDATE METADATA Statement分佈式

將一個或全部表的元數據標記爲陳舊的。在經過Hive shell建立表以後,在該表可用於Impala查詢以前,都是必需的。下次當前Impala節點對元數據無效的表執行查詢時,Impala將在查詢繼續以前從新加載相關的元數據。與REFRESH語句執行的增量元數據更新相比,這是一個相對昂貴的操做,所以在向現有表添加新數據文件的常見場景中,最好使用REFRESH而不是使元數據失效。oop

語法:INVALIDATE   METADATA   [[db_name.]table_name]性能

默認狀況下,全部表的緩存元數據都被刷新。若是指定表名,則只刷新該表的元數據。即便對於單個表,INVALIDATE METADATA也比REFRESH更昂貴,因此在爲現有表添加新數據文件的常見狀況下,請選擇REFRESH。

 

INVALIDATE METADATA  和REFRESH是對應的:INVALIDATE METADATA  在後續查詢須要時等待從新加載元數據,可是會從新加載表的全部元數據,這多是一項昂貴的操做,尤爲是對於有不少分區的大型表。REFRESH會當即從新加載元數據,但只加載新添加數據文件的塊位置數據,從而下降了總體操做的開銷。若是數據被以更普遍的方式更改,例如由HDFS平衡器從新組織,則使用INVALIDATE元數據來避免因爲減小本地讀取而致使的性能損失。Impala 1.1 REFRESH針對向現有表添加新數據文件的常見用例進行了優化,所以如今須要表名參數。

使用注意:
INVALIDATE METADATA是用於刷新全庫或者某個表的元數據,包括表的元數據和表內的文件數據,它會首先清楚表的緩存,而後從metastore中從新加載所有數據並緩存,該操做代價比較重,主要用於在hive中修改了表的元數據,須要同步到impalad,例如create table/drop table/alter table add columns等。


語法:REFRESH [table] PARTITION [partition]
REFRESH是用於刷新某個表或者某個分區的數據信息,它會重用以前的表元數據,僅僅執行文件刷新操做,它可以檢測到表中分區的增長和減小,主要用於表中元數據未修改,數據的修改,例如INSERT INTO、LOAD DATA、ALTER TABLE ADD PARTITION、LLTER TABLE DROP PARTITION等,若是直接修改表的HDFS文件(增長、刪除或者重命名)也須要指定REFRESH刷新數據信息。

使用原則

若是在使用過程當中涉及到了元數據或者數據的更新,則須要使用這二者中的一個操做完成,具體如何選擇須要根據以下原則:
1)invalidate metadata操做比refresh要重量級
2)若是涉及到表的schema改變,使用invalidate metadata [table]
3)若是隻是涉及到表的數據改變,使用refresh [table]
4)若是隻是涉及到表的某一個分區數據改變,使用refresh [table] partition [partition]
5)禁止使用invalidate metadata什麼都不加,寧願重啓catalogd。(注:項目中可使用這種

總結
REFRESH和INVALIDATE METADATA對於impala而言是比較重要的兩個操做,分別處理數據和元數據的修改,其中REFRESH操做是同步的,INVALIDATE METADATA是異步的,本文詳細介紹了兩種語句的適用場景和執行原理,以及可能形成的影響,最重要的是,須要謹記這兩種查詢使用場景。
 

參考文檔:https://www.cloudera.com/documentation/enterprise/5-11-x/topics/impala_langref_sql.html#langref_sql

相關文章
相關標籤/搜索