C#碼農的大數據之路 - 使用Ambari自動化安裝HDP2.6(基於Ubuntu16.04)並運行.NET Core編寫的MR作業


准備主機

准備3台主機,名稱作用如下:

昵稱 Fully Qualified Domain Name IP 作用
Ubuntu-Parrot head1.parrot 192.168.9.126 Ambari控制中心,頭結點(輔助)
Ubuntu-Laiothrix head0.parrot 192.168.9.127 頭節點(主)
Ubuntu-Siskin data0.parrot 192.168.9.128 數據節點

使用hostname <fully.qualified.domain.name>修改主機名,等價於編輯/etc/hostname文件(前者臨時,后者永久)
並使用hostname -f獲取FQDN,那驗證上面的修改是否成功

對每一台主機還要進行如下設置:

  • 配置NTP,sudo apt-get install ntp並設置服務自動啟動sudo systemctl enable ntp
  • 關閉防火牆:sudo ufw disable
  • 為所有用戶指定umask:sudo echo umask 0022 >> /etc/profile (這樣所有新創建的文件都具有755權限)
  • 安裝Python2.7, sudo apt-get install python,雖然Ubuntu16.04默認集成了Python3.5但那不適用於Ambari

樓主使用hystar作為集群中所有主機的用戶名,復制文中命令時,請將用戶名改為您電腦的用戶名

配置網絡

配置HDP集群原則上要求所有主機可以FQDN(Fully Qualified Domain Name)相互找到對方,包括從IP查找FQDN以及由FQDN查找IP,對於商用的集群這個需要配置集群內DNS來完成。對於測試目的的集群,可以將如下內容添加到每台主機的/etc/hosts來模擬實現:

192.168.9.126 head1.parrot
192.168.9.127 head0.parrot
192.168.9.128 data0.parrot

上面的內容是按照文初的主機列表編輯的。如果園友的環境不一樣,可以按需編輯。格式如:1.2.3.4 <fully.qualified.domain.name>
配置完后,可以相互ping一下FQDN看看是否可以正常解析。

注意,要保留127.0.0.1 localhost這個配置

配置無密碼訪問

這一步要設置安裝Ambari的機子與集群其它機器之間的無密碼SSH訪問
原則上HDP集群要求SSH訪問使用root賬戶,但是Ubuntu系統默認不啟用root賬戶。我們可以將我們的普通賬戶設為無需密碼使用sudo來代替使用root賬戶。
配置如密碼訪問的方式到處可見,這里簡單的列出幾條命令:
在Ambari主機上依次執行如下命令:

ssh-keygen
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
ssh hystar@head0.parrot 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
ssh hystar@data0.parrot 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
ssh hystar@head0.parrot 'chmod 600 .ssh/authorized_keys'
ssh hystar@data0.parrot 'chmod 600 .ssh/authorized_keys'

執行這些命令時,連接遠程主機是需要輸入密碼的,執行之后可以再嘗試連接遠程主機ssh hystar@head0如果不需要輸入密碼說明配置成功。

由於我們后續需要在Ambari Server主機上安裝Ambari Agent,所以我們對Ambari Server所在的主機本身對自己也配置了無密碼SSH訪問。

離線安裝准備

為了可以離線安裝,我們下載Ambari和HDP(以及HDP-Utils)的"tarball"包,下載地址參見此文檔,下載后我們得到如下三個文件:

  • ambari-2.5.0.3-ubuntu16.tar.gz
  • HDP-2.6.0.3-ubuntu16-deb.tar.gz
  • HDP-UTILS-1.1.0.21-ubuntu16.tar.gz

下載完成后建議驗證下MD5確保文件未損壞

然后我們需要配置一台Web服務器作為apt-get的源,用來提供安裝所需要的deb包。
由於樓主是在本地虛機安裝HDP,本打算使用IIS作為Web服務,但IIS對於提供普通的文件有個麻煩的地方,就是如果擴展名沒有注冊,會由於MINE類型未知而報403錯誤。
接着為了方便,用IIS集成的FTP,雖然倒是成功了,但是速度極慢,StackOverflow上網友說的原因是每次FTP訪問身份驗證消耗了太多的時間。
然后想到了WSL,這個應該是最方便的途徑。使用sudo apt-get install nginx給BashForWindows安裝Nginx。注意需要停掉Windows中的W3SVC服務WSL中的Nginx才能啟動成功。而且這個WSL中的Nginx需要每次進入bash后使用service nginx start啟動。
然后把ambari-2.5.0.3-ubuntu16.tar.gz解壓到本地磁盤,然后使用ln -s創建一個軟連接掛到Nginx默認發布目錄:

sudo ln -s /mnt/d/HDP/ambari-2.5.0.3-ubuntu16/ambari /usr/share/nginx/html/ambari

這樣http://localhost/ambari可以發布包文件。

在Windows防火牆中手動添加80端口的入站規則。只是啟用自帶的萬維網服務這個預定義的規則是不夠的。

接着,在之前下載tarball的頁面下載兩個用於apt的list文件:

  • ambari.list
  • hdp.list

修改其中的地址為我們自己搭建的服務器的地址,注意把目錄層級弄對就可以了。
將ambari.list中原來的地址改為(IP地址為Windows系統的IP):
http://192.168.9.222/ambari/ubuntu16/
將修改后的ambari.list文件添加待安裝Ambari Server的主機的/etc/apt/sources.list.d下。

如果是在線安裝,無需修改ambari.list內容,直接將其添加到/etc/apt/sources.list.d下即可。

按照類似的方法,使用如下兩條命令配置HDP和HDP Utils包的發布

sudo ln -s /mnt/d/HDP/HDP-2.6.0.3-ubuntu16-deb/HDP /usr/share/nginx/html/hdp
sudo ln -s /mnt/d/HDP/HDP-UTILS-1.1.0.21-ubuntu16/HDP-UTILS-1.1.0.21/repos /usr/share/nginx/html/hdputils

這樣HDP和HDP Utils包源分別位於http://192.168.9.222/hdp/ubuntu16http://192.168.9.222/hdputils/ubuntu16

安裝Ambari

保證准備工作進行正確。首先執行下面命令導入key:

sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B9733A7A07513CAD

然后執行更新:

sudo apt-get update

后續我們需要在所有主機上由此Ambari源安裝Ambari Agent,所以我們需要在所有主機上執行這兩條命令,以便Ambari Agent可以順利安裝。
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B9733A7A07513CAD
sudo apt-get update

使用下面的命令檢查update是否成功,即包信息是否已經被緩存。

apt-cache showpkg ambari-server
apt-cache showpkg ambari-agent
apt-cache showpkg ambari-metrics-assembly

如果一切正常,就可以開始安裝Ambari了。

sudo apt-get install ambari-server

Ambari所依賴的PostgreSQL將一並被安裝。

配置Ambari

執行sudo ambari-server setup配置Ambari。
遇到Customize user account for ambari-server daemon選擇n,使Ambari在root下執行,當然也可以選擇其它用戶。
然后輸入數字,選擇要安裝的JDK版本並等待下載安裝完成。
Enter advanced database configuration選擇n來使用內置數據庫。
如無意外,安裝會成功完成。

啟動Ambari

使用如下命令,控制Ambari的啟停

sudo ambari-server start
sudo ambari-server status
sudo ambari-server stop

創建集群

Ambari啟動后可以訪問http://head1.parrot:8080登錄到Ambari,默認用戶名和密碼為admin/admin。

登錄Ambari后點擊Launch Install Wizard按鈕,進入Ambari集群安裝向導。
安裝Ambari集群步驟如下:

  1. 給集群命名,名稱不能包含特殊字符
  2. 選擇要安裝的版本。由於我們選擇離線安裝,所以選擇Use Local Repository並把不需要的系統配置移除,並在需要的系統配置中填入包源地址。對於之前的配置,HDP與HDP Utils的地址分別為:
http://192.168.9.222/hdp/ubuntu16
http://192.168.9.222/hdputils/ubuntu16
  1. 第三步是安裝選項,目標主機的FQDN列表如下:
head1.parrot
head0.parrot
data0.parrot

然后在Ambari Server主機上執行cat ~/.ssh/id_rsa將私鑰的文本粘貼到對應的文本框中,並在ssh用戶名中填入我們的遠程連接所用的用戶名
點擊Register and Confirm,Ambari開始在所選的主機上安裝Ambari Agent。

  1. 進入這一步后,將自動開始在集群的機子上安裝Ambari Agent。等Progess停止走動時,Status一列將顯示執行結果。Success表示成功完成。如果不幸遇到失敗可以點擊連接查看日志找到失敗原因。
    在一切成功的情況下也有可能會出現一些警告,點擊鏈接Click here to see the warnings,里面會告訴你怎么修復警告,如圖。

按照說明解決警告后,可以點擊Return Checks重新檢查。待檢查無誤后進入下一步

博主並不是在Ambari Server或集群中任何一台機子上登錄的Ambari控制台,它們都是無界面的Linux。樓主使用Windows上的Firefox登錄Ambari控制台。
第一次嘗試時,樓主使用http://192.168.9.126:8080訪問,到這一步時始終無法正常安裝Ambari Agent。報錯類似Registration failed. Unable to register with the server原因就是主機連不上Ambari Server。對於這個問題十分不解,之前所有主機的/etc/hosts都配置了啊。后來一番查找無果后,考慮是不是和訪問Ambari控制台的機子的有關,遂把上面的hosts記錄也加到Windows一份。同時為了保險,把Windows的hosts記錄也加到HDP集群中每台主機的/etc/hosts(這個可能沒有必要)。然后使用http://head1.parrot:8080訪問Ambari控制台,重試上面的安裝步驟,一切順利完成。

  1. 這一步選擇要在集群中安裝的組件
  2. 接着是選擇所選服務Master的安裝位置。按照之前的配置,原則上它們都應該安裝在head0.parrot結點。
    從下拉列表選擇服務要部署的host位置,點擊服務后面的“加號”可以增加服務部署的機子。而“減號”用來減少部署的機子。
    把SNameNode和NameNode放在不同的host上實現高可用,最終樓主的選擇如下:

YARN的ResouceManager的HA需要在安裝完成后配置,具體實現見HortonWorks官網文檔

  1. 然后選擇所選服務Slave及Client的安裝位置。按照之前的配置,Slave應該安裝在data0.parrot結點。
    另外,我將Client安裝在head1.parrot

這一步host后面的星號表示這台host已經安裝了Master,將鼠標移到星號上可以看到該host已安裝的Master。

  1. 這一步將對每個服務的配置項進行設置,如數據存儲位置,密碼等。所有標簽被標記為紅色的都是必須輸入的項。
    設置完成后點擊Next,進行下一步之前會檢查所輸入的設置項並給出一些建議,修改后重試,或者直接點擊Proceed Anyway忽略警告繼續安裝。

一般來說標記為紅色必填的都是需要輸入密碼的配置項。對於非生產的測試環境,可以把所有密碼統一設置方便使用。

  1. 這一步匯總一個檢查清單,列出了即將進行的部署的詳情。這是部署前最后修改設置的最后機會。
    點擊Deploy開始部署。下面就是耐心等待進度條完成。

  2. Ambari Server開始在3台host上安裝服務並在安裝完成后嘗試啟動。(如果遇到啟動不成功,可以后面調整配置重試啟動,如果是安裝不成功就需要清理文件重試安裝了,后者比較麻煩)

提示

  1. 樓主按照上面的方法安裝完成后,Hive啟動不了(組件中的HiveServer2無法啟動)。日志顯示是MySQL無法連接。樓主選擇Hive使用集成的MySQL作為MetaStore,兩者安裝在同一台主機上,按理應該沒有問題。但Ambari Server和它們不在一台主機。樓主想了半天,只可能是這個原因,於是找到MySQL的配置文件/etc/mysql/mysql.conf.d/mysqld.cnf將其中bind-address=127.0.0.1注釋掉,自此HiveServer2可以正常啟動。
  2. 啟動時,最好先啟動ZooKeeper。在ZooKeeper不啟動的情況下,ResourceManager等無法啟動。
  3. 默認配置下,主機重啟后,所有服務都是處於停止狀態(Ambari Server默認可以自行啟動)。在Admin選項卡Service Auto Start菜單中可以配置哪些服務自動啟動。

運行.NET Core編寫的MR Job

首先准備好用.NET Core編寫的Map和Reduce程序,源碼見此,請自行下載編譯。
解決方案中的NetCoreMapperNetCoreReducer分別對應Map和Reduce程序,使用publish.bat生成項目得到輸出,最終兩個項目的輸出文件有如下這些:

然后准備輸入文件davinci.txt(這個測試數據是HDInsight官方例子中的測試數據,就是一篇英文文章,可以自己隨意制作一個)與之前生成的.NETCore程序,均拷貝到head0.parrot主機中

為了方便WSL訪問集群中的主機,首先配置WSL的hosts,目前Windows10中的WSL基於Ubuntu所以hosts也位於/etc/hosts。編輯這個文件加入以下內容:

192.168.9.126 head1.parrot
192.168.9.127 head0.parrot
192.168.9.128 data0.parrot

接着配置下WSL到head0結點和data0結點的無密碼訪問

ssh-keygen
ssh user@head0.parrot 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
ssh user@head0.parrot 'chmod 600 .ssh/authorized_keys'
ssh user@data0.parrot 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
ssh user@data0.parrot 'chmod 600 .ssh/authorized_keys'

接着將輸入數據和所有的.NET Core程序文件拷貝到集群中(head0結點的主機上)

scp davinci.txt hystar@head0.parrot:/home/hystar
ssh hystar@head0.parrot 'mkdir coreapp'
scp publish/* hystar@head0.parrot:/home/hystar/coreapp

然后將輸入數據拷貝到HDFS中(程序文件不需要):

useradd -g hdfs hystar
hadoop fs -mkdir -p /user/hystar
hadoop fs -put /home/hystar/davinci.txt /example/data/gutenberg/davinci.txt

然后就是准備Hadoop Streaming執行的腳本
首先找到Hadoop Streaming的jar包所在的位置。SSH到Hadoop的頭結點所在主機head0.parrot,並執行下面命令

find / -name "hadoop-streaming*" 2>/dev/null 

按照之前所給出的HDP安裝的文章,樓主的Hadoop安裝於/usr/hdp/2.6.0.3-8/hadoop-mapreduce/hadoop-streaming-2.7.3.2.6.0.3-8.jar
接着是腳本內容:

hadoop jar  /usr/hdp/2.6.0.3-8/hadoop-mapreduce/hadoop-streaming-2.7.3.2.6.0.3-8.jar \ 
-files "/home/hystar/coreapp" \
-mapper "dotnet coreapp/NetCoreMapper.dll" \
-reducer  "dotnet coreapp/NetCoreReducer.dll" \
-input /example/data/gutenberg/davinci.txt \
-output /example/data/StreamingOutput/wc.txt

注意files選項直接給出.NETCore App所在的文件夾(主機目錄,而非HDFS目錄),而不用逐個指定文件。

mapper及reducer選項中的coreapp/這個路徑也不能省。

最后提交任務前,還需要在干活的結點(data0.parrot)安裝.NET Core。同樣在WSL中ssh到data0.parrot安裝即可。
安裝前注意刪除舊版,詳細文檔見此

一切准備妥當,執行腳本就可以提交並運行基於Hadoop Streaming的任務。一些順利的話,可以在/example/data/StreamingOutput/wc.txt/part-0001中看到結果。

附錄

Ambari相關
http://192.168.9.126:8080/api/v1/hosts 查看Ambari Server管理的主機,即安裝了Ambari Agent的主機。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM