Hadoop2.5.2+Zookeeper3.4.6 + HBase0.98.8-hadoop2環境搭建

本人在工作過程中需要Nutch2.3,基於hadoop的爬蟲,準備用Hbase存儲爬取的數據,於是研究並記錄了Hadoop2.5.2+Zookeeper3.4.6+HBase0.98.8-hadoop2環境搭建,花費了很多加班時間啊,廢話不多說,直接上實戰乾貨。記錄在雲筆記中,可能有點亂,大家擔待下,最好用電腦看啊。


先給個目錄截圖(參考)

1.Hadoop集群

參考之前我的hadoop集群搭建系列文章:

Hadoop2.5.2分散式集群搭建(一)基本環境搭建(虛擬機)

Hadoop2.5.2分散式集群搭建(二)Hadoop部署配置

2.Zookeeper集群

3.1 配置

3.1.1 首先編輯zoo.cfg配置文件

Advertisements

# cd /usr/local/# tar -zxvf zookeeper-3.4.6.tar.gz # cd zookeeper-3.4.6# cp conf/zoo_sample.cfg conf/zoo.cfg# vim conf/zoo.cfgtickTime=2000 dataDir=/usr/local/zookeeper-3.4.6/dataclientPort=2181initLimit=5syncLimit=2server.1=Hmaster:2888:3888server.2=Hslave1:2888:3888server.3=Hslave2:2888:3888

3.1.2 降配置文件一一分發到集群的其它伺服器

Advertisements

把zookeeper文件夾連同修改後的配置文件通過scp拷貝到另外兩台機器(Hslave1, Hslave2)上。

# cd /usr/local

# scp -r zookeeper-3.4.6 [email protected]:/usr/local

# scp -r zookeeper-3.4.6 [email protected]:/usr/local

3.1.3 設置好每天機器的myid(這是身份唯一標識)

首先創建各自的目錄

在Hmaster, Hslave1,Hslave2上創建dataDir中配置的目錄/usr/local/zookeeper-3.4.6/data。

// 先創建目錄

# mkdir /usr/local/zookeeper-3.4.6/data

// Hmaster

# echo "1" > /usr/local/zookeeper-3.4.6/data/myid

// Hslave1

# echo "2" > /usr/local/zookeeper-3.4.6/data/myid

// Hslave2

# echo "3" > /usr/local/zookeeper-3.4.6/data/myid

3.1.4 一些配置參數英語名詞的解釋

tickTime:心跳時間,單位毫秒。同時tickTime又是zookeeper中的基本單位,比如後面的initLimit=5就是指5個tickTime時間,在這裡是10秒。

dataDir :存儲數據信息的本地目錄。

3.2 啟動/關閉服務命令

{ZOOKEEPER_HOME} /bin/zkServer.sh start

啟動和關閉命令必須到zookeeper集群的每個機器上,沒有像start-dfs.sh那樣的命令可以一下子把整個集群啟動。

3.3 然後啟動日誌的分析

你可能會可能出現如下情況

由於ZooKeeper集群啟動的時候,每個結點都試圖去連接集群中的其它結點,先啟動的肯定連不上後面還沒啟動的,所以上面日誌前面部分的異常是可以忽略的。通過最後面部分可以看到,集群選出了一個最終Leader后,運行穩定。如果其他結點可能也出現類似問題,這都屬於正常情況。

3.4 命令測試驗證

{ZOOKEEPER_HOME} /bin/zkServer.sh status

以下是結果示例,你們可以看到各機器的角色是follower還是leader。

[[email protected] zookeeper-3.4.6]# jps

2118 Jps

2013 QuorumPeerMain

[[email protected] zookeeper-3.4.6]# bin/zkServer.sh status

JMX enabled by default

Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg

Mode: follower

[[email protected] zookeeper-3.4.6]# bin/zkServer.sh status

JMX enabled by default

Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg

Mode: leader

[[email protected] zookeeper-3.4.6]# bin/zkServer.sh status

JMX enabled by default

Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg

Mode: follower

3.5 過程中一些注意事項

對於一個包含3台server的Zookeeper集群,最多容許關閉一台(如果被關閉的是leader,則會重新選舉出一個)。如果關閉兩台,則剩下那台雖然進程QuorumPeerMain還在,但zkServer.shstatus查看狀態則顯示Error contacting service. It is probably notrunning。

對於一個包含5台server的Zookeeper集群,最多容許關閉兩台。關閉三台,則剩下兩台雖然進程QuorumPeerMain還在,但也顯示同樣的錯誤。

(如果這個時候用Java程序去連接Hbase,則會提示:org.apache.hadoop.hbase.ZooKeeperConnectionException:Can't connect to ZooKeeper)

通常情況這裡會出現有兩個常見的疑問:

1) 當3台server關閉一台時,只剩下兩台時,無法形成majority,那麼它是如何選舉出leader的?

2) 當5台server關閉三台時,剩下兩台,為什麼不能像第一種情況中一樣正常工作?

這兩個問題的答案是同一個,Zookeeper中的所謂majorityvoting機制,其majority是針對原始的server數量,不是指變化后的數量,這個原始的數量即你配置在zoo.cfg中的server個數。

還有一個常見的問題是為什麼推薦使用奇數個Zookeeperserver,那是因為3個server與4個server能夠提供的可靠性是一樣的,3台server的集群允許其中一台server宕機,而4台server的集群也只能容許其中一台server宕機,因為如果兩台server宕機,那麼剩下兩台,對比於原來的4台,2/4不夠成大多數。

4.Hbase集群

4.1 配置

4.1.1 配置hbase-env.sh

配置JAVA_HOME和pids目錄,exportHBASE_MANAGES_ZK=false,這表示不使用hbase自帶的zookeeper,而使用外部的zookeeper(這裡指我們在上面建的zookeeper)

# The java implementation to use. Java 1.6 required.

export JAVA_HOME=/usr/java/default

...

# The directory where pid files are stored. /tmp by default.盡量不要用默認的tmp

export HBASE_PID_DIR=/usr/local/hbase-0.98.8/pids

...

# Tell HBase whether it should manage it's own instance ofZookeeper or not.

export HBASE_MANAGES_ZK=false

4.1.2 hbase-site.xml

4.1.3 regionservers

Hslave1Hslave2Hslave3

4.1.4 一些配置參數的解釋

hbase.zookeeper.property.clientPort:指定zk的連接埠

zookeeper.session.timeout:RegionServer與Zookeeper間的連接超時時間。當超時時間到后,ReigonServer會被Zookeeper從RS集群清單中移除,HMaster收到移除通知后,會對這台server負責的regions重新balance,讓其他存活的RegionServer接管.

hbase.zookeeper.quorum:默認值是 localhost,列出zookeeprensemble中的servers

4.1.5 Hbase分發到集群的其它機器

將Hbase目錄分發到Hsalve1,Hslave2,Hslave3上

# cd /usr/local

# scp -r hbase-0.98.8 [email protected]:/usr/local

# scp -r hbase-0.98.8 [email protected]:/usr/local

# scp -r hbase-0.98.8 [email protected]:/usr/local

4.2 啟動/關閉

bin/start-hbase.sh

bin/stop-hbase.sh

4.3 測試的方法

在Hmaster上執行

{HBASE_HOME}/bin/hbase shell

進入shell命令行,通過創建表等操作來檢查不是不工作正常。

或者通過一個簡單的Java程序來測試:

注意,java測試程序所在機器的hosts文件,注意必須有全FDQN(fully qualified domain name,參見上面linux中的hosts文件),否則有java訪問時會提示找不到Hmaster.mh.com

4.4 注意事項

HBase集群需要依賴於一個Zookeeperensemble。HBase集群中的所有節點以及要訪問HBase的客戶端都需要能夠訪問到該Zookeeperensemble。HBase自帶了Zookeeper,但為了方便其他應用程序使用Zookeeper,最好使用單獨安裝的Zookeeperensemble。

此外,Zookeeper ensemble一般配置為奇數個節點,並且Hadoop集群、Zookeeperensemble、HBase集群是三個互相獨立的集群,並不需要部署在相同的物理節點上,他們之間是通過網路通信的。

需要注意的是,如果要禁止啟動hbase自帶的zookeeper,那麼,不僅僅需要剛才的exportHBASE_MANAGES_ZK=false配置,還需要hdfs-site.xml中的hbase.cluster.distributed為true,否則你在啟動時會遇到Couldnot start ZK at requested port of 2181錯誤,這是因為hbase嘗試啟動自帶的zookeeper,而我們已經啟動了自己安裝的那個zookeeper,默認都使用2181埠,所以出錯。

還有,有時候會遇到stop-hbase.sh執行很長時間未結束,很可能的原因是你之前把zookeeper關閉了.

最後,Hbase不需要mapreduce,所以只要start-dfs.sh啟動hdfs,然後到zookeeper各節點上啟動zookeeper,最後再hbase-start.sh啟動hbase即可.

4.5 遇到的問題

HBbase 0.98.8啟動后,zookeeper集群獨立,沒有被Hbase管控,

1.啟動時查看主控節點的日誌hbase-hadoop-master-master.log,其中的報錯如下,

NotServingRegionException: Region hbase:meta,,1 is not onlineHslave2...

2017-11-13 15:16:32,003 INFO [master:Hmaster:60000] catalog.CatalogTracker: Failed verification of hbase:meta,,1 at address=Hslave2,60020,1510556718821, exception=org.apache.hadoop.hbase.NotServingRegionException: org.apache.hadoop.hbase.NotServingRegionException: Region hbase:meta,,1 is not online on Hslave2,60020,1510557380354at org.apache.hadoop.hbase.regionserver.HRegionServer.getRegionByEncodedName(HRegionServer.java:2776)at org.apache.hadoop.hbase.regionserver.HRegionServer.getRegion(HRegionServer.java:4333)at org.apache.hadoop.hbase.regionserver.HRegionServer.getRegionInfo(HRegionServer.java:3676)at org.apache.hadoop.hbase.protobuf.generated.AdminProtos$AdminService$2.callBlockingMethod(AdminProtos.java:20158)at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2027)at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:108)at org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:110)at org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:90)at java.lang.Thread.run(Thread.java:745)

或者

2.啟動hbase時,hmaster啟動后又消失了,且hin/base shell后,list執行報錯"ERROR:can'tget master address from ZooKeeper; znode data == null"

一般認為是,停止Hbase服務時導致zookeeper的meta數據丟失或損毀所致,解決辦法為,先停止HBase服務,再停止ZooKeeper服務,然後把zookeeper的每個節點的zoo.cfg配置文件指定的dataDir=/hadoop/zookeeper-data目錄的文件rm清除掉,然後重啟zookeeper,再重啟hbase,接著去觀察hbase主節點日誌hbase-hadoop-master-master.log日誌文件,發現一切正常時問題已經得到了解決。

Advertisements

你可能會喜歡