怎麼安裝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節點出現

恭喜你!配置完成!