Presto處理並行job時的效能問題

這一陣子在替人搭建Presto當做data warehouse,同時使用airbnb的superset當做資料可視化的工具

但是在測試過程中遇到了一個問題,superset的dashboard會"同時"的丟許多query到presto查詢(大約十幾個)

整個dashboard既然因為回應太慢而出現timeout錯誤

一開始以為是不是因為presto不支援並行job的處理

找了一下網路上資料
http://teradata.github.io/presto/docs/148t/admin/tuning.html#tuning-pref-task

照到理應該會支援並行job才對阿

但是實際測試結果,假設我一個Query需要花N秒,那我同時丟20個Query就必須大約等20*N秒才會有結果

測試腳本如下

prestocli='java -jar /usr/local/prestocli.jar --server server1 --catalog hive --schema default'
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20;
do
   time $prestocli --execute "SELECT count(1) FROM hive.mydb.mytable LIMIT 100" &
done

SELECT count(1) FROM hive.mydb.mytable LIMIT 100這個query單一執行原本只需要2秒
但是我同時丟20次,他要將近35~40秒才會全部跑完

後來上網查了一下也有人遇過類似的問題
https://groups.google.com/forum/#!topic/presto-users/IEdzrGdMNXQ

後來有找到可以從Query Config去調整一些參數,其中有個user_pipeline.${USER}預設值只有1
https://prestodb.io/docs/current/admin/queue.html

死馬當活馬醫試著把他加入環境中
首先修改$PRESTO_HOME/presto/etc/config.properties指定Query Config位置

$PRESTO_HOME/presto/etc/config.properties
...
query.queue-config-file=/usr/local/presto/etc/presto-queues.json

並且新增一個presto-queues.json

/usr/local/presto/etc/presto-queues.json
{
  "queues": {
    "user.${USER}": {
      "maxConcurrent": 100,
      "maxQueued": 200
    }
  },
  "user_pipeline.${USER}": {
      "maxConcurrent": 10,
      "maxQueued": 20
    },
    "pipeline": {
      "maxConcurrent": 10,
      "maxQueued": 100
    },
  "rules": [
    {
      "queues": ["user.${USER}"]
    }
  ]
}

後來又測試了一次,這次結束所花時間大約是28~32秒

嗯..沒有很明顯的改善,後來想到presto可以支援多個coordinator

那如果我把query的台數增多呢?

後來增加了兩台coordinator,總共三台coordinator來幫忙

重新測試一次,測試腳本如下

prestocli0='java -jar /usr/local/prestocli.jar --server server1 --catalog hive --schema default'
prestocli1='java -jar /usr/local/prestocli.jar --server server2 --catalog hive --schema default'
prestocli2='java -jar /usr/local/prestocli.jar --server server3 --catalog hive --schema default'
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20;
do
   ind=$(($i % 3))
   cmd=prestocli$ind
   time ${!cmd} --execute "SELECT count(1) FROM hive.mydb.mytable LIMIT 100" &
done

這次所花時間約是20~25秒,這次效果好多了
或許還有調整空間,以候有機會在試試

comments powered by Disqus