Hadoop-2.6.0 + Zookeeper-3.4.6 + HBase-0.98.9-hadoop2環境搭建示例

Morven.Huang發表於2015-02-07

1    基本資訊

1.1     軟體資訊

hadoop-2.6.0

zookeeper-3.4.6

hbase-0.98.9-hadoop2

(以下示例中使用的作業系統是Centos 6.5,請將下載的3個tar包分別解壓並放置在/usr/local/目錄下)

(Hbase包中lib裡可以看到zookeeper的jar包,從檔名可以確定使用的zookeeper版本)

1.2     叢集組成:

Server Name

Hadoop Cluster

Zookeeper Ensemble

HBase Cluster

hadoopnamenode

Name node & Resource manager

Master

hadoop2ndnamenode

Secondary name node

 

hadoopdatanode1

Data node & Node manager

Region server

hadoopdatanode2

Data node & Node manager

 

Region server

hadoopdatanode3

Data node & Node manager

 

Region server

 

2    Hadoop叢集

2.1     配置

2.1.1      core-site.xml

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoopnamenode:9000</value>
</property>
</configuration> 

2.1.2      hdfs-site.xml

<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/root/hadoopdata/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/root/hadoopdata/datanode</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop2ndnamenode:9001</value>
</property>
</configuration> 

2.1.3      mapred-site.xml

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

2.1.4      yarn-site.xml

<configuration>
<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.resourcemanager.resource-tracker.address</name>
<value>hadoopnamenode:8025</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoopnamenode:8030</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoopnamenode:8040</value>
</property>
</configuration>

2.1.5      slaves

hadoopdatanode1
hadoopdatanode2
hadoopdatanode3

2.1.6      /etc/hosts

153.65.170.45   hadoopnamenode.mh.com   hadoopnamenode
153.65.171.174  hadoop2ndnamenode.mh.com   hadoop2ndnamenode
153.65.171.20  hadoopdatanode1.mh.com   hadoopdatanode1
153.65.170.204  hadoopdatanode2.mh.com   hadoopdatanode2
153.65.170.85  hadoopdatanode3.mh.com   hadoopdatanode3

2.1.7      ~/.bashrc

與上一篇部落格介紹的Hadoop 1類似,為了方便起見,修改.bashrc設定環境變數,注意sbin最好也要加到path中:

export HADOOP_PREFIX=/usr/local/hadoop-2.6.0
export HADOOP_MAPRED_PREFIX=$HADOOP_PREFIX
export HADOOP_HDFS_PREFIX=$HADOOP_PREFIX
export HADOOP_YARN_PREFIX=$HADOOP_PREFIX
export PATH=$PATH:$HADOOP_PREFIX/bin
export PATH=$PATH:$HADOOP_PREFIX/sbin

2.1.8      分發到叢集的其它機器

把hadoop-2.6.0資料夾連同修改後的配置檔案以及hosts檔案,通過scp拷貝到其它四臺機器上。

(並沒有要求說所有的機器上都使用一樣的配置檔案,比如namenode的hdfs-site.xml應該是不需要dfs.datanode.data.dir配置,而datanode的hdfs-site.xml應該不需要dfs.namenode.name.dir配置。而也只有namenode上需要配置slaves檔案。這裡是為了簡單起見,我們讓所有機器上都保持一樣的配置)

2.1.9      設定ssh免密碼訪問

參見上一篇部落格。

2.1.10   一些配置引數的解釋

Hadoop 2中沒有mapred.job.tracker了,新框架中已改為yarn-site.xml 中的 resouceManager 及 nodeManager具體配置項,新框架中歷史 job 的查詢已從Job tracker剝離,歸入單獨的mapreduce.jobtracker.jobhistory 相關配置。

yarn.resourcemanager.address---NodeManager 與 RM 通訊的介面地址

yarn.resourcemanager.scheduler.address---NodeManger 需要知道 RM 主機的 scheduler 排程服務介面地址

yarn.resourcemanager.resource-tracker.address---NodeManager 需要向 RM 報告任務執行狀態供 Resouce 跟蹤,因此 NodeManager 節點主機需要知道 RM 主機的 tracker 介面地址

yarn.resourcemanager.webapp.address---各個 task 的資源排程及執行狀況通過通過該 web 介面訪問

2.2     建立目錄

在namenode上建立: /root/hadoopdata/namenode

在3臺datanode上建立: /root/hadoopdata/datanode

(也可以讓hadoop自動建立) 

2.3     啟動/關閉

start-dfs.sh,執行之後,使用jps命令檢視java程式情況:

hadoopnamenode上有namenode程式,

hadoop2ndnamenode上有secondarynamenode程式,

hadoopdatanode1, hadoopdatanode2, hadoopdatanode3上有datanode程式

 

start-yarn.sh,執行之後的java程式情況:

hadoopnamenode上有namenode, resourcemanager程式,

hadoop2ndnamenode上有secondarynamenode程式,

hadoopdatanode1, hadoopdatanode2, hadoopdatanode3上有datanode, nodemanager程式

 

關閉的命令對應的是stop-dfs.sh, stop-yarn.sh

2.4     測試

hdfs dfsadmin -report //檢視hdfs的一些基本資訊

yarn node –list //檢視yarn的一些基本資訊

可以使用hadoop的share目錄下的一些mapreduce示例程式進行測試,比如wordcount:

先使用copyFromLocal命令(後續有介紹用法)把一個本地文字檔案放到hdfs的/book目錄下,然後執行:

hadoop jar /usr/local/hadoop-2.6.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount   /book   /out2

即對/book目錄下的書進行單詞統計,然後輸出到/out2目錄。

 

可以登入web介面檢查hadoop是否執行正常:

hdfs管理介面同hadoop 1: http://hadoopnamenode:50070/ 

yarn的管理介面不再是原來的50030埠,而是http://hadoopnamenode:8088/

2.5     注意事項

若namenode上的core-site.xml中的fs.defaultFS缺失,則啟動時會報錯。

 

若各機器上的yarn-site.xml中的yarn.resourcemanager.resource-tracker.address缺失,雖然resourcemanager與nodemanager程式能夠正常啟動,但是在執行yarn node -list會出現node數量為0的情況。

 

若各機器上的yarn-site.xml中的yarn.resourcemanager.scheduler.address或yarn.resourcemanager.address缺失,則在執行job時,會卡在INFO mapreduce.Job: Job job_1422695884569_0001 running in uber mode : false

2.6     幾個Hadoop fs shell命令

hadoop fs -ls / ---列出hdfs根目錄下的檔案、目錄

hadoop fs -ls /out2 ---列出out2目錄下的檔案、目錄

hadoop fs -lsr / ---遞迴顯示檔案

hadoop fs -cat /out2/part-r-00000 ---打出檔案內容

hadoop dfs -copyFromLocal  <local_FS_filename> <target_on_HDFS>

hadoop fs -du hdfs://namenodehost/user/hadoop ---檢視目錄大小

hadoop fs -rm /user/hadoop/file ---刪除檔案或空目錄

hadoop fs -rmr /user/hadoop/dir ---刪除檔案或目錄,遞迴之意

hafoop fs -tail /user/hadoop/sales.dat ---檢視檔案內容

注1:

dfs was deprecated in favor of "fs" command.

所以原來的hadoop dfs -copyFromLocal  <local_FS_filename> <target_on_HDFS>,現在的寫法是

hadoop fs -copyFromLocal  <local_FS_filename> <target_on_HDFS>

注2:

hadoop fs -copyFromLocal /root/Downloads/small/war_and_peace.txt /test 這樣生成的test是檔案,而不是資料夾

所以一般hadoop fs -copyFromLocal /root/Downloads/small  /test,這樣small下的檔案會被copy到test資料夾下

又或者hadoop fs -copyFromLocal /root/Downloads/small/war_and_peace.txt /test4/,注意最後的/,前提是要用hadoop fs -mkdir先建立出test4目錄

 

3    Zookeeper叢集

3.1     配置

3.1.1      zoo.cfg

tickTime=2000
dataDir=/root/zookeeperdata
clientPort=2181
initLimit=5
syncLimit=2
server.1=hadoopnamenode:2888:3888
server.2=hadoop2ndnamenode:2888:3888
server.3=hadoopdatanode1:2888:3888

3.1.2      分發到叢集的其它機器

把zookeeper資料夾連同修改後的配置檔案通過scp拷貝到另外兩臺機器(hadoop2ndnamenode, hadoopdatanode)上。

3.1.3      設定myid

hadoopnameonde上echo”1” > /root/zookeeperdata/myid

hadoop2ndnamenode上echo “2” > /root/zookeeperdata/myid

hadoopdatanode上echo”3” > /root/zookeeperdata/myid

3.1.4      一些配置引數的解釋

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

dataDir :儲存資料資訊的本地目錄。 

3.2     建立目錄

在hadoopnamenode, hadoop2ndnamenode, hadoopdatanode1上建立dataDir中配置的目錄/root/zookeeperdata。

3.3     啟動/關閉

{ZOOKEEPER_HOME} /bin/zkServer.sh start

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

關閉:{ZOOKEEPER_HOME} /bin/zkServer.sh stop

3.4     測試

{ZOOKEEPER_HOME} /bin/zkServer.sh status

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

[root@hadoopnamenode 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

 

[root@hadoop2ndnamenode 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

 

[root@hadoopdatanode1 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.sh status檢視狀態則顯示Error contacting service. It is probably not running。

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

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

這裡面有兩個常見的疑問:

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

2) 當5臺server關閉三臺時,剩下兩臺,為什麼不能像1)中一樣仍然正常工作?

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

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

 

4    Hbase叢集

4.1     配置

4.1.1      hbase-env.sh

其它不變,export HBASE_MANAGES_ZK=false,這表示不使用hbase自帶的zookeeper,而使用外部的zookeeper(這裡指我們在上面建的zookeeper)

4.1.2      hbase-site.xml

<configuration>
<property>
 <name>hbase.rootdir</name>
 <value>hdfs://hadoopnamenode:9000/hbase</value>
 <description>The directory shared by region servers.</description>
</property>
<property>
 <name>hbase.zookeeper.property.clientPort</name>
 <value>2181</value>
 <description>Property from ZooKeeper's config zoo.cfg. The port at which the clients will connect.
 </description>
</property>
<property>
 <name>zookeeper.session.timeout</name>
 <value>120000</value>
</property>
<property>
 <name>hbase.zookeeper.quorum</name>
 <value>hadoopnamenode,hadoop2ndnamenode,hadoopdatanode1</value>
</property>
<property>
 <name>hbase.tmp.dir</name>
 <value>/root/hbasedata</value>
</property>
<property>
 <name>hbase.cluster.distributed</name>
 <value>true</value>
</property>
</configuration>

4.1.3      regionservers

hadoopdatanode1
hadoopdatanode2
hadoopdatanode3

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,列出zookeepr ensemble中的servers

4.2     啟動/關閉

bin/start-hbase.sh

bin/stop-hbase.sh

4.3     測試

在hadoopnamenode上執行

{HBASE_HOME}/bin/hbase shell

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

 

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

Configuration config = HBaseConfiguration.create();
config.set( "hbase.zookeeper.quorum", "hadoopnamenode,hadoop2ndnamenode,hadoopdatanode1" );
config.set( "hbase.zookeeper.property.clientport", "2181" );
//config.set("zookeeper.znode.parent", "/hbase-unsecure"); // this is what most people miss :) 
HBaseAdmin.checkHBaseAvailable( config );
HTable    t    = new HTable( config, "test" );
Scan    s    = new Scan();
//s.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("name")); 
ResultScanner rs = t.getScanner( s );
try{
    for ( Result r : rs )
    {
        for ( Cell cell : r.rawCells() )
        {
            System.out.println( "RowName:" + new String( CellUtil.cloneRow( cell ) ) + " " );
            System.out.println( "Timetamp:" + cell.getTimestamp() + " " );
            System.out.println( "column Family:" + new String( CellUtil.cloneFamily( cell ) ) + " " );
            System.out.println( "row Name:" + new String( CellUtil.cloneQualifier( cell ) ) + " " );
            System.out.println( "value:" + new String( CellUtil.cloneValue( cell ) ) + " " );
        }
    }
} finally {
    t.close();
}

System.out.println( "Done!" );

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

4.4     注意事項

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

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

需要注意的是,如果要禁止啟動hbase自帶的zookeeper,那麼,不僅僅需要剛才的export HBASE_MANAGES_ZK=false配置,還需要hdfs-site.xml中的hbase.cluster.distributed為true,否則你在啟動時會遇到Could not 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即可.

 


送書了,送書了,關注公眾號“程式設計師雜書館”,送出O'Reilly《Spark快速大資料分析》紙質書(亦有一批PDF分享)! —— 2018年12月