運(yùn)維實(shí)戰(zhàn):Ambari開發(fā)手冊(cè)-DolphinScheduler集成實(shí)操
? ? 繼我們被apache linkis社區(qū)翻牌子以后,收錄了幾篇文章,今天被小海豚社區(qū)官方翻牌子了哈,當(dāng)然我們也有flink社區(qū)的大佬,貢獻(xiàn)flink社區(qū)文章若干,那就今天繼續(xù)更新一篇小海豚的文章哈,本文章來(lái)自滌生大數(shù)據(jù)老師,阿里巴巴技術(shù)大佬貢獻(xiàn)

Ambari集成大數(shù)據(jù)組件系列
1.背景
DolphinScheduler本來(lái)提供了Ambari的安裝程序,可以直接集成的。但是呢,Amabri停止維護(hù)了,DS對(duì)應(yīng)的安裝代碼也就沒(méi)再更新了。DS最新版本已經(jīng)到3.x了,但是安裝部署腳本依舊停留在DS 1.3.8,這太Low了,一點(diǎn)都不適用。對(duì)此,咱們就來(lái)改改,來(lái)實(shí)現(xiàn)DS 3.x 在Ambari下的集成實(shí)現(xiàn)。
2.RPM制作
安裝的方式有很多,但是個(gè)人還是比較喜歡AMbari的安裝風(fēng)格rpm,對(duì)此,依舊沿用此方法,先把我們的安裝包封裝成RPM。
2.1 軟件包準(zhǔn)備
官網(wǎng)下載對(duì)應(yīng)的軟件包信息,切記??!不要選最新版本的,選次新版本。別問(wèn),問(wèn)就是血的教訓(xùn)。
截止2023年4月,最新版本為3.1.5,咨詢了社區(qū)那些,相對(duì)比較穩(wěn)定的版本是3.1.2,對(duì)此,我們選擇3.1.2來(lái)進(jìn)行實(shí)際環(huán)境的安裝。此處,我們需要進(jìn)行rpmrebuild的環(huán)境的制作,可參考百度rpmbuild的使用。然后,將我們的DS軟件,解壓并拷貝到對(duì)應(yīng)的編譯目錄,待用。特殊說(shuō)明:1.安裝目錄軟件后續(xù)的安裝目錄,沿用HDP的路徑:/usr/hdp/3.3.1.0-001/dolphinscheduler;2.編譯目錄rpmbulid打包成rpm時(shí)候用到的目錄,主目錄在
/root/rpmbuild/BUILDROOT/;
3.軟件包目錄
apache-dolphinscheduler-3.1.2-1.x86_64;4.軟件包內(nèi)的安裝目錄/usr/hdp/3.3.1.0-001/dolphinscheduler;所以,整體的DS的解壓完整的路徑是:
2.2 SPEC文件編輯
SPEC文件,是RPM制作的說(shuō)明文件,我們可以完全自己寫,也可以抄一個(gè)現(xiàn)有的。對(duì)于看這個(gè)文檔的小伙伴,直接抄我的即可。完整的內(nèi)容如下:
里面的具體內(nèi)容與細(xì)節(jié),參考《RPM SEPC文件解讀》,此處不在復(fù)述,能用就行了,要啥自行車。說(shuō)明下,這個(gè)rpm的SPEC內(nèi)容,是用DS官網(wǎng)的1.3.8版本RPM包改的。
2.3 rpm制作
有了rpm包信息,有了SPEC說(shuō)明文件,剩下的就簡(jiǎn)單了,直接使用rpmbulid -bb 進(jìn)行編輯即可。
剩下的交給時(shí)間即可。

我們的rpm信息就制作完成了,在HDP的repo目錄,創(chuàng)建一個(gè)dolphinscheduler 的目錄,拷貝進(jìn)去
最后用yum驗(yàn)證下,是否能夠正確識(shí)別到。
2.4 長(zhǎng)久之計(jì)
問(wèn)題來(lái)了,如果下次DS升級(jí)版本,或者添加什么內(nèi)容的。那么就需要重新制作RPM,以上操作再來(lái)一次。很明顯,這種B格一看就不是大佬的作風(fēng)。要玩,就長(zhǎng)久點(diǎn),代碼能搞的,咱們就不動(dòng)手。(有同樣功能的,參考bigtop)我們的目的,是在DS有更新后,能夠自動(dòng)創(chuàng)建更新,創(chuàng)建rpm信息。自動(dòng)檢測(cè)一看就比較難,而且價(jià)值不大,咱們就不做了。我們把2.1 - 2.3 的步驟全部自動(dòng)化,還是有十分可觀的價(jià)值的。
首先,需要解決如下幾個(gè)問(wèn)題:
·?編譯目錄:/root/rpmbulid/BULIDROOT/.. ,這個(gè)目錄下的文件回自動(dòng)刪除,我們每次構(gòu)建都需要?jiǎng)?chuàng)建一次。
·?多版本支持,能不能每次自動(dòng)更新release信息,自動(dòng)保存歷史記錄。
帶著疑惑,咋們就開始出發(fā)。
·?首先第一點(diǎn),解決緩存文件被刪除,無(wú)長(zhǎng)久保存的問(wèn)題。關(guān)于這個(gè)問(wèn)題,從兩方面進(jìn)行考慮:1. 創(chuàng)建一個(gè)長(zhǎng)久地址,每次封裝的時(shí)候,拷貝次文件夾的內(nèi)容來(lái)生成臨時(shí)目錄;2. 修改spec內(nèi)容中的file部分,不寫詳細(xì)的文件列表,只寫目錄即可(2.2 已經(jīng)修改)。
·?再然后就是release的更新了。這個(gè)就簡(jiǎn)單了,分為現(xiàn)有版本的獲取與SPEC的更新。獲取可以通過(guò)掃描repo中的文件列表,提取固定字段來(lái)獲取。比如:apache-dolphinscheduler-3.1.2-3.x86_64.rpm中的3就是Relase的版本,查詢 + 排序即可搞定。Relase的替換,也簡(jiǎn)單,拿到這個(gè)數(shù)字后,加1后,使用sed命令來(lái)進(jìn)行替換即可。
最后,再來(lái)自己加點(diǎn)難度。比如,最好適用hdp的其他程序,和變量相關(guān)的,丟前面。盡量使用函數(shù)進(jìn)行封裝等。
接下來(lái),上完整代碼

代碼解讀:第一段:各種變量的定義,如果其他程序,改路徑和版本即可。比如ambari的打包,修改配置如下
第二段:獲取版本信息。獲取現(xiàn)在的最新版本信息;函數(shù):spec_config。此函數(shù),先拷貝一個(gè)模板spec文件,步驟2.2 做好的東西,然后使用sed進(jìn)行版本的替換
函數(shù):buildroot_initx0; 這個(gè)是為了方便創(chuàng)建永久保存的目錄:${src_path}。就第一次運(yùn)行的時(shí)候運(yùn)行;函數(shù):buildroot_createx0;,進(jìn)行rpm的封裝。從${src_path}路徑拷貝最新的文件到緩存目錄,然后運(yùn)行rpmbuild -bb 進(jìn)行實(shí)際rpm的制作;整體函數(shù)使用for循環(huán),進(jìn)行文件列表循環(huán),以適應(yīng)多個(gè)包的更新;最后的最后:更新rpm信息:createrepo ./演示示例:
有了此代碼后,更新就簡(jiǎn)單多了。比如我們想修改DS的存儲(chǔ)為Mysql,需要添加mysql-connection-java.jar 到DS 各個(gè)程序的lib中。首先第一步,下載jar包:mysql-connector-java-8.0.26.jar第二步:拷貝此jar包到alert-server/libs,api-server/libs,master-server/libs,worker-server/libs第三步:運(yùn)行程序。就會(huì)自動(dòng)封裝:apache-dolphinscheduler-3.1.2-4.x86_64.rpm
3.Dolphin集成
為了調(diào)試DS的安裝,本人按照官網(wǎng)的安裝教程,使用自帶的安裝程序install.sh N次后得出的結(jié)論。有興趣的小伙伴,可以自己折騰下。
3.1 DS服務(wù)架構(gòu)
盜的一個(gè)架構(gòu)圖,一看就比較復(fù)雜。

不過(guò)從圖中可以看出,有ZK,有API、UI、DB、Alert、Master、Worker。這些,其實(shí)就是我們安裝部署過(guò)程中需要運(yùn)行的程序。安裝DS前,需要有ZK集群以及一個(gè)Mysql。UI頁(yè)面是封裝到API中的,后面的Alert,Master,Worker每個(gè)作為單獨(dú)的程序來(lái)運(yùn)行。那么對(duì)于我們自動(dòng)化部署,就是要實(shí)現(xiàn)DS的四個(gè)程序的啟動(dòng)。
3.2 代碼結(jié)構(gòu)
有了架構(gòu)圖,大概對(duì)這個(gè)軟件有了大概的意思,但是這東西來(lái)得不實(shí)際,很飄。涉及到具體部署的時(shí)候,拿來(lái)沒(méi)啥用。最有用的,還是看安裝的壓縮包。第一層目錄,直接拆分了角色了,一下就清爽多了,一看就懂了,每個(gè)角色程序,一個(gè)文件夾。
隨便進(jìn)一個(gè)角色的目錄:api-server
和這個(gè)角色相關(guān)的東西,大體有以下目錄:
除了服務(wù)以外,還有一個(gè)特殊的目錄 bin/env ,這個(gè)下面有兩個(gè)文件,在安裝的時(shí)候需要進(jìn)行配置的修改,用于安裝,初始化的時(shí)候需要,也要做對(duì)應(yīng)的修改。
3.3 安裝實(shí)現(xiàn)
目錄結(jié)構(gòu)看完了,部署大體結(jié)構(gòu)也知道了,接下來(lái)就要開始進(jìn)行實(shí)際的自動(dòng)化實(shí)現(xiàn)了。
3.3.1 服務(wù)定義:metainfo.xml
這個(gè)是定義服務(wù)的程序,定義軟件版本,安裝的包信息,以及配置依賴信息。此處只貼了些案例,沒(méi)貼全。模塊一:服務(wù)定義
這個(gè)的效果圖,在服務(wù)添加頁(yè)面展示:

模塊二:程序定義。主要定義包含哪些程序,以及程序的維護(hù)程序,定義等等各種東西,一共有四個(gè):DOLPHIN_MASTER,DOLPHIN_WORKERx0;,DOLPHIN_APIx0;,DOLPHIN_ALERTx0;。單個(gè)參考如下,具體細(xì)節(jié)百度知。
模塊三:安裝rpm定義這邊定義需要安裝的rpm程序,以及系統(tǒng)。我們這里能支持的是Centos7.x/8.x, Redha7.x/8.x, Kylin V10,Anolis 8.x ,直接寫個(gè)any先用著吧。
剩下的,還有點(diǎn)內(nèi)容,后期加吧,這里貼一個(gè)完成的圖。
3.3.2 程序安裝:master_install.py
上面服務(wù)定義好了,接下來(lái)就進(jìn)行軟件的安裝流程。就是看服務(wù)定義中的“scripts/dolphin_master_service.pyx0;”程序內(nèi)容。這個(gè)里面呢,就是定義各個(gè)軟件的安裝與啟動(dòng)程序。以下,是經(jīng)過(guò)N多次改版過(guò)后的實(shí)際安裝代碼。
具體內(nèi)容,其中,服務(wù)安裝的程序在下面代碼的:install_packages中,會(huì)根據(jù)3.1.1中,os處定義的內(nèi)容,來(lái)進(jìn)行rpm包的安裝,此處實(shí)際執(zhí)行命令:yum install -y apache-dolphinscheduler*
其他安裝程序,類似,只是需要修改對(duì)應(yīng)的路徑和文件名信息

特殊說(shuō)明下,最開始的程序,需要做系統(tǒng)的初始化,沿用1.3.8版本的初始化邏輯,把數(shù)據(jù)庫(kù)的初始化放在api的啟動(dòng)程序中:dolphin_api_service.pyx0;
3.4 配置管理
你以為上面寫好就能用了?膚淺了,格局一定要打開。安裝才是第一步,怎么做配置的更新、管理才是一個(gè)好的部署平臺(tái)。最好自動(dòng)化安裝,點(diǎn)一下需要安裝的程序,剩下的全部根據(jù)集群,系統(tǒng)來(lái)默認(rèn)最優(yōu)配置設(shè)置,這才是一個(gè)大佬應(yīng)該寫出來(lái)的自動(dòng)化程序。其實(shí),3.3中的程序,已經(jīng)包含了配置的更新,其中,每個(gè)控制模塊前的import params 和set-params 即配置的讀取與更新程序。
以上代碼,對(duì)應(yīng)的程序

3.4.1 配置解讀
在我N多次的安裝、卸載,對(duì)比配置等各個(gè)操作手段后,得出了以下內(nèi)容。需要修改的配置內(nèi)容如下,以ds的安裝相對(duì)路徑進(jìn)行文件的書寫。
差不多,這些配置都得改吧。
3.4.2 confiuration配置管理
對(duì)于配置相關(guān)的管理,在Amabri中,是通過(guò)一個(gè)叫configuration相關(guān)的xml進(jìn)行設(shè)置的。這里以dolphin-env.xml比如配置./bin/env/dolphinscheduler_env.sh中的一個(gè)配置
其中在configuration中的相關(guān)定義如下:
特殊說(shuō)明,這種類型不太一樣,數(shù)據(jù)庫(kù)類型提供的是一個(gè)多選,提供mysql個(gè)PG的單選按鈕,數(shù)據(jù)庫(kù)是一個(gè)字符串,不用高級(jí)設(shè)置。成品大概如下:


特殊說(shuō)明下,我是代碼搞好后再寫的文檔,截圖和xml中的定義,不太一樣。
3.4.2 params配已置讀取
接下來(lái),數(shù)據(jù)的定義有了,那就需要進(jìn)行數(shù)據(jù)的讀取了,在web頁(yè)面,如果修改了配置,需要將這個(gè)配置寫入到具體的配置文件中。怎么來(lái)讀取這個(gè)配置呢?這個(gè)寫入在腳本parms.py中,先來(lái)一個(gè)案例:
案例解讀,這里就是定義各種變量信息的。比如讀取“dolphin-envx0;.xml”中關(guān)于mysql類型的定義為:
玩得再花一點(diǎn),就再寫點(diǎn)判斷,這樣就可以根據(jù)一個(gè)選擇來(lái)進(jìn)行不同數(shù)據(jù)的定義。除了這種定義的以外,還有和集群相關(guān)的配置,比如ZK相關(guān)的,可以根據(jù)ZK集群的信息,自動(dòng)讀取ZK配置,具體寫法如下:
剩下的,自己更具配置的內(nèi)容添加即可。
3.4.3 Templates模板生成
數(shù)據(jù)配置定義了,數(shù)據(jù)配置的方法讀取方法獲取了,接下來(lái),問(wèn)題來(lái)了:怎么把這些信息寫入到具體配置里面呢?這里,使用Templates模板來(lái)進(jìn)行配置文檔的編輯。此處核心就是配置使用 {{變量名}} 來(lái)進(jìn)行替換首先用application.yaml來(lái)打個(gè)樣。
其中:{{application_jdbc_type}} 等,都是parms.py中進(jìn)行的變量獲取。整體套路就是這樣,剩下的就是對(duì)比不同的配置,來(lái)制作多個(gè)模板。全部的信息如下:

這里只是完成了一半,另外的一半,需要定義這些模板文件,需要寫到哪些配置里面。這里的話,寫在了dolphin_env.py 中,這里面主要進(jìn)行文件夾的創(chuàng)建,以及配置的更新。
以上為案例,一看就懂,不做解釋。剩下的就是體力勞動(dòng)。到此,已經(jīng)可用了,寫到這里,自動(dòng)化部署就已經(jīng)完成了。但是,還是那句話,格局一定要打開,要最求卓越。

3.5 themes視覺(jué)優(yōu)化
以下兩個(gè)圖,那個(gè)好看?很明顯,不做選擇題,咋們?nèi)家?。只是,上圖已經(jīng)實(shí)現(xiàn)了,接下來(lái)進(jìn)行下圖的實(shí)現(xiàn)。


其中,下圖的內(nèi)容需要使用到的是Ambari提供的Themes 模板,類似于一個(gè)頁(yè)面編輯框的工具,可以將單單選,多選文本的換個(gè)花樣來(lái)展示。
3.5.1 themes解讀
首先來(lái)看看themes的寫法,大概長(zhǎng)這樣的,主題包含三個(gè)目錄。layouts,placement和widgets
layouts:是對(duì)整體頁(yè)面做拆分,做頁(yè)面排布。并對(duì)每個(gè)頁(yè)面命名和編號(hào)。頁(yè)面的布局內(nèi)容如下:

placement,是對(duì)定義在框框中,填入什么樣的內(nèi)容。比如JVM處,大題填以下內(nèi)容:

widgets,則是定義數(shù)據(jù)的規(guī)范,和顯示的格式,這個(gè)需要和對(duì)應(yīng)的xml中的配置遙相呼應(yīng)。比如:text-fieldx0; 文本框,就是單純的框框格式,比如環(huán)境配置信息的

togglex0; 二選一的拖拽框,比如,是否開啟kerbers配置的選項(xiàng)


combox0;,下拉框,用于多選一的選擇,比如數(shù)據(jù)庫(kù)類型,文件存儲(chǔ)類型等。

大體介紹完了, 接下來(lái)進(jìn)行實(shí)際的實(shí)現(xiàn)。
3.5.2 目錄配置
我們?cè)谧铋_始的地方<0,0>來(lái)進(jìn)行環(huán)境配置的設(shè)置。打算提供,用戶賬號(hào)、組,以及環(huán)境變量的定義。這里采用的是大框套小框來(lái)進(jìn)行實(shí)現(xiàn)的,整體頁(yè)面布局就,及其對(duì)應(yīng)的編碼就變成了這樣。

接下來(lái)就進(jìn)行具體的框框的定義。在configurationx0;.layoutsx0;.tabs.x0;sectionsx0;處進(jìn)行定義,從外部定義到內(nèi)部,逐級(jí)定義。
接下來(lái),定義這個(gè)框里面需要輸入的數(shù)據(jù):賬號(hào)、組,以及環(huán)境變量;在配置位置:configurationx0;.placementx0;x0;.configsx0;
最后,定義處這些內(nèi)容的數(shù)據(jù)展示格式。在配置configuration.widgetsx0; 處
這里都是text格式,對(duì)應(yīng)的一個(gè)xml案例,dolphin-env.xml 關(guān)于部署用戶dolphin.user的定義。
通過(guò)以上,操作,最后的效果圖如下。

3.5.2 JVM配置
同上,依舊來(lái)進(jìn)行JVM的設(shè)置,復(fù)制 3.5.1開頭的內(nèi)容,先來(lái)進(jìn)行JVM的位置信息設(shè)置。他的位置是<0,1>;
接下來(lái)進(jìn)行對(duì)應(yīng)數(shù)據(jù)的填充與設(shè)置,同上,這里只提供一些參數(shù)的設(shè)置,其他的,參考排布即可。
與上圖不同的是,這里采用拉條的方式來(lái)進(jìn)行數(shù)據(jù)的數(shù)據(jù)的設(shè)置,左右橫拉,實(shí)現(xiàn)JVM的設(shè)置。其中,在themes中的數(shù)據(jù)定義如下:
對(duì)應(yīng)的xml信息,在配置dolphin-jvm.xml中,每次可調(diào)節(jié)1G大小,允許設(shè)置的范圍為1-4G,可以根據(jù)具體的配置設(shè)置。
最后效果案例效果。

3.5.3 數(shù)據(jù)庫(kù)配置
數(shù)據(jù)庫(kù)的,同上。不整廢話,都一樣的東西。效果圖如下:

3.5.4 存儲(chǔ)類型選擇
數(shù)據(jù)存儲(chǔ)類型的時(shí)候,這個(gè)有點(diǎn)不同了,因?yàn)樘砑恿丝蛇x,并且可選進(jìn)行數(shù)據(jù)內(nèi)容的展示。先來(lái)看效果圖:




選擇HDFS為存儲(chǔ)后,對(duì)應(yīng)的配置如圖左上;選擇Null的效果如右上;Aws S3及其同類產(chǎn)品的如左下;阿里云OSS的如右下。這個(gè)是怎么實(shí)現(xiàn)的呢?關(guān)于圖表框的定義,同上。不在敘述。接下來(lái)就是關(guān)于具體內(nèi)容的選擇,這里設(shè)置不一樣了。首選,下拉框,選擇存儲(chǔ)格式,下面定義數(shù)據(jù)的輸入
對(duì)應(yīng)的數(shù)據(jù)格式為:
對(duì)應(yīng)的xml定義文件:common.properties.xml,這是一個(gè)多選
這樣,下拉框就完成了。接下來(lái),怎么根據(jù)下拉框的格式來(lái)進(jìn)行相應(yīng)配置的選擇呢?其實(shí),這個(gè)的重點(diǎn)就是判斷 + 可顯示字段的信息標(biāo)記。貼代碼就懂了。在數(shù)據(jù)展示處:
在每個(gè)選項(xiàng)中,添加一個(gè)判斷,只有當(dāng)type類型相關(guān)的時(shí)候,顯示標(biāo)記位再設(shè)置是否顯示。這樣就完事兒了。
3.5.5 Kerberos & Wechat
這兩個(gè)功能還沒(méi)設(shè)置好,先把功能頁(yè)面開啟來(lái)先。

數(shù)據(jù)框,及其框中數(shù)據(jù)編輯都同上,不在敘述。不同就是數(shù)據(jù)的定義:
對(duì)應(yīng)的XML數(shù)據(jù)定義,剩下的自己復(fù)制改。
通過(guò)以上一波操作,就全部完成了themes的定義,重點(diǎn)配置丟這里,看起來(lái)就舒服了。這樣,重點(diǎn)配置在Setting頁(yè)面,詳細(xì)配置在advance頁(yè)面。
3.6 超鏈接實(shí)現(xiàn)
DS給提供了Web頁(yè)面,最好的話,再搞個(gè)超鏈接,點(diǎn)擊即可訪問(wèn)。說(shuō)干就看,先看效果圖

這個(gè)功能一共需求兩個(gè)東東。
第一個(gè),服務(wù)定義metainfo.xml中,需要添加關(guān)于超鏈接的定義。
在新建文件夾quicklinks,并在下面新建文件quicklinks.json案例數(shù)據(jù)如下,具體內(nèi)容,自己百度。
這個(gè)改起來(lái)簡(jiǎn)單,效率給力。到此,文檔完畢,還有監(jiān)控和告警相關(guān)的,不想寫了,就是這么有脾氣。不是代碼不想寫,而且不想寫文檔。因?yàn)楦蒊T最討厭兩件事:自己寫代碼的時(shí)候,寫備注+文檔、看別人代碼的時(shí)候,沒(méi)備注和文檔;

歡迎在研究大數(shù)據(jù)集群二開的朋友們來(lái)戰(zhàn)(交流交流哈哈哈),也可以在b站上看我錄制的apache hadoop集群運(yùn)維實(shí)戰(zhàn)哈

本文使用 文章同步助手 同步