准備主機
准備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/ubuntu16
和http://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集群步驟如下:
- 給集群命名,名稱不能包含特殊字符
- 選擇要安裝的版本。由於我們選擇離線安裝,所以選擇
Use Local Repository
並把不需要的系統配置移除,並在需要的系統配置中填入包源地址。對於之前的配置,HDP與HDP Utils的地址分別為:
http://192.168.9.222/hdp/ubuntu16
http://192.168.9.222/hdputils/ubuntu16
- 第三步是安裝選項,目標主機的FQDN列表如下:
head1.parrot
head0.parrot
data0.parrot
然后在Ambari Server主機上執行cat ~/.ssh/id_rsa
將私鑰的文本粘貼到對應的文本框中,並在ssh用戶名中填入我們的遠程連接所用的用戶名
點擊Register and Confirm
,Ambari開始在所選的主機上安裝Ambari Agent。
- 進入這一步后,將自動開始在集群的機子上安裝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控制台,重試上面的安裝步驟,一切順利完成。
- 這一步選擇要在集群中安裝的組件
- 接着是選擇所選服務Master的安裝位置。按照之前的配置,原則上它們都應該安裝在
head0.parrot
結點。
從下拉列表選擇服務要部署的host位置,點擊服務后面的“加號”可以增加服務部署的機子。而“減號”用來減少部署的機子。
把SNameNode和NameNode放在不同的host上實現高可用,最終樓主的選擇如下:
YARN的ResouceManager的HA需要在安裝完成后配置,具體實現見HortonWorks官網文檔
- 然后選擇所選服務Slave及Client的安裝位置。按照之前的配置,Slave應該安裝在
data0.parrot
結點。
另外,我將Client安裝在head1.parrot
。
這一步host后面的星號表示這台host已經安裝了Master,將鼠標移到星號上可以看到該host已安裝的Master。
- 這一步將對每個服務的配置項進行設置,如數據存儲位置,密碼等。所有標簽被標記為紅色的都是必須輸入的項。
設置完成后點擊Next
,進行下一步之前會檢查所輸入的設置項並給出一些建議,修改后重試,或者直接點擊Proceed Anyway
忽略警告繼續安裝。
一般來說標記為紅色必填的都是需要輸入密碼的配置項。對於非生產的測試環境,可以把所有密碼統一設置方便使用。
-
這一步匯總一個檢查清單,列出了即將進行的部署的詳情。這是部署前最后修改設置的最后機會。
點擊Deploy
開始部署。下面就是耐心等待進度條完成。 -
Ambari Server開始在3台host上安裝服務並在安裝完成后嘗試啟動。(如果遇到啟動不成功,可以后面調整配置重試啟動,如果是安裝不成功就需要清理文件重試安裝了,后者比較麻煩)
提示
- 樓主按照上面的方法安裝完成后,Hive啟動不了(組件中的HiveServer2無法啟動)。日志顯示是MySQL無法連接。樓主選擇Hive使用集成的MySQL作為MetaStore,兩者安裝在同一台主機上,按理應該沒有問題。但Ambari Server和它們不在一台主機。樓主想了半天,只可能是這個原因,於是找到MySQL的配置文件
/etc/mysql/mysql.conf.d/mysqld.cnf
將其中bind-address=127.0.0.1
注釋掉,自此HiveServer2可以正常啟動。 - 啟動時,最好先啟動ZooKeeper。在ZooKeeper不啟動的情況下,ResourceManager等無法啟動。
- 默認配置下,主機重啟后,所有服務都是處於停止狀態(Ambari Server默認可以自行啟動)。在
Admin
選項卡Service Auto Start
菜單中可以配置哪些服務自動啟動。
運行.NET Core編寫的MR Job
首先准備好用.NET Core編寫的Map和Reduce程序,源碼見此,請自行下載編譯。
解決方案中的NetCoreMapper
和NetCoreReducer
分別對應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的主機。