首先了解一下:Impala如何融入Hadoop生態系統
Impala使用了Hadoop生態系統中許多熟悉的組件。Impala可以作為消費者和生產者與其他Hadoop組件交換數據,因此它可以以靈活的方式適合您的ETL和ELT管道。
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之間來回切換
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而不是使元數據失效。
語法: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