1. 程式人生 > >Hadoop 2.0架構搭建

Hadoop 2.0架構搭建

節點擔任的角色

		NN		DN		JN		ZK		ZKFC		RM
node01   1		 1 		 1       1         1          
node02   1       1       1       1         1         1
node03           1       1       1                   1

1.修改Hadoop-env.sh

export JAVA_HOME=/usr/java/jdk1.7.0_67

2.配置core-site.xml

<configuration>
  <property>
      <name>ipc.client.connect.max.retries</name>
      <value>20</value>  //最大連線次數,修改大一點,為20,預設10
  </property>
  <property>
     <name>ipc.client.connect.retry.interval</name>
     <value>1000</value> //重複連線的間隔1000ms=1s
  </property>
  <property>
     <name>fs.defaultFS</name>
     <value>hdfs://ocean</value>   //叢集的名字
  </property>
  <property>
     <name>ha.zookeeper.quorum</name>
     <value>node01:2181,node02:2181,node03:2181</value>    //zookeeper節點
  </property>
  <property>
     <name>hadoop.tmp.dir</name>
     <value>/opt/hadoop2</value>   //NN DN的資料資訊
  </property>
</configuration>

3.配置hdfs-site.xml

<configuration>
   <property>
      <!-- 伺服器的名稱 -->
      <name>dfs.nameservices</name>     
      <value>ocean</value>
   </property>
   <property>
      <!-- 高可用的NN -->
      <name>dfs.ha.namenodes.shsxt</name>    
      <value>nn1,nn2</value>
   </property>
   <property>
      <name>dfs.namenode.rpc-address.shsxt.nn1</name>
      <value>node01:8020</value>
   </property>
   <property>
      <name>dfs.namenode.rpc-address.shsxt.nn2</name>
      <value>node02:8020</value>
   </property>
   <property>
      <!-- namenode的http地址和埠 -->
      <name>dfs.namenode.http-address.shsxt.nn1</name>
      <value>node01:50070</value>
   </property>
   <property>
      <!-- namenode的http地址和埠 -->
      <name>dfs.namenode.http-address.shsxt.nn2</name>
      <value>node02:50070</value>
   </property>
   <property>
      <!-- 指定namenode元資料儲存在journalnode中的路徑 -->
	  <name>dfs.namenode.shared.edits.dir</name>
	  <value>qjournal://node01:8485;node02:8485;node03:8485/shsxt</value>
   </property>
   <property>
      <!-- 指定HDFS客戶端連線active namenode的java類 -->
      <name>dfs.client.failover.proxy.provider.shsxt</name> 
		<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
   </property>
   <property>
      <!-- 配置隔離機制為ssh 防止腦裂 -->
      <name>dfs.ha.fencing.methods</name>
      <value>sshfence</value>
      <value>shell(true)</value>
   </property>
   <property>
      <!-- 指定祕鑰的位置 -->
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/root/.ssh/id_dsa</value>
   </property>
   <property>
      <!-- 指定journalnode日誌檔案儲存的路徑 -->
      <name>dfs.journalnode.edits.dir</name>
      <value>/opt/hadoop2/data</value>
    </property>
    <property>
      <!-- 開啟自動故障轉移 -->
      <name>dfs.ha.automatic-failover.enabled</name>
      <value>true</value>
    </property>
</configuration>

3.配置hadoop中的slaves

node01
node02
node03

4.準備zookeeper

a)三臺zookeeper:hadoop1,hadoop2,hadoop3 
b)編輯zoo.cfg配置檔案
	修改dataDir=/opt/zookeeper
	server.1=node01:2888:3888
    server.2=node02:2888:3888
    server.3=node03:2888:3888

c)建立/opt/zookeeper,並在該目錄中建立一個myid的檔案,三個節點的myid檔案內容分別為1,2,3

5.環境變數配置

export PATH
export JAVA_HOME=/usr/java/jdk1.7.0_67
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_HOME=/usr/soft/hadoop-2.6.5
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export ZOOKEEPER_HOME=/usr/soft/zookeeper-3.4.6
export PATH=$PATH:$ZOOKEEPER_HOME/bin

6.把環境變數、Hadoop和zookeeper發到其他節點,並載入環境變數

7.啟動三個zookeeper:

zkServer.sh start
jps看一下,有時候jps有執行緒不代表啟動成功,zkServer.sh status看一下

8.啟動三個JournalNode:

hadoop-daemon.sh start journalnode
jps看一下是否啟動

9.在其中一個namenode上格式化:

hdfs namenode -format

10.把剛剛格式化之後的元資料拷貝到另外一個namenode上:

a)啟動剛剛格式化的namenode :  
	hadoop-daemon.sh start namenode
	jps看到namenode已經啟動
b)在沒有格式化的namenode上執行:
	hdfs namenode -bootstrapStandby
c)啟動第二個namenode    
	hadoop-daemon.sh start namenode

11.在其中一個namenode上初始化zkfc:

hdfs zkfc -formatZK

12.在隨便一個節點上停止服務:

stop-dfs.sh
jps檢視一下

13.在隨便一個節點上全面啟動:

start-dfs.sh
jps檢視一下是否全部啟動

14.啟動node02和node03 yarn的resourcemanager

yarn-daemon.sh start resourcemanager  (yarn resourcemanager  )

關閉叢集:

   stop-dfs.sh
   zkServer.sh stop
   yarn-daemon.sh stop resourcemanager

有可能會出錯的地方

1,確認每臺機器防火牆均關掉
2,確認每臺機器的時間是一致的
3,確認配置檔案無誤,並且確認每臺機器上面的配置檔案一樣
4,如果還有問題想重新格式化,那麼先把所有節點的程序關掉
5,刪除之前格式化的資料目錄hadoop.tmp.dir屬性對應的目錄,所有節點同步都刪掉,別單刪掉之前的一個,
   刪掉三臺JN節點中dfs.journalnode.edits.dir屬性所對應的目錄
6,接上面的第6步又可以重新格式化已經啟動了
7,最終Active Namenode停掉的時候,StandBy可以自動接管!

部署過程中遇到的問題:

1.每次只能啟動一個namenode:
	搭建HA的情況下,開啟start-dfs.sh 服務的時候,master和slave1兩個NameNode服務總有一個掛掉,
    原因:start-dfs.sh的時候,首先開啟的是master:NameNode,後是slave1:NameNode,最後是JournalNode
              即是:namenode-->datanode-->journalnode-->zkfc,兩個NameNode的服務衝突,必須的先開啟JournalNode服務才行(三個節點都要先開)
	解決方案:在core-site.xml新增下述內容:
		<property>
          		<name>ipc.client.connect.max.retries</name>
          		<value>20</value>  //最大連線次數,修改大一點,為20,預設10
          	<description>Indicates the number of retries a client will make to establish
              		 a server connection.
          	</description>
  		</property>
 
  		<property>
        		 <name>ipc.client.connect.retry.interval</name>
          		 <value>1000</value> //重複連線的間隔1000ms=1s
          		 <description>Indicates the number of milliseconds a client will wait for
                        	before retrying to establish a server connection.
          		 </description>
  		</property>
	因為:NameNode連線不上JournalNode,超過一定的次數,就會掛掉,所以要增加連線的最大次數。

2.一個namenode掛掉後不會自動切換:hdfs-site.xml
	<property>
        	<name>dfs.ha.fencing.methods</name>
        	<value>sshfence</value>
        	<value>shell(true)</value>
	</property>