1. 程式人生 > >008-Ambari二次開發之新增自定義元件Redis(一)

008-Ambari二次開發之新增自定義元件Redis(一)

   Ambari目前支援的元件有HDFS、YARN、HBase、Hive、Pig、ZooKeeper、Sqoop、Storm、Flume、Tez、Oozie、Falcon、Storm、Altas、Knox、Spark、Ranger、Mahout、Kerberos等,已經涵蓋了從大資料應用的主要方面。但是隨著實際業務的需要,我們可能需要增加新的元件或服務以滿足實際業務的需求。如我們的web系統需要redis存放token或者熱點資料,TensorFlow On Spark做一些模型演算法等等。基於此我們需要整合一些Ambari本身沒有的元件。本篇我們將介紹如何在Ambari中整合自定義元件。

自定義元件新增分兩大部分,一部分是在Ambari中新增元件的配置資訊,啟動指令碼等,另一部分是需要將元件的可執行檔案打包成RPM
掃描二維碼,關注BearData,獲取最新文章
這裡寫圖片描述

Ambari元件檔案配置
我們以Spark2為例來看看Ambari是如何編排目錄檔案的
這裡寫圖片描述
configuration目錄下存放的是spark2的屬性配置檔案,對應Ambari頁面的屬性配置頁面,可以設定預設值,型別,描述等資訊
package/scripts目錄下存放服務操作相關的指令碼,如服務的啟動,服務停止,服務檢查等
package/templates該目錄可選,存放的是元件屬性的配置資訊,和configuration目錄下的配置對應,這個關係是若果我們在Ambari頁面修改了屬性資訊,則修改資訊會自動填充該目錄下檔案的屬性,所以,這個目錄下的屬性是最新的,並且是服務要呼叫的
package/alerts目錄存放告警配置,如程式斷掉或者其他原因未執行時會出現告警或者可以定義其他告警
quicklinks該目錄下存放的是快速連結配置,Ambari頁面通過該配置可以跳轉到我們想要跳轉的頁面,如HDFS,快速連結頁面指向的地址是

http://node:50070
metrics.json用來配置指標顯示
kerberos.json用來配置kerberos認證
metainfo.json這個檔案很重要,主要是配置服務名,服務型別,服務操作指令碼,metrics以及快速連結等

RPM包製作
Ambari中,元件都是以RPM包的方式安裝的,因此我們自定義的元件也需要打包RPM,下面我們介紹一下如何製作RPM包
1. 安裝rpm-build
yum install rpm-build
2. 編寫SPEC檔案
SPEC檔案關鍵字
SPEC檔案是RPM檔案的組織說明,主要配置項如下所述
Name:軟體包的名稱,後面可以使用%{name}的方式引用
Summary:軟體包的內容概要
Version:軟體的實際版本號,如,1.1.0,後面可使用%{version}來引用
Release:釋出序列號,如,BDP等,標明第幾次打包,後面可以使用%{Release}引用
Group: 軟體分組,建議使用標準分組
License: 軟體授權方式,通常就是GPL
Source: 原始碼包,可以帶多個用Source1、Source2等源,後面也可以用%{source1}、%{source2}引用
BuildRoot: 這個是安裝或編譯時使用的“虛擬目錄”,考慮到多使用者的環境,一般定義為:%{tmppath}/{name}-%{version}-%{release}-root或%{tmppath}/%{name}-%{version}-%{release}-buildroot-%%__id_u} -n}.該引數非常重要,因為在生成rpm的過程中,執行make install時就會把軟體安裝到上述的路徑中,在打包的時候,同樣依賴“虛擬目錄”為“根目錄”進行操作。後面可使用$RPM_BUILD_ROOT 方式引用。
URL: 軟體的主頁
Vendor: 發行商或打包組織的資訊,例如RedFlag Co,Ltd
Disstribution: 發行版標識
Patch: 補丁原始碼,可使用Patch1、Patch2等標識多個補丁,使用%patch0或%{patch0}引用
Prefix: %{_prefix} 這個主要是為了解決今後安裝rpm包時,並不一定把軟體安裝到rpm中打包的目錄的情況。這樣,必須在這裡定義該標識,並在編寫%install指令碼的時候引用,才能實現rpm安裝時重新指定位置的功能
Prefix: %{sysconfdir} 這個原因和上面的一樣,但由於%{prefix}指/usr,而對於其他的檔案,例如/etc下的配置檔案,則需要用%{_sysconfdir}標識
Build Arch: 指編譯的目標處理器架構,noarch標識不指定,但通常都是以/usr/lib/rpm/marcros中的內容為預設值
Requires: 該rpm包所依賴的軟體包名稱,可以用>=或<=表示大於或小於某一特定版本,例如:libpng-devel >= 1.0.20 zlib ※“>=”號兩邊需用空格隔開,而不同軟體名稱也用空格分開,還有例如PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是針對不同階段的依賴指定
Provides: 指明本軟體一些特定的功能,以便其他rpm識別
Packager: 打包者的資訊
description 軟體的詳細說明

SPEC指令碼主體
%setup -n %{name}-%{version}** 把原始碼包解壓並放好通常是從/usr/src/asianux/SOURCES裡的包解壓到/usr/src/asianux/BUILD/%{name}-%{version}中。一般用%setup -c就可以了,但有兩種情況:一就是同時編譯多個原始碼包,二就是原始碼的tar包的名稱與解壓出來的目錄不一致,此時,就需要使用-n引數指定一下了。
%patch 打補丁通常補丁都會一起在原始碼tar.gz包中,或放到SOURCES目錄下。一般引數為:
%patch -p1 使用前面定義的Patch補丁進行,-p1是忽略patch的第一層目
%Patch2 -p1 -b xxx.patch 打上指定的補丁,-b是指生成備份檔案
%setup -n %{name}-%{version}** 把原始碼包解壓並放好通常是從/usr/src/asianux/SOURCES裡的包解壓到/usr/src/asianux/BUILD/%{name}-%{version}中。一般用%setup -c就可以了,但有兩種情況:一就是同時編譯多個原始碼包,二就是原始碼的tar包的名稱與解壓出來的目錄不一致,此時,就需要使用-n引數指定一下了。
%patch 打補丁通常補丁都會一起在原始碼tar.gz包中,或放到SOURCES目錄下。一般引數為:
%patch -p1 使用前面定義的Patch補丁進行,-p1是忽略patch的第一層目
%Patch2 -p1 -b xxx.patch 打上指定的補丁,-b是指生成備份檔案

Redis元件新增
1.在ambari-server/resource/statck/HDP/2.6目錄下建立REDIS目錄,注意大寫
2.在REDIS目錄下建立 metainfo.xml檔案,檔案內容及說明如下
2.0 REDIS(服務名稱,必須大寫) Redis(顯示名稱) Redis(描述) 4.0.10(版本) REDIS_SERVER(服務名稱) Redis-Server(顯示名稱) MASTER(角色) 1+(節點數) true REDIS 300 redis.conf(配置檔案) true

3.在REDIS目錄下建立 package/scripts,package/templates目錄
4.將redis檔案包中的redis.conf拷貝到templates目錄下並命名為redis.conf.j2
5.在redis.conf.j2中配置要修改的屬性,如,bind:{{bind}}
6.在scripts目錄下建立params.py,params_linux.py,redis.py,redis_server.py,redis_service.py,service_check.py,status_params.py以及upgrade.py
params.py:判斷作業系統,引用不同的變數定義檔案,如Linux系統引用params_linux.py檔案
params_linus.py:定義變數,引用系統變數,定義在5中配置的屬性變數,如:port = config[‘configurations’][‘redis.conf’][‘port’]
redis.py:建立目錄及資料夾
redis_server.py:定義服務啟動,停止,重啟操作
這裡寫圖片描述
redis_service.py:redis_server.py中服務啟動,停止重啟操作的具體實現,如下圖所示標識啟動redis服務
這裡寫圖片描述
其中,redis_script = format(“{redis_bin}/redis-server”),redis_cmd = format(“{redis_script} {config_dir}/redis.conf”)
service_check.py:服務狀態檢查
這裡寫圖片描述
status_params.py:服務版本狀態
upgrade.py:服務升級
7.在REDIS目錄下建立configuration目錄,在configuration目錄下建立redis.conf.xml,其內容為我們在5中定義的屬性
這裡寫圖片描述
8.在REDIS目錄下建立alert.json檔案,存放告警配置,當redis宕掉後會觸發
這裡寫圖片描述
通過以上步驟,Redis在Ambari中的配置就已完成,重新編譯Ambari原始碼

Redis RPM包製作
1.到官網下載redis原始碼包,最新版本為4.0.10,解壓並且編譯
make PREFIX=/opt/redis install
2.在/opt/redis/bin目錄可以看到編譯後的檔案
這裡寫圖片描述
3.建立 redis_2_6_2_0_205-4.0.10.2.6.2.0/usr/hdp/2.6.2.0-205/redis/目錄
mkdir -p /opt/redis_2_6_2_0_205-4.0.10.2.6.2.0/usr/hdp/2.6.2.0-205/redis/
4.在3中的目錄下建立bin,etc/redis及conf軟鏈,r軟鏈指向/etc/redis/conf
mkdir bin,mkdir etc/redis
建立軟鏈是需要注意,由於系統中/etc/redis/conf目錄是不存在的,所以先要建立,然後執行 ln /etc/redis/conf conf
建立完成後,可以將/etc/redis/conf刪除
這裡寫圖片描述
5.將2中bin目錄下的檔案拷貝到 /opt/redis_2_6_2_0_205-4.0.10.2.6.2.0/usr/hdp/2.6.2.0-205/redis/bin目錄下,將redis.conf拷貝到/opt/redis_2_6_2_0_205-4.0.10.2.6.2.0/usr/hdp/2.6.2.0-205/redis/etc/redis 目錄下
這裡寫圖片描述
6.將redis_2_6_2_0_205-4.0.10.2.6.2.0壓縮成tar.gz
tar zcvf ./redis_2_6_2_0_205-4.0.10.2.6.2.0.tar.gz ./redis_2_6_2_0_205-4.0.10.2.6.2.0
7.建立redis spec檔案–redis_2_6_2_0_205-4.0.10.2.6.2.0-205.noarch.rpm.spec
這裡寫圖片描述
8.建立打包所需要的路徑
mkdir -p ~/rpmbuild/{RPMS,SRPMS,BUILD,SOURCES,SPECS,tmp}
9.將spec檔案拷貝到建立的SPECS目錄下
10.將tar.gz包放到SOURCES目錄下
11.執行打包
rpmbuild -bb –target noarch SPECS/redis_2_6_2_0_205-4.0.10.2.6.2.0-205.noarch.rpm.spec
這裡寫圖片描述
12.安裝並驗證
這裡寫圖片描述
驗證安裝完後,記得要解除安裝,rpm -e redis_2_6_2_0_205,不然後續安裝會出現問題

以上就是Ambari中新增自定義元件的部分內容,下一篇將介紹自定義元件如何整合到Ambari框架及元件metrics開發