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、整體架構流程




  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的異同


 

數據存儲

  • 使用相同的存儲數據池都支持把數據存儲於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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM