本篇內(nèi)容介紹了“如何編寫YARN應(yīng)用程序”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
目前創(chuàng)新互聯(lián)已為超過千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機、網(wǎng)站托管維護、企業(yè)網(wǎng)站設(shè)計、桓仁網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
Drill是Apache旗下的一個開源SQL查詢引擎,可用于探索大數(shù)據(jù)。它的設(shè)計初衷是為了支持對大數(shù)據(jù)的高性能分析,同時支持行業(yè)標準查詢語言ANSI SQL。
在Drill 1.13之前,Drill只支持獨立集群部署,部署成功后每個節(jié)點上會運行一個名為Dirllbit的守護進程。從1.13版本開始,Drill支持與YARN集成來管理資源。使用YARN后,Drill將成為一個運行在YARN上的長進程。當您啟動Drill時,YARN會自動將Drill軟件部署到每個節(jié)點上,避免了在每個節(jié)點上安裝Drill的繁瑣。除此之外,資源管理也會得到簡化,因為YARN對于Drill使用的資源是敏感的。
目前所有YARN發(fā)行版都提供了內(nèi)存和CPU(YARN稱為“vcores”)的設(shè)置,某些發(fā)行版還提供磁盤的設(shè)置。對于內(nèi)存,在把Drill部署在YARN上的時候,你會配置Drill要使用的內(nèi)存,然告知YARN。此外,Drill將使用所有可用的磁盤和CPU,當然可以啟用Linux cgroup來限制Drill對CPU使用的,以到匹配YARN的vcores分配。
為了方便講解在YARN下部署Drill,先簡單介紹YARN的核心概念。
YARN全稱是Yet Another Resource Negotiator(另一種資源協(xié)調(diào)者),是一種新的Hadoop資源管理器,它是一個通用資源管理系統(tǒng),可為上層應(yīng)用提供統(tǒng)一的資源管理和調(diào)度。
ResurceManager(RM):一個全局的資源管理器,負責(zé)整個系統(tǒng)的資源管理和分配。它主要由兩個組件構(gòu)成:調(diào)度器(Scheduler)和應(yīng)用程序管理器(Applications Manager,ASM)。
ApplicationMaster(AM):用戶提交的每個應(yīng)用程序均包含一個AM,主要功能包括
與RM調(diào)度器協(xié)商以獲取資源(以Container表示)
與NM通信以啟動/停止任務(wù)
監(jiān)控所有任務(wù)運行狀態(tài),并在任務(wù)失敗時重新為任務(wù)申請資源以重啟任務(wù)
Container :Container是YARN中的資源抽象,它封裝了某個節(jié)點上的多維資源,如CPU、內(nèi)存、磁盤、絡(luò)等。當AM向RM申請資源時,RM向AM返回的資源便是用Container表示的。YARN會為每個任務(wù)分配一個Container,且該任務(wù)只能使用該Container中描述的資源。Container是一個動態(tài)資源劃分單位,是根據(jù)應(yīng)用程序的需求自動生成的。
NodeManager(NM) :NM是每個節(jié)點上的資源和任務(wù)管理器。一方面,它定時地向RM匯報本節(jié)點的資源使用情況和Container運行狀態(tài);另一方面,它接受并處理來自AM的Container啟動/停止等各種請求。
客戶端(Client):是集群中一個能向RM提交應(yīng)用的實例,并且指定了執(zhí)行應(yīng)用所需要的AM類型。
當用戶向YARN中提交一個任務(wù)后,YARN將分兩個階段運行該任務(wù):第一階段是啟動AM。第二階段是由AM創(chuàng)建任務(wù),為它申請資源,并監(jiān)控它的整個運行過程,直到運行完成。具體如下:
用戶向YARN中提交任務(wù),其中包括AM程序、啟動AM的命令等。
RM為該應(yīng)用程序分配第一個Container,通常稱為001,并與對應(yīng)的NM通信,要求它在這個Container中啟動應(yīng)用程序的AM。
AM首先RM注冊,這樣用戶就可以直接通過RM查看任務(wù)的運行狀態(tài),然后它將為各個任務(wù)申請資源,并監(jiān)控它的運行狀態(tài),直到運行結(jié)束,即重復(fù)步驟4~7。
AM采用輪詢的方式通過RPC協(xié)議向RM申請和領(lǐng)取資源。
一旦AM申請到資源后,便與對應(yīng)的NM通信,要求它啟動任務(wù)。
NM為任務(wù)設(shè)置好運行環(huán)境(包括環(huán)境變量、JAR包、二進制程序等)后,將任務(wù)啟動命令寫到一個腳本中,并通過運行該腳本啟動任務(wù)。
各個任務(wù)通過RPC協(xié)議向AM匯報自己的狀態(tài)和進度,以讓AM隨時掌握各個任務(wù)的運行狀態(tài),從而可以在任務(wù)失敗時重新啟動任務(wù)。
應(yīng)用程序運行完成后,AM向RM注銷并關(guān)閉自己。
編寫客戶端
// 初始化并啟動一個YarnClientConfiguration yarnConfig = new YarnConfiguration(getConf()); YarnClient client = YarnClient.createYarnClient(); client.init(yarnConfig); client.start(); ...// 創(chuàng)建一個應(yīng)用程序YarnClientApplication app = client.createApplication(); GetNewApplicationResponse appResponse = app.getNewApplicationResponse(); ...// 設(shè)置應(yīng)用程序提交上下文ApplicationSubmissionContext appContext = app.getApplicationSubmissionContext(); appContext.setApplicationId(appResponse.getApplicationId()); appContext.setApplicationName(config.getProperty("app.name")); appContext.setApplicationType(config.getProperty("app.type")); ...// 設(shè)置am container啟動上下文 ContainerLaunchContext amContainer = Records.newRecord(ContainerLaunchContext.class); amContainer.setLocalResources(amLocalResources); amContainer.setEnvironment(amEnvironment); amContainer.setCommands(Collections.singletonList(amCommand.toString())); ...// 提交應(yīng)用程序client.submitApplication(appContext);
編寫ApplicationMaster(AM)
// 初始化AMRMClientAsyncYarnConfiguration yarnConfig = new YarnConfiguration(); AMRMClientAsync amrmClientAsync = AMRMClientAsync.createAMRMClientAsync(5000, new AMRMCallbackHandler()); amrmClientAsync.init(yarnConfig); amrmClientAsync.start();// 初始化NMClientAsyncYarnConfiguration yarnConfig = new YarnConfiguration(); NMClientAsync nmClientAsync = NMClientAsync.createNMClientAsync(new NMCallbackHandler()); nmClientAsync.init(yarnConfig); nmClientAsync.start();// 注冊ApplicationMaster(AM)amrmClientAsync.registerApplicationMaster(thisHostName, 0, ""); ...// 添加ContainerRequestamrmClientAsync.addContainerRequest(containerRequest); ...// 啟動容器nmClientAsync.startContainerAsync(container, containerContext); ...// 注銷amrmClientAsync.unregisterApplicationMaster(appStatus, appMessage, null);
這里只是簡單介紹了YARN的概念,以及如何編寫YARN應(yīng)用程序,詳情可以參考 Apache Hadoop YARN
Drill發(fā)行包: Drill-on-YARN上傳此發(fā)行包至分布式文件系統(tǒng)(如HDFS)。YARN下載它到每個工作節(jié)點(即是Node Manager所在的節(jié)點)
Drill site目錄: 一個包含Drill配置問和自定義jar包的目錄。Drill-on-YARN會拷貝它至每個工作節(jié)點
配置:一個用于告知Drill-on-YARN如何管理Drill集群的配置文件。這個文件和drill本身的配置文件互相獨立
Drill-on-YARN client: Drill-on-YARN客戶端,提供了啟動、停止、監(jiān)控等命令
Drill Application Master (AM):用于和YARN交互,包括:請求資源、啟動Drillbits等。AM還提供了web界面用于管理Drill集群
Drillbit: 運行在每個節(jié)點的Drill守護進程
YARN通過客戶端來啟動應(yīng)用程序。對于Drill來說,就是Drill-on-YARN客戶端了??蛻舳丝梢栽谌魏螜C器上,只要該機器同時有Drill和Hadoop軟件。使用YARN部署Drill時,您只需要在客戶端計算機上安裝Drill,Drill-on-YARN會自動部署到其它節(jié)點。需要注意的是,當你不使用YARN部署Drill時,一般會將其配置文件和自定義代碼放在Drill的目錄中,但是在YARN下運行時,建議所有配置和自定義代碼都會放在一個名為site的目錄中,勿改變Drill目錄中的任何內(nèi)容。
接下來詳細說明部署步驟:
部署的環(huán)境
關(guān)于jdk、zookeeper、hadoop的部署,不做贅述了,記得設(shè)置JAVA_HOME、HADOOP_HOME
JDK8+
Zookeeper集群
Hadoop集群
創(chuàng)建一個目錄,用于放置下載好的Drill發(fā)行包
export DRILL_DIR=/path/to/drill mkdir -p $DRILL_DIRcd $DRILL_DIR
說明:執(zhí)行完上面的命令后,所處的目錄為/path/to/drill
下載Drill發(fā)行包,這里使用apache-drill-1.14.0.tar.gz,下載完后解壓,再次強調(diào),目前所處的目錄為/path/to/drill
export DRILL_NAME=apache-drill-1.14.0 tar -xzf $DRILL_NAME.tar.gzexport DRILL_HOME=$DRILL_DIR/$DRILL_NAME
說明:DRILL_NAME很重要,后面啟動的時候和名字有關(guān)系
創(chuàng)建site目錄,并把配置文件和自定義代碼放置在其中
export DRILL_SITE=$DRILL_DIR/site mkdir -p $DRILL_SITEcp $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包,放置在DRILLSITE/jars。比如自定義的udf,可以放在DRILLSITE/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使用的內(nèi)存,一般來說等于heap+max-direct-memory,但是建議大于這個值 vcores: 4 # cpu個數(shù) } # Drillbit集群組配置 cluster: [ { name: "mypool" type: "basic" # 可選的有basic和labeled,basic表示在YARN集群上任意可用的container上啟動drillbits;labeled在一組特定labeled的容器中啟動drillbits count: 1 # 啟動的YARN容器個數(shù) } ] # 配置drill發(fā)行包所在的位置 drill-install: { client-path: "/path/to/drill/apache-drill-1.14.0.tar.gz" # dir-name: "drill"} # 設(shè)置分布式文件系統(tǒng)位置 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"}
說明:
附上完整的配置
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 } ] }
關(guān)于Drillbit資源配置中的heap和max-direct-memory,在非YARN下部署,是修改DRILLHOME/conf/drillenv.sh文件,但是在YARN下部署,是修改DRILLHOME/conf/drillenv.sh文件,但是在YARN下部署,是修改DRILL_SITE/drill-on-yarn.conf。但是,如果你已經(jīng)在drillenv.sh配置了,則drillenv.sh優(yōu)先。
Drillbit集群組配置,雖然是個list,但目前只支持配置一個
dir-name特別說明,當你client-path解壓出來的文件,目錄是apache-drill-1.14.0時,不需要配置dir-name,反之如果不是,請把解壓出來的文件目錄名配上
Web界面安全配置的auth-type支持simple和drill兩種,使用simple,需要指定用戶名和密碼,使用drill說明用drill的認證系統(tǒng)
啟動
$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
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/
啟動成功后,便可以訪問 http://11.163.210.105:8048/ ,效果如下圖:
用戶名和密碼就是之前配置的drill、drill,除此之外,此頁面提供了如下功能:
至此,你已經(jīng)成功的把Drill部署在YARN上面了,同樣可以通過訪問Drill的Web UI來執(zhí)行查詢測試,效果如下圖:
集群狀態(tài)總覽
完整的啟動配置
正在運行的Drillbits列表
簡單的操作來調(diào)整集群
一個展示停止的、被kill的、失敗的Drillbits歷史頁面,可以用它來診斷問題
“如何編寫YARN應(yīng)用程序”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
網(wǎng)站名稱:如何編寫YARN應(yīng)用程序
分享路徑:http://muchs.cn/article4/ihsdie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、企業(yè)網(wǎng)站制作、動態(tài)網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、App設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)