MLSQL新特性:MLSQL-Cluster預覽
前言
MLSQL-Cluster 在v1.1.6版本中釋出。隨著MLSQL部署的例項愈發的增多,有給各條業務線部署的MLSQL instances group,也有給演算法組,研發組等等部署的單獨MLSQL instances group. 我們希望所有這些MLSQL 例項能夠被:
- 統一的管理
- 組內的負載均衡
- 不同組之間互相借用資源
- 同組內的MLSQL 例項數動態調整
MLSQL-Cluster 實現了相關功能。架構圖如下:
構建MLSQL-Cluster
streamingpro-cluster
mvn -Pcluster-shade -am -pl streamingpro-cluster clean package
- 啟動mlsql-cluster:
java -cp .:streamingpro-cluster-1.1.6-SNAPSHOT.jar tech.mlsql.cluster.ProxyApplication -config application.yml
負載均衡
MLSQL-Cluster 和MLSQL instances 是完全解耦的,對原有例項不需要做什麼調整。你需要主動將你的MLSQL 例項資訊新增到mlsql-cluster中。比如,我現在有一個伺服器如下:
name=backend1 url=127.0.0.1:9003 tag=group1,read,write
這臺伺服器叫backend1, 連結地址是 127.0.0.1:9003
,歸屬於group1,並且可讀可寫。現在我們把這個資訊寫入到mlsql cluster中:
curl -XPOST http://127.0.0.1:8080/backend/add -d 'name=backend1&url=127.0.0.1%3A9003&tag=read%2Cwrite'
現在,你可以不用去訪問原來的9003埠,而是直接訪問mlsql cluster了:
# sql=select sleep(1000) as a as t; # tags= group1 # proxyStrategy=ResourceAwareStrategy|JobNumAwareStrategy|AllBackendsStrategy curl -X POST \ http://127.0.0.1:8080/run/script \ -H 'content-type: application/x-www-form-urlencoded' \ -d 'sql=select%20sleep(100000)%20as%20a%20as%20t%3B&tags=group1'
mlsql cluster 會找到所有有group1標籤的MLSQL instances,然後採用某種分發策略做負載均衡。目前支援三種:
- ResourceAwareStrategy CPU最空閒的instance將優先獲得請求
2.JobNumAwareStrategy 任務書最少的的instance將優先獲得請求 - AllBackendsStrategy 所有instances都將獲得請求(比如一些登錄檔,註冊資訊等)
Dynamic Resoruce Allocation
MLSQL instance 如果開啟DRA,那麼可以實現自己內部的executor數的動態調整。MLSQ-Cluster 主要是在MLSQL 例項上做調整。比如A業務後端有兩個MLSQL 例項,每個例項有10個worker節點。前者控制的是這10個worker節點,MLSQL-cluster 則控制的是例項數。為了使用該功能,你只需要通過
/monitor/add
介面新增DRA 引數:
"name" -> "jack-monitor", "tag" -> "jack", "minInstances" -> "1", "maxInstances" -> "3", "allocateType" -> "local", "allocateStrategy" -> "JobNumAwareAllocateStrategy"
監控名叫jack-monitor, 監控具有jack標籤的組,最大最小例項數在1-3之間,新增的例項採用local模式執行,觸發策略是JobNumAwareAllocateStrategy。 根據JobNumAwareAllocateStrategy策略為: 如果jack組的所有請求例項在N個週期內都一直沒有空閒的,那麼觸發新的例項分配。
接著我們需要告訴系統,哪裡有資源,這可以通過 /ecs/add
介面:
"ip" -> "127.0.0.1", "keyPath" -> "./ssh/private-key", "loginUser" -> "root", "name" -> "backend2", "sparkHome" -> "/home/spark", "mlsqlHome" -> "/home/mlsql", "mlsqlConfig" -> """ |{"master":"local", |"name":"mlsql", |"conf":"spark.serializer=org.apache.spark.serializer.KryoSerializer", |"streaming.name":"mlsql", |"streaming.driver.port":"9003", |"streaming.spark.service":"true", |"streaming.platform":"spark" |} """.stripMargin, "executeUser" -> "webuser", "tag" -> "jack"
比較特殊是,我們需要proxy機器能夠免密碼登入到所有可以執行spark-submit命令的機器上。之後會根據這些配置啟動新的例項,並且自動註冊到代理列表中。