Presto優化

Presto優化之數據存儲

  1. 合理設置分區
    與Hive類似,Presto會根據元數據信息讀取分區數據,合理的分區能減少Presto數據讀取量,提升查詢性能。
  2. 使用列式存儲
    Presto對ORC文件讀取做了特定優化,因此在Hive中創建Presto使用的表時,建議採用ORC格式存儲。相對於Parquet,Presto對ORC支持更好。
  3. 使用壓縮
    數據壓縮可以減少節點間數據傳輸對IO帶寬壓力,對於即席查詢需要快速解壓,建議採用Snappy壓縮。

Presto優化之查詢SQL

  1. 只選擇使用的字段
    由於採用列式存儲,選擇需要的字段可加快字段的讀取、減少數據量。避免採用*讀取所有字段。
  2. 過濾條件必須加上分區字段
    對於有分區的表,where語句中優先使用分區字段進行過濾。acct_day是分區字段,visit_time是具體訪問時間。
  3. Group By語句優化
    合理安排Group by語句中字段順序對性能有一定提升。將Group By語句中字段按照每個字段distinct數據多少進行降序排列。
    Order by時使用Limit
  4. Order by需要掃描數據到單個worker節點進行排序,導致單個worker需要大量內存。如果是查詢Top N或者Bottom N,使用limit可減少排序計算和內存壓力。
  5. 使用Join語句時將大表放在左邊 (這裏跟hive有差異
    Presto中join的默認算法是broadcast join,即將join左邊的表分割到多個worker,然後將join右邊的表數據整個複製一份發送到每個worker進行計算。如果右邊的表數據量太大,則可能會報內存溢出錯誤。

注意事項

  1. 字段名引用
    避免和關鍵字衝突:MySQL對字段加反引號`、Presto對字段加雙引號分割
    當然,如果字段名稱不是關鍵字,可以不加這個雙引號。
  2. 時間函數
    對於Timestamp,需要進行比較的時候,需要添加Timestamp關鍵字,而MySQL中對Timestamp可以直接進行比較。
/*MySQL的寫法*/
SELECT t FROM a WHERE t > '2017-01-01 00:00:00'; 

/*Presto中的寫法*/
SELECT t FROM a WHERE t > timestamp '2017-01-01 00:00:00';
  1. 不支持INSERT OVERWRITE語法
    Presto中不支持insert overwrite語法,只能先delete,然後insert into。
  2. PARQUET格式
    Presto目前支持Parquet格式,支持查詢,但不支持insert。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章