您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何分析Impala,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
Impala介紹
Impala 是分布式、大規模并行處理(MPP)的數據庫引擎,主要有CLI、Statestore、Catalog、Impala組件構成如下圖。
Impala架構圖.jpg
各組件功能介紹:
Impala:運行在DataNode節點上,由Impalad進程表示,它接收客戶端的查詢請求(接收查詢請求的Impalad為Coordinator,Coordinator解析SQL查詢語句,生成查詢計劃樹,再通過調度器把執行計劃分發給具有相應數據的其它Impalad進行執行),讀寫數據,并行執行查詢,并把結果通過網絡流式的傳送回給Coordinator,由Coordinator返回給客戶端。同時Impalad也與State Store保持連接,用于確定哪個Impalad是健康和可以接受新的工作,并從catalogd服務接收廣播消息
Statestore:跟蹤集群中impalaed健康狀態及位置。impalaed啟動時進行訂閱注冊并保持心跳連接。并且每個impalaed都緩存一份state store信息。所以即便是state store掛掉,impala還是能夠提供服務,只是無法更新每個impalaed的狀態。
Catalog:用于同步impala語句產生的metadata的變化到集群里所有結點。解決1.2版本之前的問題:1)在使用CREATE DATABASE, DROP DATABASE, CREATE TABLE, ALTER TABLE, or DROP TABLE語句后,在其它結點執行查詢前需要先執行INVALIDATE METADATA來更新結構對象;
2)在一個節點上執行INSERT 語句后要在其它節點執行REFRESH,以便識別出新增的數據。 但是當通過hive操作后,在impala節點執行查詢時仍然需要執行 REFRESH 或INVALIDATE METADATA。
CLI:提供給用戶查詢的命令行工具,shell(Impala使用python實現)、JDBC、ODBC接口
[編輯] 2、Impala適用場景
1)Impala 非常適合在大的數據集上,為交互式探索分析執行 SQL。
2)業務邏輯相對簡單,類似于關系型數據庫。
3)即席查詢(Ad-hoc)是 Impala 的主要應用場景,比hive更高效。
4)查詢結果集不大,必須小于內存,否則不會執行成功。
[編輯] 3、Impala與Hive關系
Impala與Hive都是構建在Hadoop之上的數據查詢工具各有不同的側重適應面,但從客戶端使用來看Impala與Hive有很多的共同之處,如數據表元數據、ODBC/JDBC驅動、SQL語法、靈活的文件格式、存儲資源池等。Impala與Hive在Hadoop中的關系如下圖所示。
Hive適合于長時間的批處理查詢分析,而Impala適合于實時交互式SQL查詢,Impala給數據分析人員提供了快速實驗、驗證想法的大數據分析工具。可以先使用hive進行數據轉換處理,之后使用Impala在Hive處理后的結果數據集上進行快速的數據分析。
多數HiveQL 語句都可以直接在Impala下運行,不支持HiveQL中可用的SQL特性如下:
Impala只支持簡單數據類型不支持maps, arrays, structs。
可擴展機制(Extensibility mechanisms)例如 TRANSFORM, 自定義文件格式, 或自定義 SerDes; zImpala 1.2
Impala 在 string 和 numeric 或 Boolean 之間不進行隱式轉換,Impala 在 numeric 或 string 到 timestamp 之間不進行隱式轉換
XML和JSON函數
HiveQL 中的某些聚合函數: variance, var_pop, var_samp, stddev_pop, stddev_samp, covar_pop, covar_samp, corr, percentile, percentile_approx, histogram_numeric,collect_set; Impala 支持這些聚合函數: MAX(), MIN(), SUM(), AVG(), COUNT()
等等
Impala&hive.jpg
[編輯] 4、Impala 為什么會比MapReduce更高效
Impala 與 Hive 和 Pig 不同,因為它使用自己的守護進程,跨集群分布式進行查詢。因為 Impala 不依賴于 MapReduce,它避免了 MapReduce 作業的啟動開銷,讓 Impala 能實時返回結果。
Impala 不會把中間結果存放到硬盤上,最大限度的使用內存及時通過網絡以strem的方式傳遞。
Impala 避免了 MapReduce 啟動時間的耗費。對于交互式查詢,MapReduce 啟動時間變得非常醒目。Impala 以服務方式運行,實際上沒有啟動時間
Impala 可以更自然的分散查詢計劃,而不是不得不納入 map 和 reduce 作業管道中。這使得 Impala 可以并行處理查詢的多個步驟,并避免不必要的負載如排序和混洗(This enables Impala to parallelize multiple stages of a query and avoid overheads such as sort and shuffle when unnecessary)
Impala 生成運行時代碼。Impala 使用 LLVM 為要執行的查詢生成匯編碼(assembly code)。個別查詢不需要為運行在可以支持各種查詢的系統而支付代價(Individual queries do not have to pay the overhead of running on a system that needs to be able to execute arbitrary queries)
Impala 盡可能采用最新的硬件指令。Impala 使用最新的 SSE (SSE4.2) 指令集,某些情況下可以提供巨大的加速效果
Impala 采用更好的 I/O 調度。Impala 了解塊在硬盤上的位置,并可以調度塊處理的順序,以便保證所有硬盤都繁忙,Impala支持直接數據塊讀取和本地代碼計算checksum。
Impala 專為性能設計。Impala 采取以性能為導向的設計原則,為此花費了大量的時間,例如緊密內部循環、內聯函數調用、最小分支、更好的緩存使用、以及最小內存使用等(A lot of time has been spent in designing Impala with sound performance-oriented fundamentals, such as tight inner loops, inlined function calls, minimal branching, better use of cache, and minimal memory usage)
通過選擇合適的數據存儲格式可以得到最好的性能(Impala支持多種存儲格式)
[編輯] 5、內存依賴
盡管 Impala 不是內存數據庫,當處理大的表和大的結果集時, impalad 守護進程會分配大量的物理內存,假如在某一節點上處理中間結果集所需的內存超出了這一節點上 Impala 可用的內存,查詢會被取消。
Impala 操作所需的內存依賴于幾個因素:
表的文件格式。相同的數據,采用不同的文件格式,數據文件個數也不同。為了分析數據,根據每個文件所采用的壓縮和編碼格式的不同,可能需要不同數據量的臨時內存來進行解壓
是否為 SELECT 或 INSERT 操作。例如,查詢 Parquet 表時需要相對較少的內存,因為 Impala 以 8MB /塊來進行讀取和解壓縮數據。而向 Parquet 表插入數據則是內存密集型操作,因為每一個數據文件(最大大小為 1GB)的數據被放在內存中,直到編碼、壓縮并寫入硬盤
表是否為分區表,并且針對分區表的查詢是否可以從分區修剪(partition pruning)中受益
Impala 要求所有包含的 ORDER BY 子句的查詢同時包含 LIMIT 子句,協調節點需要足夠的內存進行排序,實際需要內存為LIMIT數量 *集群節點數所站的空間。
結果集的大小。當中間結果集在節點之間傳輸時,傳輸數據的數量依賴于查詢返回列的數量。select 查詢時避免用*,只查詢所需要的字段。
使用內存的大小并不是跟輸入數據集的大小直接相關。對于聚合來說,使用的內存跟分組后的行數有關。對于表連接來說,使用的內存與除了最大的表之外其他所有表的大小相關,并且 Impala 可以采用在每個節點之間拆分大的連接表而不是把整個表都傳輸到每個節點的連接策略
使用內存的大小并不是跟輸入數據集的大小直接相關。對于聚合來說,使用的內存跟分組后的行數有關。對于連接來說,使用的內存與除了最大的表之外其他所有表的大小相關,并且 Impala 可以采用在每個節點之間拆分大的連接表而不是把整個表都傳輸到每個節點的連接策略
在唯一或高基數(high-cardinality)列上的 GROUP BY 操作。Impala 為 GROUP BY 查詢中每一個不同的值分配一些處理結構(handler structures)。成千上萬不同的 GROUP BY 值可能超出內存限制
查詢涉及到非常寬、包含上千個列的表,特別是包含許多 STRING 列的表。因為 Impala 允許 STRING 值最大不超過 32 KB,這些查詢的中間結果集可能需要大量的內存分配
Impala 使用 tcmalloc 分配內存,一款專為高并發優化的內存分頻器。一當 Impala 分配了內存,它保留這些內存用于將來的查詢。因此,空閑時顯示 Impala 有很高的內存使用是很正常的。假如 Impala 檢測到它將超過內存限制(通過 -mem_limit 啟動選項或 MEM_LIMIT 查詢選項定義),它將釋放當前查詢不需要的所有內存。
關于如何分析Impala就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。