1. 概要
Drill是Apache旗下的一個開源SQL查詢引擎,可用于探索大資料。它的設計初衷是為了支援對大資料的高性能分析,同時支援行業标準查詢語言ANSI SQL。
在Drill 1.13之前,Drill隻支援獨立叢集部署,部署成功後每個節點上會運作一個名為Dirllbit的守護程序。從1.13版本開始,Drill支援與YARN內建來管理資源。使用YARN後,Drill将成為一個運作在YARN上的長程序。當您啟動Drill時,YARN會自動将Drill軟體部署到每個節點上,避免了在每個節點上安裝Drill的繁瑣。除此之外,資源管理也會得到簡化,因為YARN對于Drill使用的資源是敏感的。
目前所有YARN發行版都提供了記憶體和CPU(YARN稱為“vcores”)的設定,某些發行版還提供磁盤的設定。對于記憶體,在把Drill部署在YARN上的時候,你會配置Drill要使用的記憶體,然告知YARN。此外,Drill将使用所有可用的磁盤和CPU,當然可以啟用Linux cgroup來限制Drill對CPU使用的,以到比對YARN的vcores配置設定。
為了友善講解在YARN下部署Drill,先簡單介紹YARN的核心概念。
2. YARN核心概念
YARN全稱是Yet Another Resource Negotiator(另一種資源協調者),是一種新的Hadoop資料總管,它是一個通用資源管理系統,可為上層應用提供統一的資源管理和排程。
2.1 核心元件
- ResurceManager(RM):一個全局的資料總管,負責整個系統的資源管理和配置設定。它主要由兩個元件構成:排程器(Scheduler)和應用程式管理器(Applications Manager,ASM)。
- ApplicationMaster(AM):使用者送出的每個應用程式均包含一個AM,主要功能包括
- 與RM排程器協商以擷取資源(以Container表示)
- 與NM通信以啟動/停止任務
- 監控所有任務運作狀态,并在任務失敗時重新為任務申請資源以重新開機任務
- Container :Container是YARN中的資源抽象,它封裝了某個節點上的多元資源,如CPU、記憶體、磁盤、絡等。當AM向RM申請資源時,RM向AM傳回的資源便是用Container表示的。YARN會為每個任務配置設定一個Container,且該任務隻能使用該Container中描述的資源。Container是一個動态資源劃分機關,是根據應用程式的需求自動生成的。
- NodeManager(NM) :NM是每個節點上的資源和任務管理器。一方面,它定時地向RM彙報本節點的資源使用情況和Container運作狀态;另一方面,它接受并處理來自AM的Container啟動/停止等各種請求。
- 用戶端(Client):是叢集中一個能向RM送出應用的執行個體,并且指定了執行應用所需要的AM類型。
2.2 YARN工作流程
當使用者向YARN中送出一個任務後,YARN将分兩個階段運作該任務:第一階段是啟動AM。第二階段是由AM建立任務,為它申請資源,并監控它的整個運作過程,直到運作完成。具體如下:
- 使用者向YARN中送出任務,其中包括AM程式、啟動AM的指令等。
- RM為該應用程式配置設定第一個Container,通常稱為001,并與對應的NM通信,要求它在這個Container中啟動應用程式的AM。
- AM首先RM注冊,這樣使用者就可以直接通過RM檢視任務的運作狀态,然後它将為各個任務申請資源,并監控它的運作狀态,直到運作結束,即重複步驟4~7。
- AM采用輪詢的方式通過RPC協定向RM申請和領取資源。
- 一旦AM申請到資源後,便與對應的NM通信,要求它啟動任務。
- NM為任務設定好運作環境(包括環境變量、JAR包、二進制程式等)後,将任務啟動指令寫到一個腳本中,并通過運作該腳本啟動任務。
- 各個任務通過RPC協定向AM彙報自己的狀态和進度,以讓AM随時掌握各個任務的運作狀态,進而可以在任務失敗時重新啟動任務。
- 應用程式運作完成後,AM向RM登出并關閉自己。
2.3 如何編寫YARN應用程式
- 編寫用戶端
- 初始化并啟動一個YarnClient
// 初始化并啟動一個YarnClient
Configuration yarnConfig = new YarnConfiguration(getConf());
YarnClient client = YarnClient.createYarnClient();
client.init(yarnConfig);
client.start();
...
- 建立一個應用程式
// 建立一個應用程式
YarnClientApplication app = client.createApplication();
GetNewApplicationResponse appResponse = app.getNewApplicationResponse();
...
- 設定上下文
// 設定應用程式送出上下文
ApplicationSubmissionContext appContext = app.getApplicationSubmissionContext();
appContext.setApplicationId(appResponse.getApplicationId());
appContext.setApplicationName(config.getProperty("app.name"));
appContext.setApplicationType(config.getProperty("app.type"));
...
// 設定am container啟動上下文
ContainerLaunchContext amContainer = Records.newRecord(ContainerLaunchContext.class);
amContainer.setLocalResources(amLocalResources);
amContainer.setEnvironment(amEnvironment);
amContainer.setCommands(Collections.singletonList(amCommand.toString()));
...
- 送出應用程式
// 送出應用程式
client.submitApplication(appContext);
- 編寫ApplicationMaster(AM)
- 初始化AMRMClient,有同步和異步可選
// 初始化AMRMClientAsync
YarnConfiguration yarnConfig = new YarnConfiguration();
AMRMClientAsync amrmClientAsync = AMRMClientAsync.createAMRMClientAsync(5000, new AMRMCallbackHandler());
amrmClientAsync.init(yarnConfig);
amrmClientAsync.start();
- 初始化NMClient,有同步和異步可選
// 初始化NMClientAsync
YarnConfiguration yarnConfig = new YarnConfiguration();
NMClientAsync nmClientAsync = NMClientAsync.createNMClientAsync(new NMCallbackHandler());
nmClientAsync.init(yarnConfig);
nmClientAsync.start();
- 注冊ApplicationMaster(AM)
// 注冊ApplicationMaster(AM)
amrmClientAsync.registerApplicationMaster(thisHostName, 0, "");
...
- 添加ContainerRequest
// 添加ContainerRequest
amrmClientAsync.addContainerRequest(containerRequest);
...
- 啟動容器
// 啟動容器
nmClientAsync.startContainerAsync(container, containerContext);
...
- 登出
// 登出
amrmClientAsync.unregisterApplicationMaster(appStatus, appMessage, null);
這裡隻是簡單介紹了YARN的概念,以及如何編寫YARN應用程式,詳情可以參考
Apache Hadoop YARN3. Drill-on-YARN部署
3.1 Drill-on-YARN元件
- Drill發行包: Drill-on-YARN上傳此發行包至分布式檔案系統(如HDFS)。YARN下載下傳它到每個工作節點(即是Node Manager所在的節點)
- Drill site目錄: 一個包含Drill配置問和自定義jar包的目錄。Drill-on-YARN會拷貝它至每個工作節點
- 配置:一個用于告知Drill-on-YARN如何管理Drill叢集的配置檔案。這個檔案和drill本身的配置檔案互相獨立
- Drill-on-YARN client: Drill-on-YARN用戶端,提供了啟動、停止、監控等指令
- Drill Application Master (AM):用于和YARN互動,包括:請求資源、啟動Drillbits等。AM還提供了web界面用于管理Drill叢集
- Drillbit: 運作在每個節點的Drill守護程序
3.2. 部署步驟
YARN通過用戶端來啟動應用程式。對于Drill來說,就是Drill-on-YARN用戶端了。用戶端可以在任何機器上,隻要該機器同時有Drill和Hadoop軟體。使用YARN部署Drill時,您隻需要在用戶端計算機上安裝Drill,Drill-on-YARN會自動部署到其它節點。需要注意的是,當你不使用YARN部署Drill時,一般會将其配置檔案和自定義代碼放在Drill的目錄中,但是在YARN下運作時,建議所有配置和自定義代碼都會放在一個名為site的目錄中,勿改變Drill目錄中的任何内容。
接下來詳細說明部署步驟:
- 部署的環境
- JDK8+
- Zookeeper叢集
- Hadoop叢集
- 建立一個目錄,用于放置下載下傳好的Drill發行包
說明:執行完上面的指令後,所處的目錄為/path/to/drillexport DRILL_DIR=/path/to/drill mkdir -p $DRILL_DIR cd $DRILL_DIR
- 下載下傳Drill發行包,這裡使用apache-drill-1.14.0.tar.gz,下載下傳完後解壓,再次強調,目前所處的目錄為/path/to/drill
說明:DRILL_NAME很重要,後面啟動的時候和名字有關系export DRILL_NAME=apache-drill-1.14.0 tar -xzf $DRILL_NAME.tar.gz export DRILL_HOME=$DRILL_DIR/$DRILL_NAME
- 建立site目錄,并把配置檔案和自定義代碼放置在其中
說明:export DRILL_SITE=$DRILL_DIR/site mkdir -p $DRILL_SITE cp $DRILL_HOME/conf/drill-override-example.conf $DRILL_SITE/drill-override.conf cp $DRILL_HOME/conf/drill-on-yarn-example.conf $DRILL_SITE/drill-on-yarn.conf cp $DRILL_HOME/conf/drillenv.sh $DRILL_SITE
- 對于自定義代碼,一般都是打成jar包,放置在$DRILL_SITE/jars。比如自定義的udf,可以放在$DRILL_SITE/jars/3rdparty
- 不要拷貝drill-override-example.conf整個檔案,僅僅拷貝需要的配置,然後進行修改
-
修改$DRILL_SITE/drill-override.conf
一般情況下,可能需要修改的配置有:cluster-id、zk、http、rpc。此處,我隻修改cluster-id和zk
drill.exec: { cluster-id: "drillbits1" zk: { connect: "11.167.47.76:2181,11.167.57.229:2181,11.167.67.151:2181", root: "drill", refresh: 500, timeout: 5000, retry: { count: 7200, delay: 500 } } }
- 修改$DRILL_SITE/drill-on-yarn.conf
# Drillbit資源配置 drillbit: { heap: "4G" # Java heap size max-direct-memory: "8G" memory-mb: 12288 # 機關MB,container使用的記憶體,一般來說等于heap+max-direct-memory,但是建議大于這個值 vcores: 4 # cpu個數 } # Drillbit叢集組配置 cluster: [ { name: "mypool" type: "basic" # 可選的有basic和labeled,basic表示在YARN叢集上任意可用的container上啟動drillbits;labeled在一組特定labeled的容器中啟動drillbits count: 1 # 啟動的YARN容器個數 } ] # 配置drill發行包所在的位置 drill-install: { client-path: "/path/to/drill/apache-drill-1.14.0.tar.gz" # dir-name: "drill" } # 設定分布式檔案系統位置 dfs: { connection: "hdfs://ip:port/" dir: "/user/drill" } # Drill-on-YARN Web界面配置 drill.yarn:{ http: { port: 8048 } } # Drill-on-YARN Web界面安全配置 drill.yarn.http: { auth-type: "simple" user-name: "drill" // 注意,drill-on-yan-example.conf預設是user_name,這是錯誤的,要改成user-name password: "drill" }
- 關于Drillbit資源配置中的heap和max-direct-memory,在非YARN下部署,是修改$DRILL_HOME/conf/drillenv.sh檔案,但是在YARN下部署,是修改$DRILL_SITE/drill-on-yarn.conf。但是,如果你已經在drillenv.sh配置了,則drillenv.sh優先。
- Drillbit叢集組配置,雖然是個list,但目前隻支援配置一個
- dir-name特别說明,當你client-path解壓出來的檔案,目錄是apache-drill-1.14.0時,不需要配置dir-name,反之如果不是,請把解壓出來的檔案目錄名配上
- Web界面安全配置的auth-type支援simple和drill兩種,使用simple,需要指定使用者名和密碼,使用drill說明用drill的認證系統
drill.yarn: { app-name: "Drill-on-YARN" dfs: { connection: "hdfs://11.162.91.196:9000/" app-dir: "/users/drill" } yarn: { queue: "default" } drill-install: { client-path: "/home/admin/drill/apache-drill-1.14.0.tar.gz" # dir-name: "drill" # library-path: "/opt/libs" } am: { heap: "450M" memory-mb: 512 # node-label-expr: "drill-am" } http: { port: 8048 # ssl-enabled: true auth-type: "simple" user-ame: "drill" password: "drill" rest-key="" } drillbit: { heap: "3G" max-direct-memory: "1G" code-cache: "1G" memory-mb: 4096 vcores: 2 # disks: 3 classpath: "" } cluster: [ { name: "drill-group1" type: "basic" count: 3 } ] }
- 啟動
接下來,就會看到啟動日志$DRILL_HOME/bin/drill-on-yarn.sh --site $DRILL_SITE start
Connecting to DFS... Connected. Using existing Drill archive in DFS: /users/drill/apache-drill-1.14.0.tar.gz Uploading site directory /home/admin/drill/apache-drill-1.14.0/bin/../../site to /users/drill/site.tar.gz ... Uploaded. Loading YARN Config... Loaded. Application ID: application_1533475543014_0005 Launching Drill-on-YARN....................... Tracking URL: http://dtshow011162091196.zth:8088/proxy/application_1533475543014_0005/ Application Master URL: http://11.163.210.105:8048/
從上面的指令可以看到,會首先把apache-drill-1.14.0.tar.gz和site目錄打成的site.tar.gz上傳至HDFS,然後加載YARN的配置,最後啟動Drill
除了啟動指令外,drill-on-yarn.sh還提供了status、stop、resize、clean指令,比如status
啟動成功後,便可以通路 http://11.163.210.105:8048/ ,效果如下圖: 使用者名和密碼就是之前配置的drill、drill,除此之外,此頁面提供了如下功能:Application ID: application_1533475543014_0005 Application State: RUNNING Host: dtshow011163210105.zth/11.163.210.105 Queue: default User: admin Start Time: 2018-08-19 20:51:55 Application Name: Drill-on-YARN Tracking URL: http://dtshow011162091196.zth:8088/proxy/application_1533475543014_0005/ AM State: LIVE Target Drillbit Count: 3 Live Drillbit Count: 3 Unmanaged Drillbit Count: 0 Blacklisted Node Count: 0 Free Node Count: 0 For more information, visit: http://11.163.210.105:8048/
- 叢集狀态總覽
- 完整的啟動配置
- 正在運作的Drillbits清單
- 簡單的操作來調整叢集
- 一個展示停止的、被kill的、失敗的Drillbits曆史頁面,可以用它來診斷問題
4. 總結
相對于獨立叢集部署,Drill-on-YARN簡化了Drill的部署,此外也容易更新和對新功能測試。其次,YARN作為資源協調者,也相對簡化了Drill的資源管理,因為在啟動Drill時,YARN已經知道Drill可能會使用的資源,後續有其他任務送出到YARN叢集時,會對Drill的這部分資源比較敏感,防止過度配置設定給其他的任務。