使用presto-gateway在多個presto集群間調(diào)度任務(wù)

1.? ? 概述

Presto是一個Facebook開源的分布式SQL查詢引擎,適用于交互式分析查詢,數(shù)據(jù)量支持GB到PB字節(jié)??蛻粼谑褂肞resto的時候發(fā)現(xiàn)單個集群不能滿足業(yè)務(wù)需求,而建立多個Presto集群之后,如何在集群間調(diào)度任務(wù)就成為一個問題。在Presto中,一個Query執(zhí)行周期內(nèi)需要客戶端和服務(wù)端進行多次的HTTP請求,在多集群模式下,如何保證同一個Query的請求都分發(fā)到同一個集群呢?

通過測試,使用AWSALB作為分發(fā)會導(dǎo)致前后HTTP請求被轉(zhuǎn)發(fā)到不同的集群,從而無法得到查詢結(jié)果。使用AWS NLB可以正常的執(zhí)行查詢,但是單個客戶端的請求在短時間會集中轉(zhuǎn)發(fā)給一個集群,無法分散。

幸好,Lyft為解決這個問題而開發(fā)了presto-gateway這個工具,并將它開源出來。(https://github.com/lyft/presto-gateway

2.? ?Presto-gateway介紹

Presto-gateway是在多個Presto集群前的一個有狀態(tài)Load-balancer,Proxy和Router,它提供了透明的訪問方法。如下圖:(內(nèi)容來自于https://eng.lyft.com/presto-infrastructure-at-lyft-b10adb9db01)


Presto-gateway通過追蹤查詢ID來保證后續(xù)請求轉(zhuǎn)到原來的集群上。


3.? ? 準備工作

Presto-gateway使用MySQL來記錄后端Presto集群和查詢歷史,所以我們需要先準備一臺MySQL服務(wù)器,自建或者托管的RDS均可。

創(chuàng)建一個數(shù)據(jù)庫prestogateway:

CREATE DATABASE prestogateway

根據(jù)https://github.com/lyft/presto-gateway/blob/master/gateway-ha/src/main/resources/gateway-ha-persistence.sql文件內(nèi)容創(chuàng)建表。

4.? ? 編譯presto-gateway

準備一臺服務(wù)器,編譯環(huán)境需要JDK1.8和Maven,在Amazon Linux 2上,JDK已經(jīng)默認安裝了,Maven可以通過 ?sudo yum install maven來完成安裝。

先用gitclone代碼:

??????? git clone https://github.com/lyft/presto-gateway.git

用Maven編譯:

??????? cd presto-gateway

mvn clean install


5.? ? 運行presto-gateway

先更改gateway-ha目錄下配置文件 gateway-ha-config.yml,行10到14部分,修改MySQL地址和用戶名密碼:

dataStore:

? jdbcUrl:jdbc:mysql://:3306/prestogateway

? user:

? password:

? driver:com.mysql.cj.jdbc.Driver


然后就可以啟動pesto-gateway服務(wù)了:

cd gateway-ha/target/

java -jar gateway-ha-1.8.8-SNAPSHOT-jar-with-dependencies.jarserver ../gateway-ha-config.yml

如果需要長期運行,可以通過 nohup &方式來執(zhí)行。

6.? ?增加和修改presto集群

可以通過兩種方式來將Presto集群添加進來,如果名字相同,則可以更新現(xiàn)有信息。

1.通過CURL命令:

curl -X POST

http://localhost:8080/entity?entityType=GATEWAY_BACKEND \

?-d '{?"name": "presto1",

??????? "proxyTo":"http://172.31.201.65:8889",

??????? "active": true,

??????? "routingGroup":"adhoc"

??? }'


2.通過Web UI:

http://<server-ip>:8090/entity



7.? ? 查詢presto集群

同樣可以通過CURL命令和Web UI兩種方法來查詢:

? ? ? ? curl -X GET http://localhost:8080/entity/GATEWAY_BACKEND


[

??? {

???????"active": true,

???????"externalUrl": "http://172.31.201.65:8889",

???????"name": "presto1",

???????"proxyTo": "http://172.31.201.65:8889",

???????"routingGroup": "adhoc"

??? },

??? {

???????"active": true,

???????"externalUrl": "http://172.31.201.117:8889",

???????"name": "presto2",

???????"proxyTo": "http://172.31.201.117:8889",

???????"routingGroup": "adhoc"

??? },

]


或者訪問: http://:8090/viewgateway


8.? ?刪除presto集群

在刪除presto集群前,可以先將它deactivate,這樣新的查詢就不會轉(zhuǎn)到該集群,能夠更優(yōu)雅的將集群移除。

curl -X POST http://localhost:8080/gateway/backend/deactivate/presto2

通過WebUI更新該集群的active屬性為false也能完成同樣目的。

再通過以下命令完成刪除:

curl -X POST -d "presto2"

http://localhost:8080/gateway/backend/modify/delete

刪除操作無法在WebUI上完成。


9.? ? 查詢歷史

在添加Presto集群之后,客戶端就可以通過:8080來提交查詢請求,就像連接原來的Presto一樣。提交查詢之后,就可以在Web UI上看到歷史:http://:8080/

從底部的統(tǒng)計可以看到查詢平均分發(fā)到兩個集群上。


10.? ? ? ? 健康檢查

Presto-gateway每分鐘會檢查后端Presto集群是否健康,如果發(fā)現(xiàn)不正常,它會自動發(fā)送郵件通知,相關(guān)設(shè)置在配置文件 gateway-ha-config.yml中,如下:

notifier:

? smtpHost: localhost

? smtpPort: 587

? sender:presto-gw-monitor-noreply@lyft.com

? recipients:

??? - prestodev@yourorg.com

11.? ? ? ? 路由規(guī)則引擎

Presto-gateway提供了用戶可以自定義路由規(guī)則的功能來重定向請求到不同集群,這個規(guī)則可以通過修改配置文件來設(shè)置。

routingRules:

? rulesEngineEnabled: true

? rulesConfigPath:"src/test/resources/rules/routing_rules.yml" # replace with path toyour rules config file


12.? ? ? ? 附錄

參考鏈接:

https://github.com/lyft/presto-gateway

https://medium.com/pinterest-engineering/presto-at-pinterest-a8bda7515e52

https://eng.lyft.com/presto-infrastructure-at-lyft-b10adb9db01

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容