天天看點

Impala基于記憶體的SQL引擎的詳細介紹

一、簡介

1、概述

Impala是Cloudera公司推出,提供對HDFS、Hbase資料的高性能、低延遲的互動式SQL查詢功能。

•基于Hive使用記憶體計算,兼顧資料倉庫、具有實時、批處理、多并發等優點

impala使用hive的中繼資料, 完全在記憶體中計算

•是CDH平台首選的PB級大資料實時查詢分析引擎

2、Impala的特點

impalak快的原因:1、2、3、6

1、基于記憶體進行計算,能夠對PB級資料進行互動式實時查詢、分析

2、無需轉換為MR,直接讀取HDFS及Hbase資料 ,進而大大降低了延遲。

Impala沒有MapReduce批處理,而是通過使用與商用并行關系資料庫中類似的分布式查詢引擎(由Query Planner、Query Coordinator和Query Exec Engine三部分組成

3、C++編寫,LLVM統一編譯運作

在底層對硬體進行優化, LLVM:編譯器,比較穩定,效率高

4、相容HiveSQL

支援hive基本的一些查詢等,hive中的一些複雜結構是不支援的

5、具有資料倉庫的特性,可對hive資料直接做資料分析

6、支援Data Local

資料本地化:無需資料移動,減少資料的傳輸

7、支援列式存儲

可以和Hbase整合:因為Hive可以和Hbasez整合

8、支援JDBC/ODBC遠端通路

3、Impala劣勢

1、對記憶體依賴大

隻在記憶體中計算,官方建議128G(一般64G基本滿足),可優化: 各個節點彙總的節點(伺服器)記憶體選用大的,不彙總節點可小點

2、C++編寫 開源 ?

對于java, C++可能不是很了解

3、完全依賴hive

4、實踐過程中分區超過1w 性能嚴重下下降

定期删除沒有必要的分區,保證分區的個數不要太大

5、穩定性不如hive

因完全在記憶體中計算,記憶體不夠,會出現問題, hive記憶體不夠,可使用外存

4、Impala的缺點

  • Impala不提供任何對序列化和反序列化的支援。
  • Impala隻能讀取文本檔案,而不能讀取自定義二進制檔案。
  • 每當新的記錄/檔案被添加到HDFS中的資料目錄時,該表需要被重新整理。

二、Impala架構

1、Impala的核心元件

Statestore Daemon

  • 負責收集分布在叢集中各個impalad程序的資源資訊、各節點健康狀況,同步節點資訊
  • 負責query的排程

Catalog Daemon

  • 從Hive中繼資料庫中同步中繼資料,分發表的中繼資料資訊到各個impalad中
  • 接收來自statestore的所有請求
    impala版本1.2之後開始有的,不是很隻能,有些中繼資料資訊并不能同步到各個impalad的,例如hive中建立表,Catalog Daemon不能同步,需要在imapala手動執行指令同步。

Impala Daemon(impalad) <具有資料本地化的特性是以放在DataNode上>

  • 接收client、hue、jdbc或者odbc請求、Query執行并傳回給中心協調節點
  • 子節點上的守護程序,負責向statestore保持通信,彙報工作
    Impala daemon:執行計算。因記憶體依賴大,所最好不要和imapla的其他元件放到同意節點
考慮叢集性能問題,一般将StateStoreDaemon與 Catalog Daemon放在統一節點上,因之間要做通信

2、整體架構流程

Impala基于記憶體的SQL引擎的詳細介紹
  1. 用戶端向某一個Impalad發送一個query(SQL)
    上Impalad會與StateStore保持連接配接(通信),确定impala叢集哪寫Impalad是否健康可工作,與NameNode得到資料中繼資料資訊(資料的位置等);每個Impalad通過Catalog可知表中繼資料據資訊;
  2. Impalad将query解析為具體的執行計劃Planner, 交給目前機器Coordinator即為中心協調節點
    Impalad通過jni,将query傳送給java前端,由java前端完成文法分析和生成執行計劃(Planner),并将執行計劃封裝成thrift格式傳回執行計劃分為多個階段,每一個階段叫做一個(計劃片段)PlanFragment,每一個PlanFragment在執行時可以由多個Impalad執行個體并行執行(有些PlanFragment隻能由一個Impalad執行個體執行),
  3. Coordinator(中心協調節點)根據執行計劃Planner,通過本機Executor執行,并轉發給其它有資料的impalad用Executor進行執行
  4. impalad的Executor之間可進行通信,可能需要一些資料的處理
  5. 各個impalad的Executor執行完成後,将結果傳回給中心協調節點

    使用者調用GetNext()方法擷取計算結果,如果是insert語句,則将計算結果寫回hdfs

    當所有輸入資料被消耗光,執行結束(完成)。

    在執行過程中,如果有任何故障發生,則整個執行失敗

  6. 有中心節點Coordinator将彙聚的查詢結果傳回給用戶端

3、Impala與Hive的異同

Impala基于記憶體的SQL引擎的詳細介紹

資料存儲

  • 使用相同的存儲資料池都支援把資料存儲于HDFS, HBase。

中繼資料:

  • 兩者使用相同的中繼資料

SQL解釋處理:

  • 比較相似都是通過詞法分析生成執行計劃。

執行計劃:

  • Hive: 依賴于MapReduce執行架構,執行計劃分成 map->shuffle->reduce->map->shuffle->reduce…的模型。如果一個Query會 被編譯成多輪MapReduce,則會有更多的寫中間結果。由于MapReduce執行架構本身的特點,過多的中間過程會增加整個Query的執行時間。
  • Impala: 把執行計劃表現為一棵完整的執行計劃樹,可以更自然地分發執行計劃到各個Impalad執行查詢,而不用像Hive那樣把它組合成管道型的 map->reduce模式,以此保證Impala有更好的并發性和避免不必要的中間sort與shuffle。

資料流:

  • Hive: 采用推的方式,每一個計算節點計算完成後将資料主動推給後續節點。
  • Impala: 采用拉的方式,後續節點通過getNext主動向前面節點要資料,以此方式資料可以流式的傳回給用戶端,且隻要有1條資料被處理完,就可以立即展現出來,而不用等到全部處理完成,更符合SQL互動式查詢使用。

記憶體使用:

  • Hive: 在執行過程中如果記憶體放不下所有資料,則會使用外存,以保證Query能順序執行完。每一輪MapReduce結束,中間結果也會寫入HDFS中,同樣由于MapReduce執行架構的特性,shuffle過程也會有寫本地磁盤的操作。
  • Impala: 在遇到記憶體放不下資料時,目前版本1.0.1是直接傳回錯誤,而不會利用外存,以後版本應該會進行改進。這使用得Impala目前處理Query會受到一 定的限制,最好還是與Hive配合使用。Impala在多個階段之間利用網絡傳輸資料,在執行過程不會有寫磁盤的操作(insert除外)

排程

  • Hive任務的排程依賴于Hadoop的排程政策。
  • Impala的排程由自己完成,目前的排程算法會盡量滿足資料的局部性,即掃描資料的程序應盡量靠近資料本身所在的實體機器。但目前排程暫時還沒有考慮負載均衡的問題。從Cloudera的資料看,Impala程式的瓶頸是網絡IO,目前Impala中已經存在對Impalad機器網絡吞吐進行統計,但目前還沒有利用統計結果進行排程。

容錯

  • Hive任務依賴于Hadoop架構的容錯能力,可以做到很好的failover
  • Impala中不存在任何容錯邏輯,如果執行過程中發生故障,則直接傳回錯誤。當一個Impalad失敗時,在這個Impalad上正在運作的所有query都将失敗。但由于Impalad是對等的,使用者可以向其他Impalad送出query,不影響服務。當StateStore失敗時,也不會影響服務,但由于Impalad已經不能再更新叢集狀态,如果此時有其他Impalad失敗,則無法及時發現。這樣排程時,如果謂一個已經失效的Impalad排程了一個任務,則整個query無法執行。

三、Impala Shell

1、Impala 外部shell

不進入Impala内部,直接執行的ImpalaShell

例如:
$ impala-shell -h   -- 通過外部Shell檢視Impala幫助
$ impala-shell -p select count(*) from t_stu   -- 顯示一個SQL語句的執行計劃
           
下面是Impala的外部Shell的一些參數:
           
-h (--help) 幫助
-v (--version) 查詢版本資訊
-V (--verbose) 啟用詳細輸出
--quiet 關閉詳細輸出
-p 顯示執行計劃
-i hostname (--impalad=hostname) 指定連接配接主機格式hostname:port 預設端口21000, impalad shell 預設連接配接本機impalad
- r(--refresh_after_connect)重新整理所有中繼資料
-q query (--query=query) 從指令行執行查詢,不進入impala-shell

-d default_db (--database=default_db) 指定資料庫
-B(--delimited)去格式化輸出
--output_delimiter=character 指定分隔符
--print_header 列印列名

-f query_file(--query_file=query_file)執行查詢檔案,以分号分隔
-o filename (--output_file filename) 結果輸出到指定檔案
-c 查詢執行失敗時繼續執行

-k (--kerberos) 使用kerberos安全加密方式運作impala-shell
-l 啟用LDAP認證
-u 啟用LDAP時,指定使用者名

           

2、Impala内部Shell

# impala shell進入
# 普通連接配接 
impala-shell 


# impala shell指令

# 檢視impala版本
select version;

# 特殊資料庫
# default,建立的沒有指定任何資料庫的新表
# _impala_builtins,用于儲存所有内置函數的系統資料庫

# 庫操作
# 建立 
create database tpc;
# 展示
show databases;
# 展示庫名中含有指定(格式)字元串的庫展示
# 進入
use tpc;
# 目前所在庫
select current_database();

#表操作
# 展示(預設default庫的表)
show tables;
# 指定庫的表展示
show tables in tpc;
# 展示指定庫中表名中含有指定字元串的表展示
show tables in tpc like 'customer*';
# 表結構
describe city; 或 desc city;
# select insert create alter

# 表導到另一個庫中(tcp:city->d1:city)
alter table city rename to d1.city

# 列是否包含null值
select count(*) from city where c_email_address is null

# hive中 create、drop、alter,切換到impala-shell中需要如下操作
invalidate metadata
# hive中 load、insert、change表中資料(直接hdfs指令操作),切換到impala-shell中需要如下操作
refresh table_name
           

3、參考文章

https://www.w3cschool.cn/impala/impala_overview.html

https://blog.csdn.net/flyingsk/article/details/8590000

https://blog.csdn.net/qiyongkang520/article/details/51067803

轉載自連結:https://www.jianshu.com/p/257ff24db397

作者的原創文章,轉載須注明出處。原創文章歸作者所有,歡迎轉載,但是保留版權。對于轉載了部落客的原創文章,不标注出處的,作者将依法追究版權,請尊重作者的成果。

繼續閱讀