1. 程式人生 > >Hadoop原理與叢集搭建筆記

Hadoop原理與叢集搭建筆記

一、理論部分知識 1、HDFS :Hadoop DIstributed File System簡寫。 易於擴充套件的分散式檔案系統

執行在大量普通廉價機器上(成本低) ,提供容錯的機制(可靠性高)

2、HDFS優點: 高容錯性

適合大資料批處理(移動計算不移動資料、資料位置暴露給計算框架、儲存量大、百萬規模以上的檔案數量、10k節點規模)

流式檔案訪問(一次寫入,多次讀取,保證資料一致性)

構建成本低、安全可靠(構建在廉價機器上、通過多副本提高可靠性、提供容錯和恢復機制)

3、HDFS缺點: 不適合低延遲資料訪問(毫秒級不支援)

不適合大量小檔案儲存(佔用NameNode大量記憶體空間:會導致Namenode不可用、磁碟尋道時間超過讀取時間)

不適合併發寫入(一個檔案只能一個寫入者:多執行緒同時寫一個不行,只有一個能成功,其他都會報異常)

不提供檔案隨機修改(只支援追加)

4、HDFS設計需求 1)超大檔案2)流式資料訪問3)低成本4)資料一致性5)高吞吐率6)易擴充套件7)高容錯

5、HDFS 架構圖

hdfs架構圖 若想有更高的容錯,可以複製多個副本數。

6、HDFS核心概念: Active NameNode

1)主Master(只有一個)

2)管理HDFS檔案系統名稱空間

3)管理副本策略(預設3個副本)

4)處理客戶端讀寫請求

Standby NameNode: Active NameNode的熱備節點

1)NameNode 元資料檔案

edits:編輯日誌

fsimage: 檔案系統元資料檢查點映象檔案,儲存檔案系統中所有目錄和檔案資訊

2)NameNode 記憶體中儲存一份最新的映象資訊

3)NameNode定期將edits+fsimage合併儲存到磁碟

DataNode

1)slave工作節點,可以啟動多個

2)儲存資料庫和資料校驗和

3)執行客戶端讀寫請求操作

4)通過心跳機制定期向NameNode 彙報執行狀態和塊列表資訊

5)叢集啟動時向NameNode 提供儲存的塊列表資訊

Block資料塊

1)檔案寫入到HDFS會被切分成若干個Block塊

2)資料塊大小固定,預設大小128MB,可自定義修改

3)HDFS最小儲存單元

4)若一個塊的大小小於設定的資料塊大小,則不會佔用整個塊的空間

5)預設情況下每個Block有三個副本

Client

1)檔案切分

2)與NameNode互動獲取元資料資訊

3)與DataNode,讀取/寫入資料

4)管理HDFS

7、HDFS為什麼不適合儲存小檔案? 元資料資訊儲存在NameNode記憶體中,記憶體大小有限

NameNode儲存BLock資料有限

一個Block元資料消耗大約150byte記憶體

如果儲存一億個block,大約需要20G記憶體

如果一個檔案為10K,則1億個檔案大小隻有1TB,卻消耗了20G記憶體

8、HDFS高可用原理

高可用原理 JournalNode一般部署奇數個,3臺最多允許1臺掛掉,否則叢集不可用

對於ActiveNode,寫請求時阻塞,元資料同時寫入edit ,還同時寫入所有的JournalNode ,都寫入完成後,會在記憶體中寫一個檔案,更新記憶體中的目錄數。元資料資訊會定期的更新到fsimage ,fsimage相當於一個映象檔案

對於Standby Node,定期從JournalNode中同步元資料資訊到記憶體中,然後定期的更新到fsimage。

9、YARN核心元件 ResourceManage:整個叢集只有一個Master

NodeManage :每個節點只有一個,叢集上會有多個,一般與DataNode一一對應,在相同的叢集上部署。

ApplicationManage:每個應用程式只有一個,負責應用程式的管理,資源申請和任務排程。

Container:任務執行環境的抽象,只有在分配任務的時候才會抽象出一個Container。

二、Hadoop分散式安裝 1、使用hadoop使用者解壓並安裝到apps路徑下

1.1使用hadoop使用者進入到在/home/hadoop/apps目錄下

  cd /home/hadoop/apps

注意:如果沒有/home/hadoop/apps路徑,自行在/home/hadoop路徑下建立apps資料夾:

  mkdir /home/Hadoop/apps

1.2使用rz將本機的hadoop安裝包上傳到/home/hadoop/apps目錄下

1.3解壓安裝檔案

tar -zxvf hadoop-2.7.4.tar.gz

1.4使用root使用者建立軟連結

ln -s /home/hadoop/apps/hadoop-2.7.4 /usr/local/hadoop

1.5使用root使用者修改軟連結屬主

chown -R hadoop:hadoop /usr/local/hadoop

1.6使用root使用者將hadoop相關內容新增到環境變數中

注意:Hadoop配置檔案路徑是/usr/local/hadoop/etc/hadoop

vim /etc/profile

新增內容如下:

export HADOOP_HOME=/usr/local/hadoop

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

export YARN_HOME=$HADOOP_HOME

export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop

export PATH=PATH:PATH:{HADOOP_HOME}/bin:${HADOOP_HOME}/sbin

1.7使用root使用者重新編譯環境變數使配置生效

source /etc/profile

  1. 配置HDFS

2.1使用hadoop使用者進入到Hadoop配置檔案路徑

cd /usr/local/hadoop/etc/hadoop

修改JDK路徑export JAVA_HOME=/usr/local/jdk

2.3 配置core-site.xml

2.4 配置hdfs-site.xml

  1. 配置YARN

3.1 修改yarn-site.xml

3.2 修改mapred-site.xml

3.3 在/usr/local/hadoop路徑下建立hdpdata資料夾

cd /usr/local/hadoop

mkdir hdpdata

  1. 修改slaves檔案,設定datanode和nodemanager啟動節點主機名稱

在slaves檔案中新增節點的主機名稱

node03

node04

node05

注意:node03,node04,node05是我的虛擬機器主機名稱,在這三臺機器上啟動datanode和nodemanager,同學根據自己叢集主機名稱情況自行修改。

  1. 配置hadoop使用者免密碼登陸

配置node01到node01、node02、node03、node04、node05的免密碼登陸

在node01上生產一對鑰匙

ssh-keygen -t rsa

將公鑰拷貝到其他節點,包括自己本機

ssh-copy-id -i node01

ssh-copy-id -i node02

ssh-copy-id -i node03

ssh-copy-id -i node04

ssh-copy-id -i node05

注意:兩個namenode之間要配置ssh免密碼登陸

  1. 將配置好的hadoop拷貝到其他節點

scp -r hadoop-2.7.4 [email protected]:/home/hadoop/apps

scp -r hadoop-2.7.4 [email protected]:/home/hadoop/apps

scp -r hadoop-2.7.4 [email protected]:/home/hadoop/apps

scp -r hadoop-2.7.4 [email protected]:/home/hadoop/apps

在每個節點分別執行如下四步操作

第一步:使用root使用者建立軟連結

ln -s /home/hadoop/apps/hadoop-2.7.4 /usr/local/hadoop

第二步:使用root使用者修改軟連結屬主

chown -R hadoop:hadoop /usr/local/hadoop

第三步:使用root使用者新增環境變數

vim /etc/profile

新增內容:

export HADOOP_HOME=/usr/local/hadoop

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

export YARN_HOME=$HADOOP_HOME

export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop

export PATH=PATH:PATH:{HADOOP_HOME}/bin:${HADOOP_HOME}/sbin

第四步:使用root使用者重新編譯環境變數使配置生效

source /etc/profile

叢集啟動步驟(注意使用hadoop使用者啟動,嚴格按照順序啟動)

su hadoop

  1. 啟動journalnode(分別在node03、node04、node05上執行啟動)

/usr/local/hadoop/sbin/hadoop-daemon.sh start journalnode

執行jps命令檢驗,node03、node04、node05上多了JournalNode程序

  1. 格式化HDFS

在node01上執行命令:

hdfs namenode -format

格式化成功之後會在core-site.xml中的hadoop.tmp.dir指定的路徑下生成dfs資料夾,將該資料夾拷貝到node02的相同路徑下

scp -r hdpdata [email protected]:/usr/local/hadoop

  1. 在node01上執行格式化ZKFC操作

hdfs zkfc -formatZK

執行成功,日誌輸出如下資訊

INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/ns in ZK

  1. 在node01上啟動HDFS

sbin/start-dfs.sh

  1. 在node02上啟動YARN

sbin/start-yarn.sh

在node01單獨啟動一個ResourceManger作為備份節點

sbin/yarn-daemon.sh start resourcemanager

  1. 在node02上啟動JobHistoryServer

sbin/mr-jobhistory-daemon.sh start historyserver

啟動完成node02會增加一個JobHistoryServer程序

  1. hadoop安裝啟動完成

HDFS HTTP訪問地址

ResourceManager HTTP訪問地址

歷史日誌HTTP訪問地址

三、hadoop叢集驗證

  1. 驗證HDFS 是否正常工作及HA高可用

首先向hdfs上傳一個檔案

hadoop fs -put /usr/local/hadoop/README.txt /

在active節點手動關閉active的namenode

sbin/hadoop-daemon.sh stop namenode

通過HTTP 50070埠檢視standby namenode的狀態是否轉換為active

手動啟動上一步關閉的namenode

sbin/hadoop-daemon.sh start namenode

2.驗證YARN是否正常工作及ResourceManager HA高可用

執行測試hadoop提供的demo中的WordCount程式:

hadoop fs -mkdir /wordcount

hadoop fs -mkdir /wordcount/input

hadoop fs -mv /README.txt /wordcount/input

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.4.jar wordcount /wordcount/input /wordcount/output

驗證ResourceManager HA

手動關閉node02的ResourceManager

sbin/yarn-daemon.sh stop resourcemanager

通過HTTP 8088埠訪問node01的ResourceManager檢視狀態

手動啟動node02 的ResourceManager

sbin/yarn-daemon.sh start resourcemanager

四、Hadoop叢集搭建常見問題記錄 問題1 : 啟動hadoop集群后訪問node02的resouremanage 無啟用的Nodes 如下圖所示?

解決方法,是虛擬機器記憶體不夠,需要修改yarn-site.xml配置檔案

修改yarn-site.xml配置檔案新增如下內容:

把這兩項配置新增到yarn-site.xml裡,所有機器都要改,保持配置檔案一直然後關閉yarn :sbin/stop-yarn.sh

關閉之後啟動: sbin/start-yarn.sh

課上老師答疑記錄

問題1:假如說datanode掛了 硬體沒有問題的情況下能恢復麼?

答:可以恢復,DataNode掛了,會通過NameNode副本恢復,然後DataNode重啟後,資料塊就刪除了。

問題2:JN裡面寫的是操作日誌還是資料檔案?

答:JN裡面寫的是操作日誌

問題3:zookeeper、yarn、hdfs、hadoop 關係?

答:hadoop包括hdfs、yarn; zookeeper是充當nadenode ,resoursemanage選主過程,老師繪製草圖如下:

當nn1掛掉,臨時節點就會被刪除,nn2變為active、

同理rm1掛掉,臨時節點被刪除,rm2再去請求,變為active