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={HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
1.7使用root使用者重新編譯環境變數使配置生效
source /etc/profile
- 配置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
- 配置YARN
3.1 修改yarn-site.xml
3.2 修改mapred-site.xml
3.3 在/usr/local/hadoop路徑下建立hdpdata資料夾
cd /usr/local/hadoop
mkdir hdpdata
- 修改slaves檔案,設定datanode和nodemanager啟動節點主機名稱
在slaves檔案中新增節點的主機名稱
node03
node04
node05
注意:node03,node04,node05是我的虛擬機器主機名稱,在這三臺機器上啟動datanode和nodemanager,同學根據自己叢集主機名稱情況自行修改。
- 配置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免密碼登陸
- 將配置好的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={HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
第四步:使用root使用者重新編譯環境變數使配置生效
source /etc/profile
叢集啟動步驟(注意使用hadoop使用者啟動,嚴格按照順序啟動)
su hadoop
- 啟動journalnode(分別在node03、node04、node05上執行啟動)
/usr/local/hadoop/sbin/hadoop-daemon.sh start journalnode
執行jps命令檢驗,node03、node04、node05上多了JournalNode程序
- 格式化HDFS
在node01上執行命令:
hdfs namenode -format
格式化成功之後會在core-site.xml中的hadoop.tmp.dir指定的路徑下生成dfs資料夾,將該資料夾拷貝到node02的相同路徑下
scp -r hdpdata [email protected]:/usr/local/hadoop
- 在node01上執行格式化ZKFC操作
hdfs zkfc -formatZK
執行成功,日誌輸出如下資訊
INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/ns in ZK
- 在node01上啟動HDFS
sbin/start-dfs.sh
- 在node02上啟動YARN
sbin/start-yarn.sh
在node01單獨啟動一個ResourceManger作為備份節點
sbin/yarn-daemon.sh start resourcemanager
- 在node02上啟動JobHistoryServer
sbin/mr-jobhistory-daemon.sh start historyserver
啟動完成node02會增加一個JobHistoryServer程序
- hadoop安裝啟動完成
HDFS HTTP訪問地址
ResourceManager HTTP訪問地址
歷史日誌HTTP訪問地址
三、hadoop叢集驗證
- 驗證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