解析HetuEngine實現On Yarn原理

語言: CN / TW / HK
摘要:本文介紹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提供的能力,感興趣的讀者可以深入閱讀開源社群相關的介紹。

 

點選關注,第一時間瞭解華為雲新鮮技術~