rdbms遷移到Impala2.0

寫於2014年秋,impala2.0

Impala特點

  • 定位於OLAP分析
  • 和hadoop集成,可與hadoop同樣方式擴展
  • 多種數據文件格式存儲
    • Parquet、text可讀寫;Avro、RCFILE、SequenceFile可讀;都支持gzip、Snappy壓縮
  • 支持HBase存儲
  • 與Hive共享元數據
  • MPP引擎

遷移

  • 數據類型
    • VARCHAR, VARCHAR2, CHAR, NCHAR, NVARCHAR, CLOB, NCLOB
      對應STRING,無長度,2.0開始支持VARCHAR
    • DATE, DATETIME, TIME對應TIMESTAMP
    • SELECT NOW() + INTERVAL time_period DAYS from deadlines;
    • DECIMAL, NUMBER對應FLOAT, DOUBLE ,不能指定固定精度
    • 整型都是有符號類型
    • 不支持複合或嵌入類型,像maps、Structs、 Arrays
    • 不支持PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, UNSIGNED, CHECK
      constraints, DEFAULT
    • 不支持索引
    • 使用函數時,類型不對或者超出範圍返回NULL
    • 支持JAVA,C++自定義函數、聚合函數;當catalogd重啓後,函數須重新load
  • SQL
    • 不支持DELETE ,可用INSERT OVERWRITE代替
    • 不支持UPDATE
    • 沒有事務,也就沒有COMMIT、ROLLBACK
    • 數據庫、表、字段等都不能與impala保留字衝突
    • 僅支持FROM後面的子查詢,不支持IN,NOT IN, EXISTS, NOT EXISTS的子查詢
    • 每個子查詢必須有別名
    • 分區字段必須是特定的值,不能是範圍
    • top-N 用limit

SQL通用優化方法

  • 過濾數據
    • Where過濾數據條數
    • 只取必要字段
  • 減少數據量
    • 彙總
    • 子查詢
  • 少用關聯
    • 可用union all替換部分
    • 少用外關聯
    • 冗餘
  • 列上少用函數
    • 在參數上用函數
  • 批處理
    • 一起做,而不是分開做
  • 預處理
    • 能提前處理的提前處理
  • 物盡其用

性能最佳實踐

  • 合適的數據文件格式
    • 大數據量下snappy壓縮的parquet性能表現最好
  • 避免產生大量小文件
    • INSERT … SELECT,而不是INSERT … VALUE
  • 合適的分區粒度
    • 分區數最好在3萬以下
  • 合適的分區類型
    • Integer類型代替string類型
    • Tinyint代表smallint
  • 合適的parquet塊大小
  • 收集表信息
    • 在load或者insert後
  • 最小化傳輸給客戶端的數據量
    • 彙總
    • 過濾
    • Limit
    • 合適的輸出格式
  • 確認執行計劃符合預期
  • 確認性能瓶頸

優化-關聯

  • Broadcast joins
    • 默認方式,把關聯右邊的表傳輸到其他所有參與計算節點
    • Example: BIG, MEDIUM, SMALL, and TINY, the logical join order to try
      would be BIG, TINY, SMALL, MEDIUM.
    • 表及列信息可用時,系統可以根據表大小做優化,如果不可用,則是Broadcast joins
  • partitioned join
    • 把需要的數據並行分發到不同的的節點計算
  • STRAIGHT_JOIN
    • 手工指定關聯表分發順序: select straight_join x from medium join small join
      (select * from big where c1 < 10) as big where medium.id = small.id
      and small.id = big.id;

優化-HDFS caching

  • 特點
    • 類似於MySQL中的內存表
    • hdfs cacheadmin -addPool four_gig_pool -owner impala -limit
      4000000000
    • 表和分區都可以pinned內存中,語法:cached in ‘pool_name’
    • 緩存滿時報錯
  • 建議
    • 緩存維表、參數表
    • 緩存臨時表,用完後清空

優化-分區

  • 何時需要分區
    • 表非常大
    • 根據某列特定值查詢
    • 某列只有特定幾個值
    • 通過ETL處理的數據
    • 因爲SQL不支持delete而加的分區
  • 使用
    • insert into t1 partition(x, y=’b’) select c1, c2 from
      some_other_table;
    • insert into weather partition (year, month, day) select
      ‘cloudy’,2014,4,21;
    • insert into weather partition (year=2014, month=04, day) select
      ‘sunny’,22;

參考

Coming to Impala from an RDBMS Background https://www.safaribooksonline.com/library/view/cloudera-impala/9781491949474/ch04.html
Tuning Impala for Performance http://www.cloudera.com/content/cloudera/en/documentation/cloudera-impala/latest/topics/impala_performance.html
Porting SQL from Other Database Systems to Impala http://www.cloudera.com/content/cloudera/en/documentation/cloudera-impala/latest/topics/impala_porting.html
Hive wiki https://cwiki.apache.org/confluence/display/Hive/Home

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章