怎麼安裝hadoop(hadoop的安裝與配置詳細過程)
文章來源:加米穀大資料
架構圖
hadoop各個元件的關係是這樣的
namenode 總數就2個,不能多也不能少,一個是active狀態,一個是standby狀態,只有active狀態的在工作,另一個只是備份,當active狀態的掛了之後,standby的會切換為active狀態。但是這個動作其實不是天生自動的,配合上zookeeper才能實現自動化切換。
journalNode 用於儲存active狀態的namenode所做的所有改變,並同步到standby的namenode,以保證在standby轉換為active之後不會漏掉操作
namenode管理著datanode,namenode負責儲存地址空間,datanode負責真正的儲存資料
本次部署之後的架構圖是這樣的
- 為了降低部署的難度,我就虛擬了兩臺機子,其實真正部署的時候至少要有3臺(保持奇數個)
- zookeeper是負責在active的namenode掛掉之後自動把standby狀態的namenode切換成active的
這幅圖則解釋了zookeeper在整個hadoop叢集中的作用
zookeeper是遊離於hadoop叢集之外的元件
hadoop利用 zkfc (zookeeperFC) 來跟 zookeeper進行協作,其實目的很簡單,就是在一個namenode掛掉的時候,自動切換成另一個namenode為active狀態
準備工作
用vmware開出兩臺虛擬機器,安裝上Centos6。 我弄了兩個host,分別是 host1(192.168.199.126) 和host2(192.168.199.128)
開始前請按照上篇文章, hadoop 安裝教程 (CentOS6 CDH分支 yum方式) 裡面的方式新增yum源
安裝
安裝Zookeeper
注意:我這人比較懶,所以基本都是用root在安裝,所以以下命令,如果你們無法執行,請再前面加一個 sudo 。或者想我一樣直接用root玩
在兩臺機都執行
都安裝 zookeeper-server
在host1上啟動zookeeper
檢查下是否在2181埠監聽
用client端測試一下
配置zookeeper
改完記得重啟zookeeper
注意:其實zookeeper的伺服器最小的安裝數量是3臺機器,但是現在只有2臺,只能湊合了。因為zookeeper是根據超過半數出問題來關停系統的,所以2臺就無法正確的判斷了,不過我們只是做例子所以沒關係。
hadoop在啟動的時候會自動去找zookeeper的2181埠,如果沒有就啟動不起來
安裝Resource Manager
你需要在兩臺機子中挑選一臺作為resource manager,在這裡我挑選 host1(192.168.199.126) 安裝
在 host1 上執行
安裝Name Node
在兩臺機子上都安裝name node
安裝Date Node 等
官方文件說在除了Resource Manager 以外的所有機器上安裝以下幾個包,不過你要是非在有Resource Manager的機器上裝這些也不會出錯,只是生產環境肯定不能這麼幹了。既然我們只有兩臺機子而且都裝datanode,那肯定是隻能兩臺機都要安裝了
官方文件說在其中一臺機子上安裝以下軟體,隨便挑一臺,就挑host2把
在隨便一臺機器上安裝client,選host1安裝吧
配置
配置網路
hadoop官方強烈建議,大家不要用ip,而是用host的名字來進行配置,所以我們要先配置host檔案
在host1上執行該命令設定機器名字
在host2 上
這樣定義的名字只保持在下次重啟之前
配置HDFS
1.
2.
3.
官方文件說在每一個datanode節點上的hdfs-site.xml裡面都配置相同的資料夾來儲存資料,比如我就建三個資料夾來儲存datanode資料
所以最後hdfs-site.xml 是這樣的
全都建立出來,並統一把使用者改成 hdfs.hdfs
在host2 上
core-site.xml
hdfs-site.xml
把需要的資料夾也都建立出來,並分配許可權
格式化namenode
在兩臺機子上都使用hdfs來格式化namenode
啟動HDFS
在兩臺機器上都執行
建立/tmp資料夾
在host1 上執行
這樣會在hdfs叢集上建立 /tmp 資料夾。
注意:這裡的 /tmp 並不是某一臺機器上的 /tmp 資料夾,是hdfs這個分散式檔案系統上的 tmp 資料夾,這是一個高於真實物理機器環境的一個檔案環境,host1 和 host2 共同組成了它
可以用
來看下hdfs上根目錄下有什麼資料夾檢查是否啟動成功
啟動完後可以用jps 命令 檢查是否啟動成功
host1 上
host2上
客戶端測試
提示:但是此時你會發現host1 跟 host2 之間其實沒有什麼關聯,通過控制檯只能查到各自的datanode資訊,接下來我們說下怎麼樣把兩個host組成一個叢集
設定HA
最早的時候一個hadoop叢集只能有一個namenode如果這個namenode掛了,整個叢集就掛了,後來hadoop結合zookeeper發展出新的部署模式,就是HA(High Availability)模式。在這種模式下
一個叢集可以有多個namenode
只有一個namenode處於活躍狀態,其他namenode處於備選狀態
活躍狀態的namenode跟備選狀態的namenode之間有一定的時間差
採用journalNode來記錄namenode的所有改動,在活躍namenode到備選namenode切換過程中保證不漏掉操作步驟
配置HA
先從修改core-site.xml 開始
接下來的配置是兩臺機器都一樣的,所以我就只寫一份
建立對應的資料夾並分配許可權
引數解釋:
fs.defaultFS 用一個統一的名字來標定叢集的名字
hadoop.tmp.dir 是yarn使用的臨時資料夾
ha.zookeeper.quorum 設定所有zookeeper server的地址,理論上一定要是奇數個,但是現在條件所迫就設定成2個吧
接下來是hdfs-site.xml
配置解釋
dfs.replication 資料的複製份數
dfs.nameservices serviceid 接下來的配置引數中會用到,也就是一個叢集的名字
dfs.ha.namenodes.mycluster 這個mycluster就是之前定義的serviceid,這邊列出所屬的namenode,也就是namenode的host名字
dfs.namenode.rpc-address.mycluster.host1 各個namenode的 rpc通訊地址
dfs.namenode.http-address.mycluster.host1 各個namenode的http狀態頁面地址
dfs.ha.automatic-failover.enabled 是否啟用故障自動處理?就是故障的時候會自動啟用備選的namenode,暫時設定為false
dfs.namenode.shared.edits.dir 定義了叢集的日誌節點,採用統一格式 "qjournal://host1:port1;host2:port2;host3:port3/journalId" ,日誌節點是由active狀態的namenode寫入,由standby(備選)狀態節點讀出
dfs.ha.fencing.methods 處於故障狀態的時候hadoop要防止腦裂問題,所以在standby機器切換到active後,hadoop還會試圖通過內部網路的ssh連過去,並把namenode的相關程序給kill掉,一般是sshfence 就是ssh方式,後面的
dfs.ha.fencing.ssh.private-key-files 則配置了 ssh用的 key 的位置。
建立資料夾,並分配許可權
刪除之前建立的dn資料夾,重新建立新的dn資料夾
為
dfs.ha.fencing.ssh.private-key-files 建立sshkey
step1
在host1 上切換到root使用者建立id_rsa檔案
中間過程問的問題全部回車解決
Step2
把生成的 /root/.ssh/id_rsa.pub 拷貝到 host2 上,然後到host2上用root 許可權執行
Step3
回到 host1 ,把 /root/.ssh/id_rsa 拷貝到 hdfs 的 .ssh 目錄,並且修改使用者為hdfs
Step4
在host1上用hdfs測試一下看能不能用root身份ssh連上host2
Step5
在host2上重複以上4步
修改mapred-site.xml
修改yarn-site.xml ,在
修改檔案slave
把 core-site.xml , hdfs-site.xml, mapred-site.xml, yarn-site.xml, slaves 複製到host2上
重啟兩臺機器上的hadoop, 順序無所謂
注意:如果你啟動有錯,不要慌,去 /var/log/hadoop-hdfs 看下日誌,看具體錯在哪裡再想解決方案
這個時候你可以訪問 host1:50070 或者 host2:50070 會看到兩個namenode都處在standby狀態,是不能對外服務的
接下來我們來看下如何部署HA
部署HA
安裝並啟動JournalNodes
在兩臺機器上都執行
在兩臺機器上都啟動服務
格式化
在兩臺機器上格式化namenode
在兩臺機器上停止namenode
在host1上初始化journalnode
啟動namenode再啟動第一個namenode就是你要作為主要的namenode的那個,這裡我把host1作為主要的
在host1上執行
接下來啟動備用namenode,這裡我把host2作為備用的namenode
可能會問你是否要格式化,記得選Y
啟動備用namenode
啟動 datanode
請大家記住hadoop的基本啟動順序
1.最先啟動的是所有機器上的 journalnode
2.再啟動主機上的namenode
3.啟動備選機上的namenode(還需要用 -bootstrapStandby 拉取映象)
4.啟動所有機器上的datanode
設定host1為active狀態
現在我們來設定host1 為active狀態
其實haadmin 有一個transitionToActive命令,但是最好不要用這個命令,因為主備切換的時候最大的問題就是 腦裂問題,說具體了就是,有可能一不小心把倆namenode都弄成active狀態,並且還都同時工作,造成資料寫入的不一致,後果不堪設想。所以用failover的好處就是會檢查另外一個namenode,如果是active就會設定成standby,如果已經是standby就什麼也不做,這樣比較安全。
設定自動failover
部署還沒有結束,我們之前用的是手動failover,其實是不夠的,如果每次出問題都要手動解決,這個叢集等於是不穩定的。所以要設定自動failover。自動failover用的是zookeeper 的 ZooKeeper FailoverController (ZKFC)
安裝zkfc
兩臺機器都執行
先去把 hdfs-site.xml 裡面的
dfs.ha.automatic-failover.enabled 弄成true,然後重啟namenode
格式化zookeeper
在host1 上執行
這一步會在zookeeper根目錄下建立 /hadoop-ha/mycluster 這個目錄。
建立完後我們去驗證一下用 zookeeper-client 連線上zookeeper
在兩臺機器上都啟動 zkfc
官方說明了幾點:
zkfc跟zookeeper關係密切,要是zookeeper掛了,zkfc也就失效了
最好監控著zkfc程序,防止zkfc退出了,造成無法自動切換
zkfc跟namenode的啟動順序是無所謂的
驗證namenode狀態
開啟瀏覽器訪問 host1:50070 會發現 這個 namenode 變成了active 狀態,再看看 host2:50070 會發現是 standby 狀態。並且datanode下有兩個datanode節點出現
恭喜你!配置完成!