Impala(多圖手機用戶慎入,理論+實踐)

Impala 是參照google 的新三篇論文Dremel(大批量數據查詢工具)的開源實現,功能相似shark(依賴於hive)和Drill(apache),impala 是clouder 公司主導開發並開源,基於hive 並使用內存進行計算,兼顧數據倉庫,具備實時,批處理,多併發等優勢。是使用cdh 的首選PB 級大數據實時查詢分析引擎。(Impala 依賴cdh 是徹底沒有問題的,官網說能夠單獨運行,可是他單獨運行會出現好多的問題)html

參考:node

http://www.cloudera.com/products/apache-hadoop/impala.html程序員

http://www.impala.io/index.html算法

Impala與Shark、sparkSQL、Drill等的簡單比較
sql

  • Impala起步較早,目前可以商用的爲數很少的大數據查詢引擎之一;
  • CDH5不支持sparkSQL;
  • Drill起步晚,尚不成熟;
  • shark功能和架構上同Impala類似,該項目已經中止開發。

Impala特色shell

  • 基於內存進行計算,可以對PB級數據進行交互式實時查詢/分析;
  • 無需轉換爲MR,直接讀取HDFS數據
  • C++編寫,LLVM統一編譯運行
  • 兼容HiveSQL
  • 具備數據倉庫的特性,可對hive數據直接作數據分析
  • 支持Data Local
  • 支持列式存儲
  • 支持JDBC/ODBC遠程訪問
  • 支持sql92標準,並具備本身的解析器和優化器

Impala劣勢數據庫

  • 對內存依賴大
  • C++編寫 開源?!(對Java單純的程序員來講太坑爹了。。。)
  • 徹底依賴於hive
  • 實踐過程當中 分區超過1w 性能嚴重下降低(1.4 以前是這樣,至於2.0 以後的版本,
    就好多了
  • 穩定性不如hive

impala與hive的關係apache

  • Impala是基於Hive的大數據實時分析查詢引擎,直接使用Hive
    的元數據庫Metadata,意味着impala元數據都存儲在Hive的
    metastore中。而且impala兼容Hive的sql解析,實現了Hive的
    SQL語義的子集,功能還在不斷的完善中
  • 也就是說hive活着,impala才能存在,不然隨着消失

安裝方式性能優化

  • ClouderaManager
  • 手動安裝(不建議,太多坑)

Impala核心組件bash

對於impala 來說,是沒有主節點的,而要理解主節點,impala statestore 和catalog server兩個角色,就具有集羣調節的功能,根據以上的特色,對impala 進行配置優化配置impala 內存,每個deamon 都須要配置內存,由於真正作查詢工做的就是deamon 所在的節點,因此impala 的總內存,就是全部deamon 節點的內存之和;若是要在哪臺機器上面彙總,就須要在那一臺機器上的內存調大一些;咱們瞭解到的,真正提供查詢的是deamon,那麼咱們鏈接哪一臺呢?Impala,你能夠鏈接其中deamon 任何一個都行,能夠根據本身的需求來,(1)當你查詢的量相對大的時候,你就鏈接內存大的機器,(2)當每臺機器都適合查詢的狀況下也能夠隨機找一臺機器,本身寫一個輪詢或者權重算法;解決高併發問題

  • Statestore Daemon
    • 負責收集分佈在集羣中各個impalad 進程的資源信息,各節點健康情況、同步節點信息.
      負責query 的調度.(並不是絕對,假若他存在,那就幫忙,若不存在,那就不用他)
      對於一個正常運轉的集羣,並非一個關鍵進程.
  • Catalog Daemon(1.2 版本以後才加入)
    • 把impala表的metadata分發到各個impalad 中,說他是基於hive 的,因此就須要metadata數據分到impalad 中,之前沒有此進程,就是手動來進行同步的。雖然以後加入了,可是也沒有那麼智能,並非保證全部的數據都能同步,好比你插入一些數據,他能夠把數據發到其餘節點,可是好比建立表ddl 語句,建議去手動作一下接收來自statestore 的全部請求,當impala deamon節點插入或者查詢數據時候(數據改變的時候),他把本身的操做結果彙報給state deamon,而後state store 請求catelog deamon,告知從新更新元數據信息給impalad 中,因此catalog deamon 與statedeamon 放到一臺機器上,並且不建議在此機器上再去安裝impala deamon 進程,避免形成提供查詢形成集羣管理出問題
  • Impala Daemon(主要來提供查詢)
    • 主要接收查詢請求,接收client、hue、jdbc 或者odbc 請求、query 執行並返回給中心協調節點(對應的服務實例是impalad)子節點上的守護進程,負責向statestore 保持通訊,彙報工做

Impala架構

  • Client(shell,jdbc,odbc)發送請求到impalad 進程上,發送節點能夠是隨機的,impalad 之間,也有相互通訊
  • Statestore 和catelog 劃到同一節點,目的就是這兩個進程在協調工做時候,避免因網絡問題形成失敗
  • Hive metastore 是比較重要的,此時statestore 和catelog 通訊,將數據同步到其餘節點
  • Impalad 最好與hdfsDataNode 在同一節點,這樣能更快速的查詢計算,而後返回結果便可(理想狀態的就是數據本地化)
    • Impalad 裏面包含三個組件
      • Query planner(查詢解析器)
        • 將咱們的字符串sql 語句解釋成爲執行計劃,
      • ii. Query coordinator(中心協調節點)
        • 由這個組件來指定來查詢的主節點(頭),指定好以後通知其餘節點個人主節點做用,待大家查詢完成以後的結果,返回給頭節點
      • Query executor(查詢執行器)
        • 而作查詢工做的是就是executor

impala 外部shell

  • -h(--help)幫助-------查看全部命令的幫助文檔
  • -r(--refresh_after_connect)刷新全部元數據(當hive 建立數據的時候,你須要刷新到,才能看到hive 元數據的改變)總體刷新*---全量刷新,萬不得已才能用;不建議定時去刷新hive 源數據,數據量太大時候,一個刷新,頗有可能會掛掉;建立hive 表,而後刷新。
  • -B(--delimited)去格式化輸出* 大量數據加入格式化,性能受到影響
    • --output_delimiter=character 指定分隔符與其餘命令整合
    • --print_header 打印列名(去格式化,可是顯示列名字)
  • -v 查看對應版本(會有坑)
    • Impala 的查詢會以最新版本爲準,若是版本不一致,會形成查詢結果失敗
    • mpala-shell 與impala 的版本查看,必須版本一致
  • -f 執行查詢文件*
    select name,count(name) as name_count from person group by name--建立包含該sql的文件
     
    • --query_file 指定查詢文件(建議sql 語句寫到一行,由於shell 會讀取文件一行一行的命令)
    • Impala-shell --query_file=xxx
  • -i 鏈接到對應的impalad
    • --impalad 指定impalad 去執行任務
    • --fe_port 指定備用端口(一般不用去指定)
  • -o 保存執行結果到文件***
    • --output_file 指定輸出文件名
  • 組合應用:
    impala-shell -B --Print_header -f test.sss -o result.txt
    Impala-shell -B -f test.xxx -o result.txt
    非重要的shell
    • mpala-shell 命令用法:
      • Impala-shell --user root
        • -u 執行某一用戶運行impala-shell
          • --user 指定用戶執行shell 命令
          • --ssl 經過ssl 驗證方式方式執行
          • --ca_cert 指定第三方用戶證書
          • --config_file 臨時指定配置文件
        • -p 顯示執行計劃
          • --quiet 不顯示多餘信息
            impala-shell -q "select * from impala.rstest limit 5" -p
            ###這個命令雖然頗有用,可是咱們使用的時候不多,由於內部shell 有一個更好用的profile

             

        • -q 不進入impala-shell 執行查詢

        • -c 忽略錯誤語句繼續執行

        • -d 指定進入某一個數據庫

          • Impala-shell -d database(database 指定數據庫名稱)

Impala-shell(內部shell)

  • 幫助選項
    • help
  • 鏈接到某個impalad 實例
    • connect <hostname>
  • 刷新某個表元數據
    • *refresh <tablename> //屬於增量刷新
  • 刷新元數據庫
    • *invalidate metadata //全量刷新,性能消耗較大
  • 顯示一個查詢的執行計劃及各步驟信息
    • *explain <sql> //能夠設置set explain_level 四個級別0開始,通常用2級別便可,查看執行計劃等詳細信息
  • 不退出impala-shell 執行操做系統命令
    • shell <shell>
    • shell ls
  • 顯示查詢底層信息(底層執行計劃,用於性能優化)
    • *profile //在查詢完成以後執行
  • 執行計劃存儲下來分析
    impala-shell -q "select name from person" -p >> impalalog.123
  • 查看StateStore(監控管理)
    • – http://cdh1:25020/

       

  • 查看Catalog(監控管理)
    • – http://cdh2:25010/

       

Impala 存儲與分區

  • 須要注意的是impala 除了所有支持hive 的文件類型,本身還支持parquet 這樣的文件類型,固然了,這個類型並非impala 本身獨有的,好比spark sql,shark sql 都支持這樣的類型;Rcfile 自己快一些,可是不如text 才作起來更方便
  • 壓縮方式
  • 添加分區方式
    --一、partitioned by 建立表時,添加該字段指定分區列表
    --二、使用alter table 進行分區的添加和刪除操做
    • create table t_person(id int, name string, age int) partitioned by (type string);
    • alter table t_person add partition (type='man');
    • alter table t_person drop partition (type='man');
    • alter table t_person drop partition (sex='man',type='boss');
  • 分區內添加數據

    insert into t_person partition (type='boss') values (1,'zhangsan',18),(2,'lisi',23)
    
    insert into t_person partition (type='coder') values
    (3,'wangwu',22),(4,'zhaoliu’,28),(5,'tianqi',24)
  • 查詢指定分區數據

    select id,name from t_person where type='coder'

     

impala-SQL、JDBC、性能優化

  • 加載數據:
    • insert 語句:插入數據時每條數據產生一個數據文件,不建議用此方式加載批量數據
    • load data 方式:在進行批量插入時使用這種方式比較合適
    • 來自中間表:此種方式使用於從一個小文件較多的大表中讀取文件並寫入新的表生產少許的數據文件。也能夠經過此種方式進行格式轉換。
  • 空值處理:
  • impala 將「\n」表示爲NULL,在結合sqoop 使用是注意作相應的空字段過濾,也可使用如下方式進行處理:
    alter table name set tblproperties (「serialization.null.format」=「null」)

     

  • 配置:

    – impala.driver=org.apache.hive.jdbc.HiveDriver
    – impala.url=jdbc:hive2://node2:21050/;auth=noSasl
    – impala.username=
    – impala.password=

     

  • 儘可能使用PreparedStatement執行SQL語句:

    • 性能上PreparedStatement要好於Statement

    • Statement存在查詢不出數據的狀況

  • 執行計劃

  • – 查詢sql執行以前,先對該sql作一個分析,列出須要完成這一項查詢的
    詳細方案(命令:explain sql、profile)

總結:

一、SQL優化,使用以前調用執行計劃
二、選擇合適的文件格式進行存儲
三、避免產生不少小文件(若是有其餘程序產生的小文件,可使用中間
表)
四、使用合適的分區技術,根據分區粒度測算
五、使用compute stats進行表信息蒐集
六、網絡io的優化:
    a.避免把整個數據發送到客戶端
    b.儘量的作條件過濾
    c.使用limit字句
    d.輸出文件時,避免使用美化輸出
七、使用profile輸出底層信息計劃,在作相應環境優化

Impala SQL VS HiveQL

  • 支持數據類型
    • INT
    • TINYINT
    • SMALLINT
    • BIGINT
    • BOOLEAN
    • CHAR
    • VARCHAR
    • STRING
    • FLOAT
    • DOUBLE
    • REAL
    • DECIMAL
    • TIMESTAMP
  • CDH5.5版本之後才支持一下類型
    • ARRAY
    • MAP
    • STRUCT
    • Complex
  • 此外,Impala不支持HiveQL如下特性:
    • – 可擴展機制,例如:TRANSFORM、自定義文件格式、自定義SerDes
    • – XML、JSON函數
    • – 某些聚合函數:
      • covar_pop, covar_samp, corr, percentile,percentile_approx, histogram_numeric, collect_set
      • Impala僅支持:AVG,COUNT,MAX,MIN,SUM
      • – 多Distinct查詢
      • – HDF、UDAF

Impala SQL(和Hive相似)

  • 視圖
    • – 建立視圖:create view v1 as select count(id) as total from tab_3 ;
    • – 查詢視圖:select * from v1;
    • – 查看視圖定義:describe formatted v1
    • 注意:
      • 不能向impala的視圖進行插入操做
      • insert 表能夠來自視圖
相關文章
相關標籤/搜索