深入解析HetuEngine實現On Yarn原理
摘要:本文介紹HetuEngine實現On Yarn的原理,通過閱讀本文,讀者可以瞭解HetuEngine如何在資源使用方面融入Hadoop生態體系。
本文分享自華為雲社區《MRS HetuEngine 特性之 On Yarn原理介紹》,作者:一顆檸檬。
HetuEngine是華為自研高性能分佈式SQL查詢&數據虛擬化引擎。與大數據生態無縫融合,實現海量數據秒級查詢;支持多源異構協同,使能數據湖內一站式SQL融合分析。在整合開源能力的同時,MRS HetuEngine相較於開源社區也做瞭大量的優化,其中一個重要的特性就是On Yarn。
什麼是On Yarn?
顧名思義,就是將進程運行在Yarn上,由Yarn進行資源的管理和調度。
不論是TrinoDB/PrestoDB還是openLooKeng,部署方式都是將coordinator和worker進程直接運行在主機上,與主機上的其他應用程序共享資源,無法做到資源隔離,並且難以擴展。
MRS HetuEngine借助Yarn Service提供的能力,將coordinator和worker進程以Yarn application的形式運行在Yarn container中,通過MRS集群的租戶劃分,可以將HetuEngine計算實例啟動在特定租戶隊列裡,從而實現資源隔離。
HetuEngine架構
下圖是HetuEngine的拓撲圖。HetuEngine向下可以對接各類數據源(比如Hive,GaussDB,HBASE,Elasticsearch等),對外向用戶提供CLI/JDBC接口。在同一套MRS集群中,HetuEngine可以在不同租戶隊列中啟動多個HetuEngine計算實例,支持一個租戶隊列上啟動一個計算實例。由HetuEngine的HSBroker實例與Yarn Service交互,將租戶隊列與計算實例綁定,由HSConsole提供運維管理頁面,對HetuEngine的多個計算實例進行運維管理操作,包括啟動、停止、刪除計算實例,對計算實例進行資源配置,擴縮容等。
HetuEngine On Yarn原理
如前所述,On Yarn就是把進程運行在瞭Yarn 的container中。HetuEngine 是如何實現將coordinator 和worker運行中Yarn中呢?
Yarn Service提供瞭一系列API以及一個通用的AM,讓用戶可以調用API即可將任務提交到Yarn上,由Yarn實現任務的容器化,對容器進行資源和生命周期管理。詳細請參考開源社區的介紹。https://hadoop.apache.org/docs/r3.1.0/hadoop-yarn/hadoop-yarn-site/yarn-service/Overview.html
HetuEngine的 On Yarn實現正是借助瞭Yarn Service所提供的能力。在HetuEngine的HSBroker中,調用Yarn Service的API,拉起application,在container中運行HetuEngine自己的進程,也就是coordinator和worker。其中有以下幾個關鍵點:
Yarn Service API
創建一個Yarn Service服務的接口是/app/v1/services,參數json結構如下。
POST /app/v1/services { "name": "hello-world", "version": "1.0.0", "description": "hello world example", "components" : [ { "name": "hello", "number_of_containers": 1, "artifact": { "id": "nginx:latest", "type": "DOCKER" }, "launch_command": "./start_nginx.sh", "resource": { "cpus": 1, "memory": "256", "additional" : { "yarn.io/gpu" : { "value" : 4, "unit" : "" } } } } ]
- name:服務名稱,顯示在Yarn的resource manager WEB界面servicename;
- version:版本號
- description:服務的描述
- components:一個service中可以包含多個component,以運行不同的任務;
- components.name:component名稱
- number_of_containers:此component中container的數量;
- artifact:進程依賴的資源文件,包含id和type信息,type支持docker和tarball
- launch_command:進程啟動命令
- resource:此component所需的資源。
HetuEngine的HSBroker根據用戶輸入構造此json,然後調用Yarn Service API,實現On Yarn。此外Yarn Service還提供stop/delete等API,也由HSBroker調用,實現對HetuEngine計算實例的停止/刪除等運維操作。
依賴文件
Yarn Service支持資源文件在HDFS上的形式啟動進程,其提供的API可以接收tar包以及docker等形式的資源文件,由Yarn Service自行將HDFS上的文件進行資源本地化。因此,HetuEngine隻需將依賴的jar包和資源文件提前部署在HDFS上的指定位置,在調用Yarn Service的API時指定資源文件即可。
租戶綁定
HetuEngine支持將計算實例與Yarn的租戶隊列綁定,每個隊列上都可以運行一套coordinator + worker的組合。基於前面Yarn Service能力,隻需在構造json時,指定隊列信息即可。除瞭隊列,還可以設置container的放置策略(plecement policy),這裡不進行詳述,可以參考yarn的文檔。
資源管理
HetuEngine支持用戶自定義coordinator和worker的個數以及CPU內存大小。如下圖,在HetuEngine的HSConsole頁面,用戶可以設置計算實例的CPU,內存,節點個數。內部實現是由HSBroker接收用戶輸入,將container運行所需的資源大小設置在json的resource段中。
當前HetuEngine支持橫向擴展worker的個數,實現資源的彈性伸縮。即使在計算實例處於運行中時,也可以手動調整worker的個數,無需重啟計算實例。這得益於Yarn Service的API中提供的flex接口,可以實現向一個運行中的application增加或者減少container的數量。
客戶端使用
HetuEngine的計算實例創建完成後,用戶可以通過hetu-cli或者JDBC程序進行訪問,需要用戶綁定對應的租戶隊列權限,才能向指定的隊列提交任務。
Hetu CLI示例:
hetu-cli --catalog hive --tenant tenantName --schema schemaName
租戶名:(可選)租戶名。指定HetuEngine啟動的租戶資源隊列,不指定為租戶的默認隊列。使用此參數時,kinit的用戶需要具有該租戶對應角色的權限。
Hetu JDBC示例:
Properties properties = new Properties(); ...… properties.setProperty("tenant", "default"); properties.setProperty("deploymentMode", "on_yarn"); …… connection = DriverManager.getConnection(url, properties); ……
本文主要介紹瞭HetuEngine On Yarn的原理,其實現主要是借助瞭Yarn Service提供的能力,感興趣的讀者可以深入閱讀開源社區相關的介紹。
到此這篇關於解析HetuEngine實現On Yarn原理的文章就介紹到這瞭,更多相關HetuEngine實現On Yarn原理內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Docker-Compose搭建Spark集群的實現方法
- 使用Vscode結合docker進行開發的詳細過程
- Docker多個容器不能有相同端口號的處理方案
- yarn的安裝及使用詳解
- 使用遠程Docker進行集成測試的環境搭建過程