寫於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
- VARCHAR, VARCHAR2, CHAR, NCHAR, NVARCHAR, CLOB, NCLOB
- 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;
- 手工指定關聯表分發順序: select straight_join x from medium join small join
優化-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;
- insert into t1 partition(x, y=’b’) select c1, c2 from
參考
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