天天看點

配置高可用的Hadoop平台配置高可用的Hadoop平台

  在hadoop2.x之後的版本,提出了解決單點問題的方案--ha(high available 高可用)。這篇部落格闡述如何搭建高可用的hdfs和yarn,執行步驟如下:

建立hadoop使用者

安裝jdk

配置hosts

安裝ssh

關閉防火牆

修改時區

zk(安裝,啟動,驗證)

hdfs+ha的結構圖

角色配置設定

環境變量配置

核心檔案配置

slave

啟動指令(hdfs和yarn的相關指令)

ha的切換

效果截圖

  下面我們給出下載下傳包的連結位址:

  注:若jdk無法下載下傳,請到oracle的官網下載下傳jdk。

  到這裡安裝包都準備好了,接下來我們開始搭建與配置。

<a target="_blank"></a>

useradd hadoop

passwd hadoop

 然後根據提示,設定密碼。接着我給hadoop使用者設定面免密碼權限,也可自行添加其他權限。

chmod +w /etc/sudoers

hadoop all=(root)nopasswd:all

chmod -w /etc/sudoers

  将下載下傳好的安裝包解壓到 /usr/java/jdk1.7,然後設定環境變量,指令如下:

sudo vi /etc/profile

  然後編輯配置,内容如下:

export java_home=/usr/java/jdk1.7

export path=$path:$java_home/bin

  然後使環境變量立即生效,指令如下:

source /etc/profile

  然後驗證jdk是否配置成功,指令如下:

java -version

  若顯示對應版本号,即表示jdk配置成功。否則,配置無效!

  叢集中所有機器的hosts配置要要相同(推薦)。可以避免不必要的麻煩,用域名取代ip,友善配置。配置資訊如下:

10.211.55.12 nna  # namenode active

10.211.55.13 nns  # namenode standby

10.211.55.14 dn1  # datanode1

10.211.55.15 dn2  # datanode2

10.211.55.16 dn3  # datanode3

  然後用scp指令,将hosts配置分發到各個節點。指令如下:

# 這裡以nns節點為例子

scp /etc/hosts hadoop@nns:/etc/

  輸入如下指令:

ssh-keygen –t rsa

  然後一路按Enter鍵,最後在将id_rsa.pub寫到authorized_keys,指令如下:

cat ~/.ssh/id_rsa.pub &gt;&gt; ~/.ssh/authorized_keys

  在hadoop使用者下,需要給authorized_keys賦予600的權限,不然免密碼登陸無效。在其他節點隻需要使用 ssh-keygen –t rsa 指令,生産對應的公鑰,然後将各個節點的id_rsa.pub追加到nna節點的authorized_keys中。最後,将nna節點下的authorized_keys檔案通過scp指令,分發到各個節點的 ~/.ssh/ 目錄下。目錄如下:

# 這裡以nns節點為例子

scp ~/.ssh/authorized_keys hadoop@nns:~/.ssh/

   然後使用ssh指令互相登入,看是否實作了免密碼登入,登入指令如下:

ssh nns

  若登入過程中木有提示需要輸入密碼,即表示密碼配置成功。

  由于hadoop的節點之間需要通信(rpc機制),這樣一來就需要監聽對應的端口,這裡我就直接将防火牆關閉了,指令如下:

chkconfig iptables off

  注:如果用于生産環境,直接關閉防火牆是存在安全隐患的,我們可以通過配置防火牆的過濾規則,即将hadoop需要監聽的那些端口配置到防火牆接受規則中。關于防火牆的規則配置參見“linux防火牆配置”,或者通知公司的運維去幫忙配置管理。

  同時,也需要關閉selinux,可修改 /etc/selinux/config 檔案,将其中的 selinux=enforcing 改為 selinux=disabled即可。

  各個節點的時間如果不同步,會出現啟動異常,或其他原因。這裡将時間統一設定為shanghai時區。指令如下:

# cp /usr/share/zoneinfo/asia/shanghai /etc/localtime

cp: overwrite `/etc/localtime'? yes

修改為中國的東八區

# vi /etc/sysconfig/clock

zone="asia/shanghai"

utc=false

arc=false

  将下載下傳好的安裝包,解壓到指定位置,這裡為直接解壓到目前位置,指令如下:

tar -zxvf zk-{version}.tar.gz

  修改zk配置,将zk安裝目錄下conf/zoo_sample.cfg重命名zoo.cfg,修改其中的内容:

# the number of milliseconds of each tick

# 伺服器與用戶端之間互動的基本時間單元(ms)

ticktime=2000

# the number of ticks that the initial

# synchronization phase can take

# zookeeper所能接受的用戶端數量

initlimit=10

# the number of ticks that can pass between

# sending a request and getting an acknowledgement

# 伺服器和用戶端之間請求和應答之間的時間間隔

synclimit=5

# the directory where the snapshot is stored.

# do not use /tmp for storage, /tmp here is just

# example sakes.

# 儲存zookeeper資料,日志的路徑

datadir=/home/hadoop/data/zookeeper

# the port at which the clients will connect

# 用戶端與zookeeper互相互動的端口

clientport=2181

server.1= dn1:2888:3888

server.2= dn2:2888:3888

server.3= dn3:2888:3888

#server.a=b:c:d

#其中a是一個數字,代表這是第幾号伺服器;b是伺服器的ip位址;

#c表示伺服器與群集中的“上司者”交換資訊的端口;當上司者失效後,d表示用來執行選舉時伺服器互相通信的端口。

  接下來,在配置的datadir目錄下建立一個myid檔案,裡面寫入一個0-255之間的一個随意數字,每個zk上這個檔案的數字要是不一樣的,這些數字應該是從1開始,依次寫每個伺服器。檔案中序号要與dn節點下的zk配置序号一直,如:server.1=dn1:2888:3888,那麼dn1節點下的myid配置檔案應該寫上1。

  分别在各個dn節點啟動zk程序,指令如下:

bin/zkserver.sh start

  然後,在各個節點輸入jps指令,會出現如下程序:

quorumpeermain

  上面說的輸入jps指令,若顯示對應的程序,即表示啟動成功,同樣我們也可以輸入zk的狀态指令檢視,指令如下:

bin/zkserver.sh status

  會出現一個leader和兩個follower。

  hdfs配置ha的結構圖如下所示:

配置高可用的Hadoop平台配置高可用的Hadoop平台

  上圖大緻架構包括:

  1. 利用共享存儲來在兩個nn間同步edits資訊。以前的hdfs是share nothing but nn,現在nn又share storage,這樣其實是轉移了單點故障的位置,但中高端的儲存設備内部都有各種raid以及備援硬體,包括電源以及網卡等,比伺服器的可靠性還是略有 提高。通過nn内部每次中繼資料變動後的flush操作,加上nfs的close-to-open,資料的一緻性得到了保證。

  2. dn同時向兩個nn彙報塊資訊。這是讓standby nn保持叢集的最新狀态的必須步驟。

  3. 用于監視和控制nn程序的failovercontroller程序。顯然,我們不能在nn程序内部進行心跳等資訊同步,最簡單的原因,一次fullgc 就可以讓nn挂起十幾分鐘,是以,必須要有一個獨立的短小精悍的watchdog來專門負責監控。這也是一個松耦合的設計,便于擴充或更改,目前版本裡是 用zookeeper(簡稱zk)來做同步鎖,但使用者可以友善的把這個zookeeper failovercontroller(簡稱zkfc)替換為其他的ha方案或leader選舉方案。

  4. 隔離(fencing),防止腦裂,就是保證在任何時候隻有一個主nn,包括三個方面:

    共享存儲fencing,確定隻有一個nn可以寫入edits。

    用戶端fencing,確定隻有一個nn可以響應用戶端的請求。

    dn fencing,確定隻有一個nn向dn下發指令,譬如删除塊,複制塊等等。

名稱

host

職責

nna

10.211.55.12

zkfc

nns

10.211.55.13

dn1

10.211.55.14

zookeeper

dn2

10.211.55.15

dn3

10.211.55.16

  這裡列出了所有的配置,後面配置其他元件,可以參考這裡的配置。 配置完成後,輸入:. /etc/profile(或source /etc/profile)使之立即生效。嚴重是否環境變量配置成功與否,輸入:echo $hadoop_home,若輸出對應的配置路徑,即可認定配置成功。

  注:hadoop2.x以後的版本conf檔案夾改為etc檔案夾了

  配置内容如下所示:

export hadoop_home=/home/hadoop/hadoop-2.6.0

export zk_home=/home/hadoop/zookeeper-3.4.6

export path=$path:$java_home/bin:$hadoop_home/bin:$hadoop_hom

  注:這裡特别提醒,配置檔案中的路徑在啟動叢集之前,得存在(若不存在,請事先建立)。下面為給出本篇文章需要建立的路徑腳本,指令如下:

mkdir -p /home/hadoop/tmp

mkdir -p /home/hadoop/data/tmp/journal

mkdir -p /home/hadoop/data/dfs/name

mkdir -p /home/hadoop/data/dfs/data

mkdir -p /home/hadoop/data/yarn/local

mkdir -p /home/hadoop/log/yarn

core-site.xml

&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;configuration&gt;

&lt;property&gt;

&lt;name&gt;fs.defaultfs&lt;/name&gt;

&lt;value&gt;hdfs://cluster1&lt;/value&gt;

&lt;/property&gt;

&lt;name&gt;io.file.buffer.size&lt;/name&gt;

&lt;value&gt;131072&lt;/value&gt;

&lt;name&gt;hadoop.tmp.dir&lt;/name&gt;

&lt;value&gt;/home/hadoop/tmp&lt;/value&gt;

&lt;name&gt;hadoop.proxyuser.hduser.hosts&lt;/name&gt;

&lt;value&gt;*&lt;/value&gt;

&lt;name&gt;hadoop.proxyuser.hduser.groups&lt;/name&gt;

&lt;name&gt;ha.zookeeper.quorum&lt;/name&gt;

&lt;value&gt;dn1:2181,dn2:2181,dn3:2181&lt;/value&gt;

&lt;/configuration&gt;

hdfs-site.xml

&lt;name&gt;dfs.nameservices&lt;/name&gt;

&lt;value&gt;cluster1&lt;/value&gt;

&lt;name&gt;dfs.ha.namenodes.cluster1&lt;/name&gt;

&lt;value&gt;nna,nns&lt;/value&gt;

&lt;name&gt;dfs.namenode.rpc-address.cluster1.nna&lt;/name&gt;

&lt;value&gt;nna:9000&lt;/value&gt;

&lt;name&gt;dfs.namenode.rpc-address.cluster1.nns&lt;/name&gt;

&lt;value&gt;nns:9000&lt;/value&gt;

&lt;name&gt;dfs.namenode.http-address.cluster1.nna&lt;/name&gt;

&lt;value&gt;nna:50070&lt;/value&gt;

&lt;name&gt;dfs.namenode.http-address.cluster1.nns&lt;/name&gt;

&lt;value&gt;nns:50070&lt;/value&gt;

&lt;name&gt;dfs.namenode.shared.edits.dir&lt;/name&gt;

&lt;value&gt;qjournal://dn1:8485;dn2:8485;dn3:8485/cluster1&lt;/value&gt;

&lt;name&gt;dfs.client.failover.proxy.provider.cluster1&lt;/name&gt;

&lt;value&gt;org.apache.hadoop.hdfs.server.namenode.ha.configuredfailoverproxyprovider&lt;/value&gt;

&lt;name&gt;dfs.ha.fencing.methods&lt;/name&gt;

&lt;value&gt;sshfence&lt;/value&gt;

&lt;name&gt;dfs.ha.fencing.ssh.private-key-files&lt;/name&gt;

&lt;value&gt;/home/hadoop/.ssh/id_rsa&lt;/value&gt;

&lt;name&gt;dfs.journalnode.edits.dir&lt;/name&gt;

&lt;value&gt;/home/hadoop/data/tmp/journal&lt;/value&gt;

&lt;name&gt;dfs.ha.automatic-failover.enabled&lt;/name&gt;

&lt;value&gt;true&lt;/value&gt;

&lt;name&gt;dfs.namenode.name.dir&lt;/name&gt;

&lt;value&gt;/home/hadoop/data/dfs/name&lt;/value&gt;

&lt;name&gt;dfs.datanode.data.dir&lt;/name&gt;

&lt;value&gt;/home/hadoop/data/dfs/data&lt;/value&gt;

&lt;name&gt;dfs.replication&lt;/name&gt;

&lt;value&gt;3&lt;/value&gt;

&lt;name&gt;dfs.webhdfs.enabled&lt;/name&gt;

&lt;name&gt;dfs.journalnode.http-address&lt;/name&gt;

&lt;value&gt;0.0.0.0:8480&lt;/value&gt;

&lt;name&gt;dfs.journalnode.rpc-address&lt;/name&gt;

&lt;value&gt;0.0.0.0:8485&lt;/value&gt;

map-site.xml

&lt;name&gt;mapreduce.framework.name&lt;/name&gt;

&lt;value&gt;yarn&lt;/value&gt;

&lt;name&gt;mapreduce.jobhistory.address&lt;/name&gt;

&lt;value&gt;nna:10020&lt;/value&gt;

&lt;name&gt;mapreduce.jobhistory.webapp.address&lt;/name&gt;

&lt;value&gt;nna:19888&lt;/value&gt;

yarn-site.xml

&lt;name&gt;yarn.resourcemanager.connect.retry-interval.ms&lt;/name&gt;

&lt;value&gt;2000&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.ha.enabled&lt;/name&gt;

&lt;name&gt;yarn.resourcemanager.ha.rm-ids&lt;/name&gt;

&lt;value&gt;rm1,rm2&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.ha.automatic-failover.enabled&lt;/name&gt;

&lt;name&gt;yarn.resourcemanager.hostname.rm1&lt;/name&gt;

&lt;value&gt;nna&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.hostname.rm2&lt;/name&gt;

&lt;value&gt;nns&lt;/value&gt;

&lt;!--在namenode1上配置rm1,在namenode2上配置rm2,注意:一般都喜歡把配置好的檔案遠端複制到其它機器上,但這個在yarn的另一個機器上一定要修改 --&gt;

&lt;name&gt;yarn.resourcemanager.ha.id&lt;/name&gt;

&lt;value&gt;rm1&lt;/value&gt;

&lt;!--開啟自動恢複功能 --&gt;

&lt;name&gt;yarn.resourcemanager.recovery.enabled&lt;/name&gt;

&lt;!--配置與zookeeper的連接配接位址 --&gt;

&lt;name&gt;yarn.resourcemanager.zk-state-store.address&lt;/name&gt;

&lt;name&gt;yarn.resourcemanager.store.class&lt;/name&gt;

&lt;value&gt;org.apache.hadoop.yarn.server.resourcemanager.recovery.zkrmstatestore&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.zk-address&lt;/name&gt;

&lt;name&gt;yarn.resourcemanager.cluster-id&lt;/name&gt;

&lt;value&gt;cluster1-yarn&lt;/value&gt;

&lt;!--schelduler失聯等待連接配接時間 --&gt;

&lt;name&gt;yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms&lt;/name&gt;

&lt;value&gt;5000&lt;/value&gt;

&lt;!--配置rm1 --&gt;

&lt;name&gt;yarn.resourcemanager.address.rm1&lt;/name&gt;

&lt;value&gt;nna:8132&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.scheduler.address.rm1&lt;/name&gt;

&lt;value&gt;nna:8130&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.webapp.address.rm1&lt;/name&gt;

&lt;value&gt;nna:8188&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.resource-tracker.address.rm1&lt;/name&gt;

&lt;value&gt;nna:8131&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.admin.address.rm1&lt;/name&gt;

&lt;value&gt;nna:8033&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.ha.admin.address.rm1&lt;/name&gt;

&lt;value&gt;nna:23142&lt;/value&gt;

&lt;!--配置rm2 --&gt;

&lt;name&gt;yarn.resourcemanager.address.rm2&lt;/name&gt;

&lt;value&gt;nns:8132&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.scheduler.address.rm2&lt;/name&gt;

&lt;value&gt;nns:8130&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.webapp.address.rm2&lt;/name&gt;

&lt;value&gt;nns:8188&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.resource-tracker.address.rm2&lt;/name&gt;

&lt;value&gt;nns:8131&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.admin.address.rm2&lt;/name&gt;

&lt;value&gt;nns:8033&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.ha.admin.address.rm2&lt;/name&gt;

&lt;value&gt;nns:23142&lt;/value&gt;

&lt;name&gt;yarn.nodemanager.aux-services&lt;/name&gt;

&lt;value&gt;mapreduce_shuffle&lt;/value&gt;

&lt;name&gt;yarn.nodemanager.aux-services.mapreduce.shuffle.class&lt;/name&gt;

&lt;value&gt;org.apache.hadoop.mapred.shufflehandler&lt;/value&gt;

&lt;name&gt;yarn.nodemanager.local-dirs&lt;/name&gt;

&lt;value&gt;/home/hadoop/data/yarn/local&lt;/value&gt;

&lt;name&gt;yarn.nodemanager.log-dirs&lt;/name&gt;

&lt;value&gt;/home/hadoop/log/yarn&lt;/value&gt;

&lt;name&gt;mapreduce.shuffle.port&lt;/name&gt;

&lt;value&gt;23080&lt;/value&gt;

&lt;!--故障處理類 --&gt;

&lt;name&gt;yarn.client.failover-proxy-provider&lt;/name&gt;

&lt;value&gt;org.apache.hadoop.yarn.client.configuredrmfailoverproxyprovider&lt;/value&gt;

&lt;name&gt;yarn.resourcemanager.ha.automatic-failover.zk-base-path&lt;/name&gt;

&lt;value&gt;/yarn-leader-election&lt;/value&gt;

hadoop-env.sh

# the java implementation to use.

yarn-env.sh

# some java parameters

2.12slave

  修改hadoop安裝目錄下的slave檔案:

  由于我們配置了qjm,是以我們需要先啟動qjm的服務,啟動順序如下所示:

進入到dn節點,啟動zk的服務:zkserver.sh start,之後可以輸入zkserver.sh status檢視啟動狀态,本次我們配置了三個dn節點,會出現一個leader和兩個follower。輸入jps,會顯示啟動程序:quorumpeermain

在nn節點上(選一台即可,這裡我選擇的是一台預nna節點),然後啟動journalnode服務,指令如下:hadoop-daemons.sh start journalnode。或者單獨進入到每個dn輸入啟動指令:hadoop-daemon.sh start journalnode。輸入jps顯示啟動程序:journalnode。

接着若是配置後,我們首次啟動,需要格式化hdfs,指令如下:hadoop namenode –format。

之後我們需要格式化zk,指令如下:hdfs zkfc –formatzk。

接着我們啟動hdfs和yarn,指令如下:start-dfs.sh和start-yarn.sh,我們在nna輸入jps檢視程序,顯示如下:dfszkfailovercontroller,namenode,resourcemanager。

接着我們在nns輸入jps檢視,發現隻有dfszkfailovercontroller程序,這裡我們需要手動啟動nns上的namenode和resourcemanager程序,指令如下:hadoop-daemon.sh start namenode和yarn-daemon.sh start resourcemanager。需要注意的是,在nns上的yarn-site.xml中,需要配置指向nns,屬性配置為rm2,在nna中配置的是rm1。

最後我們需要同步nna節點的中繼資料,指令如下:hdfs namenode –bootstrapstandby,若執行正常,日志最後顯示如下資訊:

15/02/21 10:30:59 info common.storage: storage directory /home/hadoop/data/dfs/name has been successfully formatted.

15/02/21 10:30:59 warn common.util: path /home/hadoop/data/dfs/name should be specified as a uri in configuration files. please update hdfs configuration.

15/02/21 10:31:00 info namenode.transferfsimage: opening connection to http://nna:50070/imagetransfer?getimage=1&amp;txid=0&amp;storageinfo=-60:1079068934:0:cid-1dd0c11e-b27e-4651-aad6-73bc7dd820bd

15/02/21 10:31:01 info namenode.transferfsimage: image transfer timeout configured to 60000 milliseconds

15/02/21 10:31:01 info namenode.transferfsimage: transfer took 0.01s at 0.00 kb/s

15/02/21 10:31:01 info namenode.transferfsimage: downloaded file fsimage.ckpt_0000000000000000000 size 353 bytes.

15/02/21 10:31:01 info util.exitutil: exiting with status 0

15/02/21 10:31:01 info namenode.namenode: shutdown_msg: /************************************************************ shutdown_msg: shutting down namenode at nns/10.211.55.13 ************************************************************/

  由于我配置的是自動切換,若nna節點宕掉,nns節點會立即由standby狀态切換為active狀态。若是配置的手動狀态,可以輸入如下指令進行人工切換:

hdfs haadmin -failover --forcefence --forceactive nna nns

  這條指令的意思是,将nna變成standby,nns變成active。而且手動狀态下需要重新開機服務。

配置高可用的Hadoop平台配置高可用的Hadoop平台
配置高可用的Hadoop平台配置高可用的Hadoop平台
配置高可用的Hadoop平台配置高可用的Hadoop平台
配置高可用的Hadoop平台配置高可用的Hadoop平台

  這篇文章就贅述到這裡,若在配置過程中有什麼疑問或問題,可以加入qq群讨論或發送郵件給我,我會盡我所能為您解答,與君共勉!

----------------------------------------------------------------------------------------------------------------------------