hadoop10--zookeeper安裝和配置,job提交流程及優化

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執行的慢的原因

  1. 硬件的問題: 雖然集羣的配置都是一樣的, 但是仍然會有硬件不一樣的問題, 比如硬件使用時間的不同會造成硬件性能的不一樣, 所以硬件的不同會造成mapreduce執行的慢
  2. 數據傾斜: 當多個map執行的結果集中到了一個reduce上, 造成了數據的不平衡, 這樣整個mapreduce任務就會以最慢的那個reduce爲準, 也會是mapreduce執行的慢
  3. 磁盤上溢寫次數: 磁盤上溢寫次數過多也會造成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的安裝與下載

  1. 下載, 官方網址: https://blog.csdn.net/forever428/article/details/83793206
  2. 修改文件權限,
sudo chown -R hadoop:hadoop zookeeper-3.4.10.tar.gz
  1. 解壓, 命令 tar -zxvf zookeeper… -C [zookeeper]
  2. 修改配置文件
mv zoo_sample.cfg zoo.cfg
單機版安裝
  1. 創建tmp目錄. 並修改dataDir=/tmp/zookeeper 默認的屬性 保存在tmp下
  2. 啓動
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.時間同步

三. 安裝部署
  1. 安裝JDK(3臺PC都要安裝JDK)
    配置環境變量
  2. 安裝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		##查看狀態	
  1. 配置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
  1. 啓動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. 開啓故障自動轉移
    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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章