文章目錄
job在YARN上的提交流程
(0)Mr 程序提交到客戶端所在的節點。
(1)Yarnrunner 向 Resourcemanager 申請一個 Application。
(2)rm 將該應用程序的資源路徑返回給 yarnrunner。
(3)該程序將運行所需資源提交到 HDFS 上。
(4)程序資源提交完畢後,申請運行 mrAppMaster。
(5)RM 將用戶的請求初始化成一個 task。
(6)其中一個 NodeManager 領取到 task 任務。
(7)該 NodeManager 創建容器 Container,併產生 MRAppmaster。
(8)Container 從 HDFS 上拷貝資源到本地。
(9)MRAppmaster 向 RM 申請運行 maptask 資源。
(10)RM 將運行 maptask 任務分配給另外兩個 NodeManager,另兩個 NodeManager 分
別領取任務並創建容器。
(11)MR 向兩個接收到任務的 NodeManager 發送程序啓動腳本,這兩個 NodeManager
分別啓動 maptask,maptask 對數據分區排序。
(12)MrAppMaster 等待所有 maptask 運行完畢後,向 RM 申請容器,運行 reduce task。
(13)reduce task 向 maptask 獲取相應分區的數據。
(14)程序運行完畢後,MR 會向 RM 申請註銷自己。
優化
推測執行
當某一個map或者reduce運行的時候可能出現了卡死的現象, 推測執行就會重新開啓一個任務, 和之前的任務進行比較, 哪一個任務先執行完就以把一個爲準
mapreduce執行的慢的原因
- 硬件的問題: 雖然集羣的配置都是一樣的, 但是仍然會有硬件不一樣的問題, 比如硬件使用時間的不同會造成硬件性能的不一樣, 所以硬件的不同會造成mapreduce執行的慢
- 數據傾斜: 當多個map執行的結果集中到了一個reduce上, 造成了數據的不平衡, 這樣整個mapreduce任務就會以最慢的那個reduce爲準, 也會是mapreduce執行的慢
- 磁盤上溢寫次數: 磁盤上溢寫次數過多也會造成mapreduce變慢
zookeeper
Nh爲了能夠實時同步Active和Standby兩個NameNode的元數據信息(實際上editlog),需提供一個共享存儲系統,可以是NFS、QJM(Quorum Journal Manager)或者Bookeeper,Active Namenode將數據寫入共享存儲系統,而Standby監聽該系統,一旦發現有新數據寫入,則讀取這些數據,並加載到自己內存中,以保證自己內存狀態與Active NameNode保持基本一致,如此這般,在緊急情況下standby便可快速切爲active namenode。
- zookeeper是Apache的一個開源項目, 提供分佈式應用協調服務的
- zookeeper存在的角色
- 領導者–leader—更新系統的狀態, 發起投票和選舉
- 跟隨者–follower—接收客戶端的請求, 並返回結果給客戶端, 參與投票
- 選舉機制: 節點半數以上才能提供服務
- 搭建zookeeper原則, 2n + 1
- 數據結構: 與Linux非常像, 可以把數據的結構的整體看做一棵樹, 每一個節點(目錄)都稱爲znode, 每一個znode 默認存儲的數據爲1MB
zookeeper的安裝與下載
- 下載, 官方網址: https://blog.csdn.net/forever428/article/details/83793206
- 修改文件權限,
sudo chown -R hadoop:hadoop zookeeper-3.4.10.tar.gz
- 解壓, 命令 tar -zxvf zookeeper… -C [zookeeper]
- 修改配置文件
mv zoo_sample.cfg zoo.cfg
單機版安裝
- 創建tmp目錄. 並修改dataDir=/tmp/zookeeper 默認的屬性 保存在tmp下
- 啓動
bin/zkServer.sh start 啓動
bin/zkServer.sh status 查看狀態
bin/zkCli.sh 進入客戶端命令
配置文件的含義
tickTime=2000 服務器的心跳時間 毫秒爲單位
initLimit=10 leader 與follower 初始通信時長
syncLimit=5 leader 與follower 同步通信時長
dataDir 數據的文件目錄,持久化保存的數據保存在該目錄下
clientPort=2181 客戶端的連接端口
節點類型
- 短暫節點 : 客戶端與服務器端斷開,創建的節點 刪除
- 持久節點 客戶端與服務器端斷開,創建的節點不刪除
分佈式安裝
一. HA集羣規劃(3臺)
PC01 | PC02 | PC03 |
---|---|---|
NameNode | NameNode | ResourceManager |
ZKFC | ZKFC | ZooKeeper |
DataNode | DataNode | DataNode |
JournalNode | JournalNode | JournalNode |
NodeManager | NodeManager | NodeManager |
ZooKeeper | ZooKeeper |
二 . 環境準備
1.主機名(3臺PC)
2.hosts文件
3.網絡配置
4.防火牆
5.設置SSH免登陸
6.時間同步
三. 安裝部署
- 安裝JDK(3臺PC都要安裝JDK)
配置環境變量 - 安裝zk集羣
1)安裝zk
2)配置zoo.cfg文件
dataDir=/opt/modules/zookeeper-3.4.5/zkData
server.1=hh1:2888:3888
server.2=hh2:2888:3888
server.3=hh3:2888:3888
3)創建zkData目錄,在zkData目錄下創建myid文件,編輯myid文件,內容
就是此臺server的zk的id號
4)啓動三臺zkServer
$ bin/zkServer.sh start ##啓動服務
$ bin/zkServer.sh status ##查看狀態
- 配置hadoop集羣
1)安裝hadoop
2)配置環境文件
hadoop-env.sh
mapred-env.sh
yarn-env.sh
export JAVA_HOME=/opt/modules/jdk1.7.0_67
3)配置文件
=======core-site.xml文件
<!-- 指定hdfs的nameservice爲ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!-- 指定hadoop臨時目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/modules/hadoop-2.5.0/data</value>
</property>
=============hdfs-site.xml文件
<!--指定hdfs的nameservice爲ns1,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- ns1下面有兩個NameNode,分別是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>hh1:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>hh1:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>hh2:8020</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>hh2:50070</value>
</property>
<!-- 指定NameNode的元數據在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://[hostname-1]:8485;[hostname-2]:8485;[hostname-3]:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數據的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/modules/hadoop-2.5.0/journal</value>
</property>
<!-- 配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行
sshfence:當Active出問題後,standby切換成Active,此時,原Active又沒有停止服務,這種情況下會被強制殺死進程。
shell(/bin/true):NN Active和它的ZKFC一起掛了,沒有人通知ZK,ZK長期沒有接到通知,standby要切換,此時,standby調一個shell(腳本內容),這個腳本返回true則切換成功。
-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔離機制時需要ssh免登陸 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/[hadoop]/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔離機制超時時間 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
==========mapred-site.xml文件
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
==========yarn-site.xml
<!-- 指定resourcemanager地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hh3</value>
</property>
<!-- 指定nodemanager啓動時加載server的方式爲shuffle server -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
==================slaves文件
hh1
hh2
hh3
```
4)分發配置文件到其他兩臺機器
```
scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml hh2:/opt/modules/hadoop-2.5.0/etc/hadoop
scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml hh3:/opt/modules/hadoop-2.5.0/etc/hadoop
- 啓動hadoop集羣
- 注意:每一個步驟都嚴格按照以下步驟執行
1)如果有,刪除hadoop中的tmp目錄和journal目錄(PC01)
$ rm -rf data/
$ rm -rf logs/
2)啓動zk(三臺PC)
$ bin/zkServer.sh start
3)啓動journalnode(三臺PC)
$ sbin/hadoop-daemon.sh start journalnode
4)格式化hdfs(PC01)
$ bin/hdfs namenode -format ##格式化
$ sbin/hadoop-daemon.sh start namenode ##啓動namenode
5)同步nn1的元數據信息(PC02)
$ bin/hdfs namenode -bootstrapStandby ##同步數據
$ sbin/hadoop-daemon.sh start namenode ##啓動namenode
6)查看web
http://hh1:50070/ ##standby
http://hh2:50070/ ##standby
7)手動切換namenode狀態
$ bin/hdfs haadmin -transitionToActive nn1 ##切換成active
$ bin/hdfs haadmin -transitionToStandby nn1 ##切換成standby
- 開啓故障自動轉移
1)配置hdfs-site.xml文件
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
2)配置core-site.xml文件
<property>
<name>ha.zookeeper.quorum</name>
<value>hh1:2181,hh2:2181,hh3:2181</value>
</property>
3)分發配置文件到其他兩臺機器
scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml hh2:/opt/modules/hadoop-2.5.0/etc/hadoop
scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml hh3:/opt/modules/hadoop-2.5.0/etc/hadoop
4)啓動服務
首先停止hdfs和zk
$ sbin/stop-dfs.sh
$ bin/zkServer.sh stop ##關閉zk(3臺服務器)
重啓
$ bin/zkServer.sh start ##啓動zk(3臺服務器)
5)初始化zkfc[PC1也就是nn1]
$ bin/hdfs zkfc -formatZK
6)啓動
$ sbin/start-dfs.sh ##啓動hdfs
bin/hdfs haadmin -getServiceState nn1 #查看nn1狀態
bin/hdfs haadmin -getServiceState nn2 #查看nn2狀態
【PC1】
[hadoop@hadoop hadoop-2.5.0]$ jps
11006 JournalNode
10821 DataNode
11690 Jps
9386 QuorumPeerMain
10723 NameNode
11185 DFSZKFailoverController
【PC2】
[hadoop@hadoop hadoop-2.5.0]$ jps
7263 NameNode
7544 DFSZKFailoverController
7184 QuorumPeerMain
7624 Jps
7417 JournalNode
7326 DataNode
【PC3】
[hadoop@hadoop hadoop-2.5.0]$ jps
5678 Jps
5449 QuorumPeerMain
5618 JournalNode
5530 DataNode