Hadoop分佈式文件存儲系統HDFS高可用HA搭建

一、準備5臺機器:

       1臺NameNode,處於active狀態。
       1臺NameNode,處於standBy狀態,如果主NameNode掛了,自動切換到standBy機器,屬於Hdoop的HA。可以由很多臺處於standBy狀態的NameNode,一般一臺就夠了。同一時刻,只能有一臺處於active狀態的NameNode 。
        另外3臺是DataNode。


二、修改主機名稱,用於hadoop機器間的通訊。
 1)、修改DNS解析,vi /etc/hosts
    192.168.62.156 hadoopNameNode
     192.168.62.155 standByNameNode
     192.168.62.152 152dataNode
     192.168.62.153 153dataNode
     192.168.62.154 154dataNode
     2)、同時對127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4中的localhost.localdomain 也分別改名字爲hadoopNameNode  standByNameNode 152dataNode 153dataNode 154dataNode
     此命令後,機器之間可以通過ping 153dataNode的方式,直接ping 192.168.62.153
     3)、分別修改主機名稱:vi /etc/sysconfig/network
          修改HOSTNAME=hadoopNameNode
          修改HOSTNAME=standByNameNode
          修改HOSTNAME=152dataNode
           修改HOSTNAME=153dataNode
          修改HOSTNAME=154dataNode


三、安裝了JDK,,另需要安裝ssh。執行 ssh命令如果顯示說明SSH已經安裝成功。
    usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
[-D [bind_address:]port] [-e escape_char] [-F configfile]
[-I pkcs11] [-i identity_file]
[-L [bind_address:]port:host:hostport]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
[-R [bind_address:]port:host:hostport] [-S ctl_path]
[-W host:port] [-w local_tun[:remote_tun]]
[user@]hostname [command]


四、配置SSH  免密碼登陸(每一臺服務器上都要執行)
  1)、在每一臺服務器上執行:
           ssh-keygen   -t     rsa       之後一路回 車(產生祕鑰,會自動產生一個.ssh文件
           位於:./root/.ssh下。


   2)、cd /root/.ssh
   執行:   cp  id_rsa.pub   authorized_keys
  此時執行ssh localhost或ssh IP,無需輸入密碼就能登錄。
 
     上面實際上是生成了公鑰和私鑰,每臺服務器要將自己的公鑰發給其他所有機器。
 
   3)、將每臺服務器的id_rsa.pub文件(公鑰)發送給其他機器(一般先輸入yes,再輸入密碼纔會發送過去)
     1)、在hadoopNameNode服務器上執行:
     scp /root/.ssh/id_rsa.pub standByNameNode:/root/.ssh/hadoopNameNode.pub
     scp /root/.ssh/id_rsa.pub 152dataNode:/root/.ssh/hadoopNameNode.pub
     scp /root/.ssh/id_rsa.pub 153dataNode:/root/.ssh/hadoopNameNode.pub
     scp /root/.ssh/id_rsa.pub 154dataNode:/root/.ssh/hadoopNameNode.pub

     2)、在standByNameNode服務器上執行:

     scp /root/.ssh/id_rsa.pub hadoopNameNode:/root/.ssh/standByNameNode.pub
     scp /root/.ssh/id_rsa.pub 152dataNode:/root/.ssh/standByNameNode.pub
     scp /root/.ssh/id_rsa.pub 153dataNode:/root/.ssh/standByNameNode.pub
     scp /root/.ssh/id_rsa.pub 154dataNode:/root/.ssh/standByNameNode.pub

    3)、在152dataNode服務器上執行:

     scp /root/.ssh/id_rsa.pub hadoopNameNode:/root/.ssh/152dataNode.pub
     scp /root/.ssh/id_rsa.pub standByNameNode:/root/.ssh/152dataNode.pub
     scp /root/.ssh/id_rsa.pub 153dataNode:/root/.ssh/152dataNode.pub
     scp /root/.ssh/id_rsa.pub 154dataNode:/root/.ssh/152dataNode.pub

    4)、在153dataNode服務器上執行:

     scp /root/.ssh/id_rsa.pub hadoopNameNode:/root/.ssh/153dataNode.pub
     scp /root/.ssh/id_rsa.pub standByNameNode:/root/.ssh/153dataNode.pub
     scp /root/.ssh/id_rsa.pub 152dataNode:/root/.ssh/153dataNode.pub
     scp /root/.ssh/id_rsa.pub 154dataNode:/root/.ssh/153dataNode.pub

    5)、在154dataNode服務器上執行:

    scp /root/.ssh/id_rsa.pub hadoopNameNode:/root/.ssh/154dataNode.pub
     scp /root/.ssh/id_rsa.pub standByNameNode:/root/.ssh/154dataNode.pub
     scp /root/.ssh/id_rsa.pub 152dataNode:/root/.ssh/154dataNode.pub
     scp /root/.ssh/id_rsa.pub 153dataNode:/root/.ssh/154dataNode.pub

 

4.在每臺機器上執行公鑰都追加到授權文件裏

1)、在hadoopNameNode服務器上執行:
cat  /root/.ssh/standByNameNode.pub >> /root/.ssh/authorized_keys
cat  /root/.ssh/152dataNode.pub >> /root/.ssh/authorized_keys
cat  /root/.ssh/153dataNode.pub >> /root/.ssh/authorized_keys
cat  /root/.ssh/154dataNode.pub >> /root/.ssh/authorized_keys
2)、在standByNameNode服務器上執行:
cat  /root/.ssh/hadoopNameNode.pub >> /root/.ssh/authorized_keys
cat  /root/.ssh/152dataNode.pub >> /root/.ssh/authorized_keys
cat  /root/.ssh/153dataNode.pub >> /root/.ssh/authorized_keys
cat  /root/.ssh/154dataNode.pub >> /root/.ssh/authorized_keys
3)、在152dataNode服務器上執行:
cat  /root/.ssh/standByNameNode.pub >> /root/.ssh/authorized_keys
cat  /root/.ssh/hadoopNameNode.pub >> /root/.ssh/authorized_keys
cat  /root/.ssh/153dataNode.pub >> /root/.ssh/authorized_keys
cat  /root/.ssh/154dataNode.pub >> /root/.ssh/authorized_keys
4)、在153dataNode服務器上執行:
cat  /root/.ssh/hadoopNameNode.pub >> /root/.ssh/authorized_keys
cat  /root/.ssh/standByNameNode.pub >> /root/.ssh/authorized_keys
cat  /root/.ssh/152dataNode.pub >> /root/.ssh/authorized_keys
cat  /root/.ssh/154dataNode.pub >> /root/.ssh/authorized_keys
5)、在154dataNode服務器上執行:
cat  /root/.ssh/hadoopNameNode.pub >> /root/.ssh/authorized_keys
cat  /root/.ssh/standByNameNode.pub >> /root/.ssh/authorized_keys
cat  /root/.ssh/152dataNode.pub >> /root/.ssh/authorized_keys
cat  /root/.ssh/153dataNode.pub >> /root/.ssh/authorized_keys

5)、驗證ssh是否免密碼成功 152dataNode hostname
152dataNode

 

6)、搭建Zookeeper集羣,參考我的其他文章

目前在這3臺機器上搭建了zookeeper集羣

 

192.168.62.153:2181,192.168.62.154:2181,192.168.62.155:2181

 

 

 

7)、在每一臺機器上建立如下目錄:

    1)在操作系統下建立級聯文件夾

     mkdir -p /tmp/hadoop/name

     mkdir -p /tmp/hadoop/data

     mkdir -p /tmp/hadoop/journal

     mkdir -p /tmp/hadoop/tmp

 

 

    2)、賦予權限 

      chmod 777 /tmp/hadoop/name

      chmod 777 /tmp/hadoop/data

      chmod 777 /tmp/hadoop/journal

      chmod 777 /tmp/hadoop/tmp

      chmod 777 haddop安裝目錄下/bin

      chmod 777 haddop安裝目錄下/sbin

 

8)、haddop的配置(文件的配置在haddop安裝目錄下的/etc/haddop目錄下,只需要再其中一臺hadoop機器上配置,其他的拷貝就可以了,共涉及修改7個配置文件)

     cd /soft/hadoop/etc/hadoop

    1)、修改%hadoop%所在目錄下/etc/目錄下的hadoop-env.sh(vi /soft/hadoop/etc/hadoop/hadoop-env.sh)

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

       export HADOOP_OPTS=-Djava.net.preferIPv4Stack=true

    2)、修改vi yarn-env.sh

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

    3)、配置slaves,vi slaves,將數據節點dataNode保存到改文件。

      152dataNode
      153dataNode
      154dataNode

    4)、配置vi core-site.xml

 

<configuration>
  <property>
     <name>fs.defaultFS</name>
     <value>hdfs://mycluster</value>
 </property>
  <property>
	<name>fs.default.name</name>
	<value>hdfs://hadoopNameNode:9000</value>
	</property>
   <property>
     <name>io.file.buffer.size</name>
     <value>131072</value>
  </property>
  <property>
     <name>hadoop.tmp.dir</name>
     <value>file:/tmp/hadoop/tmp</value>
  </property>
  <property>
     <name>hadoop.proxyuser.hadoop.hosts</name>
     <value>*</value>
  </property>
  <property>
     <name>hadoop.proxyuser.hadoop.groups</name>
     <value>*</value>
  </property>
   <property>
     <name>ha.zookeeper.quorum</name>
     <value>192.168.62.153:2181,192.168.62.154:2181,192.168.62.155:2181</value>
  </property>
  <property>
     <name>ha.zookeeper.session-timeout.ms</name>
     <value>1000</value>
  </property>
</configuration>

 

mycluster是自己取的一個名字,後面的一些配置文件中需要使用到這個名字。

 

 

5)、配置vi hdfs-site.xml

 

 

<configuration>
	<property>
		<name>dfs.namenode.name.dir</name>
		<value>file:/tmp/hadoop/name</value>
	</property>
	<property>
		<name>dfs.datanode.data.dir</name>
		<value>file:/tmp/hadoop/data</value>
	</property>
	<property>
		<name>dfs.replication</name>
		<value>3</value>
	</property>
	<property>
		<name>dfs.webhdfs.enabled</name>
		<value>true</value>
	</property>
	<property>
		<name>dfs.permissions</name>
		<value>false</value>
	</property>
	<property>
		<name>dfs.permissions.enabled</name>
		<value>false</value>
	</property>
	<property>
		<name>dfs.nameservices</name>
		<value>mycluster</value>
	</property>
	<property>
		<name>dfs.ha.namenodes.mycluster</name>
		<value>nn1,nn2</value>
	</property>
	<property>
		<name>dfs.namenode.rpc-address.mycluster.nn1</name>
		<value>hadoopNameNode:9000</value>
	</property>
	<property>
		<name>dfs.namenode.rpc-address.mycluster.nn2</name>
		<value>standByNameNode:9000</value>
	</property>
	<property>
		<name>dfs.namenode.http-address.mycluster.nn1</name>
		<value>hadoopNameNode:50070</value>
	</property>
	<property>
		<name>dfs.namenode.http-address.mycluster.nn2</name>
		<value>standByNameNode:50070</value>
	</property>
	<property>
		<name>dfs.namenode.shared.edits.dir</name>
		<value>qjournal://hadoopNameNode:8485;standByNameNode:8485;192.168.62.152:8485/mycluster</value>
	</property>
	<property>
		<name>dfs.client.failover.proxy.provider.mycluster</name>
		<value>org.apache.Hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
	</property>
	<property>
		<name>dfs.ha.fencing.methods</name>
		<value>sshfence</value>
	</property>
	<property>
		<name>dfs.ha.fencing.ssh.private-key-files</name>
		<value>/root/.ssh/id_rsa</value>
	</property>
	<!--  <property>
		<name>dfs.namenode.servicerpc-address.hadoopNameNode.hadoopNameNode
		</name>
		<value>hadoopNameNode:53310</value>
	</property>
	<property>
		<name>dfs.namenode.servicerpc-address.hadoopNameNode.standByNameNode
		</name>
		<value>standByNameNode:53310</value>
	</property>-->
	<property>
		<name>dfs.ha.fencing.ssh.connect-timeout</name>
		<value>30000</value>
	</property>
	<property>
		<name>dfs.journalnode.edits.dir</name>
		<value>/tmp/hadoop/journal</value>
	</property>
	<property>
		<name>dfs.ha.automatic-failover.enabled</name>
		<value>true</value>
	</property>
	<property>
		<name>ha.failover-controller.cli-check.rpc-timeout.ms</name>
		<value>60000</value>
	</property>
	<property>
		<name>ipc.client.connect.timeout</name>
		<value>60000</value>
	</property>
	<property>
		<name>dfs.image.transfer.bandwidthPerSec</name>
		<value>4194304</value>
	</property>
</configuration>

dfs.namenode.shared.edits.dir配置了2臺NameNode,並配置了一臺DataNode進去,否則啓動會告警不建議偶數臺配置。

n1,n2也是自己取的名字。

 


6)、配置vi mapred-site.xml

 

<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
</configuration>


7)、vi yarn-site.xml

 

 

<configuration>
	<property>
		<name>yarn.resourcemanager.connect.retry-interval.ms</name>
		<value>2000</value>
	</property>
	<property>
		<name>yarn.resourcemanager.ha.enabled</name>
		<value>true</value>
	</property>
	<property>
		<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
		<value>true</value>
	</property>
	<property>
		<name>yarn.resourcemanager.ha.rm-ids</name>
		<value>rm1,rm2</value>
	</property>
	<property>
		<name>yarn.resourcemanager.ha.id</name>
		<value>rm1</value>
	</property>
	<property>
		<name>yarn.resourcemanager.store.class</name>
		<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
		</value>
	</property>
	<property>
		<name>yarn.resourcemanager.zk.state-store.address</name>
		<value>192.168.62.153:2181,192.168.62.154:2181,192.168.62.155:2181</value>
	</property>
	<property>
		<name>ha.zookeeper.quorum</name>
		<value>192.168.62.153:2181,192.168.62.154:2181,192.168.62.155:2181</value>
	</property>
	<property>
		<name>yarn.resourcemanager.recovery.enabled</name>
		<value>true</value>
	</property>
	<property>
		<name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms
		</name>
		<value>5000</value>
	</property>
	<!-- RM1 configs -->
	<property>
		<name>yarn.resourcemanager.address.rm1</name>
		<value>hadoopNameNode:23140</value>
	</property>
	<property>
		<name>yarn.resourcemanager.scheduler.address.rm1</name>
		<value>hadoopNameNode:23130</value>
	</property>
	<property>
		<name>yarn.resourcemanager.webapp.address.rm1</name>
		<value>hadoopNameNode:23188</value>
	</property>
	<property>
		<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
		<value>hadoopNameNode:23125</value>
	</property>
	<property>
		<name>yarn.resourcemanager.admin.address.rm1</name>
		<value>hadoopNameNode:23141</value>
	</property>
	<property>
		<name>yarn.resourcemanager.ha.admin.address.rm1</name>
		<value>hadoopNameNode:23142</value>
	</property>
	<!-- RM2 configs -->
	<property>
		<name>yarn.resourcemanager.address.rm2</name>
		<value>standByNameNode:23140</value>
	</property>
	<property>
		<name>yarn.resourcemanager.scheduler.address.rm2</name>
		<value>standByNameNode:23130</value>
	</property>
	<property>
		<name>yarn.resourcemanager.webapp.address.rm2</name>
		<value>standByNameNode:23188</value>
	</property>
	<property>
		<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
		<value>standByNameNode:23125</value>
	</property>
	<property>
		<name>yarn.resourcemanager.admin.address.rm2</name>
		<value>standByNameNode:23141</value>
	</property>
	<property>
		<name>yarn.resourcemanager.ha.admin.address.rm2</name>
		<value>standByNameNode:23142</value>
	</property>
	<!-- Node Manager Configs -->
	<property>
		<description>Address where the localizer IPC is.</description>
		<name>yarn.nodemanager.localizer.address</name>
		<value>0.0.0.0:23344</value>
	</property>
	<property>
		<description>NM Webapp address.</description>
		<name>yarn.nodemanager.webapp.address</name>
		<value>0.0.0.0:23999</value>
	</property>
	<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
	</property>
	<property>
		<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
		<value>org.apache.hadoop.mapred.ShuffleHandler</value>
	</property>
	<property>
		<name>yarn.nodemanager.local-dirs</name>
		<value>/tmp/pseudo-dist/yarn/local</value>
	</property>
	<property>
		<name>yarn.nodemanager.log-dirs</name>
		<value>/tmp/pseudo-dist/yarn/log</value>
	</property>
	<property>
		<name>mapreduce.shuffle.port</name>
		<value>23080</value>
	</property>
</configuration>

 

yarn.resourcemanager.zk.state-store.address配的是zookeeper集羣的地址。

 

 

 

10)、在一臺機器上完成配置後,只要把整個安裝包拷貝到其他機器上就可以了。

scp  -r  /soft/hadoop root@standByNameNode:/soft/hadoop/             拷貝到備份節點,root用戶的/soft/hadoop目錄下

scp  -r  /soft/hadoop root@152dataNode:/soft/hadoop/ 

scp  -r  /soft/hadoop root@153dataNode:/soft/hadoop/ 

scp  -r  /soft/hadoop root@154dataNode:/soft/hadoop/ 

 

11)、將Hadoop的命令執行加入的環境變量中vi /etc/profile

export HADOOP_HOME=/soft/hadoop
export PATH=$PATH:$HADOOP_HOME/bin

export PATH=$PATH:$HADOOP_HOME/sbin

執行source /etc/profile

 

14)、在所有服務器上停止防火牆(Hadoop的通訊有各種)

service iptables stop

----------------------首次部署啓動服務---------------------------------

15)、首先啓動zookeeper集羣。

16)、在hadoopNameNode服務器上執行:hdfs zkfc -formatZK

      目的是註冊到zookeeper,實現故障轉移。

17)、在每個服務器上都執行,因爲HA的haddop的format依賴於journalnode進程:

      hadoop-daemon.sh start journalnode

18)、主nameNode節點下執行,這裏是mycluster是在上面的配置文件中配置的。

        hadoop namenode -format mycluster

19)、在主namenode節點啓動./sbin/hadoop-daemon.shstart namenode進程

   hadoop-daemon.sh start namenode
20)、在備nameNode節點執行第一行命令,這個是把備namenode節點的目錄格式化並把元數據從主namenode節點copy過來,並且這個命令不會把journalnode目錄再格式化了!

   然後用第二個命令啓動備namenode進程!
   hdfs namenode -bootstrapStandby
   hadoop-daemon.sh start namenode
21)、在兩個namenode節點都執行以下命令(先執行的節點就成爲了active狀態的nameNode,另一個爲standBy)
   hadoop-daemon.sh start zkfc
22)、在所有datanode節點都執行以下命令啓動datanode
  hadoop-daemon.sh start datanode

   如果啓動的時候報錯:java.io.IOException: Incompatible clusterIDs in,此時只需要清空datanode機器上/tmp/hadoop/下的所有目錄,然後重建,並chmod 777 * 就可以了。

   如果還是不行,首先清空所有dataNode機器上/tmp/hadoop/下的所有目錄,然後重建,並chmod 777 *,然後重複從第15步開始執行。

 

23)、通過訪問主備NameNode節點,可以查看Hadoop服務器的運行狀況。

http://hadoopNameNode(IP):50070/dfshealth.jsp

http://standByNameNode(IP):50070/dfshealth.jsp

----------------------日常啓動停止服務(非首次)---------------------------------

24)、在主nameNode服務器上啓動停止hadoop服務,可把standBynameNode及dataNode服務器上的所有進程全部啓動。

         啓動命令:start-dfs.sh    可通過JPS命令查看運行的java進程。

                在主nameNode下的進程爲:DFSZKFailoverController、NameNode、JournalNode

                standByNameNode下的進程爲:DFSZKFailoverController、NameNode、JournalNode

                各DataNode下的進程爲DataNode、JournalNode

         停止命令:stop-dfs.sh

25)、有時執行命令hadoop fs -ls /目錄,會報錯:

15/04/07 00:24:39 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
ls: Operation category READ is not supported in state standby

此時需要重複執行(19-21步)

------------------測試Hadoop的nameNode的HA功能---------------------------------

在主nameNode機器上執行命令 jps

15644 NameNode
3221 QuorumPeerMain
16034 Jps
15477 JournalNode
15806 DFSZKFailoverController

然後執行kill -9 15644。

此時可從備nameNode的網頁端http://standByNameNode(IP):50070/dfshealth.jsp看到已經被轉換成active狀態的nameNode節點。

如果在原先的主nameNode上重啓hadoop-daemon.sh start namenode,可以看到其狀態爲備節點。

反覆操作,可以看到nameNode主備自動切換。

 

25)、其他命令:

        關閉dataNode節點:hadoop-daemon.sh stop datanode

        

參考文章: http://www.21ops.com/front-tech/10744.html

擴展閱讀:在本文中使用了一個主nameNode一個備nameNode,通常來說面對數以百萬計的文件是可行,(一百萬個文件的元數據信息佔用主nameNode大概300M的內存,一千萬佔用3G,一個億佔用30G),因此隨着文件的增長,需要通過HDFS Federation實現HDFS的多NameNode.

 

HDFS Federation是指HDFS集羣可同時存在多個NameNode,這些NameNode分別管理一部分數據,且共享所有DataNode的存儲資源。這種設計可解決單NameNode存在的以下幾個問題:

(1)HDFS集羣擴展性。多個NameNode分管一部分目錄,使得一個集羣可以擴展到更多節點,不再像1.0中那樣由於內存的限制制約文件存儲數目。

(2)性能更高效。多個NameNode管理不同的數據,且同時對外提供服務,將爲用戶提供更高的讀寫吞吐率。

(3)良好的隔離性。用戶可根據需要將不同業務數據交由不同NameNode管理,這樣不同業務之間影響很小。

需要注意的,HDFS Federation並不能解決單點故障問題,也就是說,每個NameNode都存在在單點故障問題,你需要爲每個namenode部署一個backup namenode以應對NameNode掛掉對業務產生的影響。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章