Hbase集羣部署

前要說明

1.集羣說明

Hbase在完全分佈式環境下,由Master進程負責管理RegionServers集羣的負載均衡以及資源分配,ZooKeeper負責集羣元數據的維護並且監控集羣的狀態以防止單點故障,每個RegionServer會負責具體數據塊的讀寫,HBase所有的數據存儲在HDSF系統上。

 

master slaver1 slaver2 slaver3 master1主機名(需要現有的主機名替換)

 

2.版本說明

版本:當前Ubuntu系統,jdk1.7.0_55

Hadoop選的最新穩定版:hadoop-2.7.3  t:16.8.26

Zookeeper選的最新穩定版:zookeeper-3.4.10  t:16.9.3

Hbase最新穩定版:hbase-1.2.5  t:16.10.26

理論上說,這是套系統,從時間更新的情況看也是這樣,但是具體是否兼容或有問題得實際搭建看情況。

附加:CDH版本,目前主流生產環境都用這個,連網的情況,只需下個客戶端,其他自動給配置,問題相對少很多,基本功能免費,高級功能收費。但是一般情況基本功能就可以,選擇的換肯定是CDH5,但是具體哪個5點幾沒有研究過(理論上說應該都可以)

3.所有服務器環境配置說明

1.基本要求,爲方便配置要求所有機器的所有安裝路徑文件路徑及用戶名

解壓命令

tar zxvf jdk-7u80-linux-x64.tar.gz 解壓jdk

tar zxvf zookeeper-3.4.10.tar.gz 解壓zk

tar zxvf hadoop-2.7.3.tar.gz 解壓hadoop

tar zxvf hbase-1.2.5-bin.tar.gz 解壓hbase

 

安裝順序jdk,zk,hadoop,hbase

啓動順序zk,hadoop,hbase

關閉順序hbase,hadoop,zk

2.修改/etc/profile文件

即添加環境變量

在最後添加如下內容:

#java

export JAVA_HOME=/home/hadoop/jdk1.7.0_80

export PATH=$JAVA_HOME/bin:$PATH

 

#zk

export ZOOKEEPER=/home/hadoop/zookeeper-3.4.10

export PATH=$ZOOKEEPER/bin:$PATH

#hadoop

export HADOOP_HOME=/home/hadoop/hadoop-2.7.3

export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

#hbase

export HBASE_HOME=/home/hadoop/hbase-1.2.5

export PATH=$HBASE_HOME/bin:$PATH

 

執行source /etc/profile是環境變量生效

 

如果使用export PATH=$PATH: $JAVA_HOME/bin需切換jdk版本

$ sudo update-alternatives –install /usr/bin/javah javah /home/hadoop/jdk1.7.0_80/bin/javah
$ sudo update-alternatives –install /usr/bin/javac javac/home/hadoop/jdk1.7.0_80/bin/javac

$ sudo update-alternatives –install /usr/bin/javaws javaws /home/hadoop/jdk1.7.0_80/bin/javaws
$ sudo update-alternatives –install /usr/bin/java java /home/hadoop/jdk1.7.0_80/bin/java
$ sudo update-alternatives –install /usr/bin/jar jar/home/hadoop/jdk1.7.0_80/bin/jar

$ sudo update-alternatives –config java
$ sudo update-alternatives –config javac
$ sudo update-alternatives –config javah
$ sudo update-alternatives –config jar

 

3 配置host 

配置所有機器主機名及ip地址

修改/etc/hosts 

將127的ip全部用#注掉

並添加下面內容:

192.168.1.171          master

192.168.1.172          slaver1

192.168.1.173    slaver2

192.168.1.174    slaver3

192.168.1.175    master1

4建立ssh無密碼登錄 

 爲了方便起見,所有機器都爲無密碼訪問:

https://blog.csdn.net/dawn_rainbow/article/details/83746525

Zookeeper集羣部署:

1)創建配置文件conf/zoo.cfg

mv zoo_sample.cfg zoo.cfg 

2)更改conf/zoo.cfg的內容

# ZK中的一個時間單元。ZK中所有時間都是以這個時間單元爲基礎,進行整數倍配置的

tickTime=2000 

#Leader-Follower初始通信時限, Follower在啓動過程中,會從Leader同步所有最新數據,然後確定自己能夠對外服務的起始狀態。Leader允許Follower initLimit 時間(10*tickTime)內完成這個工作

initLimit=10 

#Leader-Follower同步通信時限,在運行過程中,Leader負責與ZK集羣中所有機器進行通信,例如通過一些心跳檢測機制,來檢測機器的存活狀態。如果L發出心跳包在syncLimit(2*tickTime)之後,還沒有從F那裏收到響應,那麼就認爲這個F已經不在線了。注意:不要把這個參數設置得過大,否則可能會掩蓋一些問題

syncLimit=2 

#存儲快照文件snapshot的目錄。默認情況下,事務日誌也會存儲在這裏。建議同時配置參數dataLogDir, 事務日誌的寫性能直接影響zk性能(在啓動zk前要建好這個目錄)

dataDir= /home/hadoop/data/zookeeper

#客戶端連接端口

clientPort=2181

#服務器名稱與地址:集羣信息(服務器編號,服務器地址,LF通信端口,選舉端口)必須爲奇數個服務器(本機用0.0.0.0

server.1=master:2888:3888

server.2=slave1:2888:3888

server.3=slave2:2888:3888

server.4=slave3:2888:3888

server.5=master1:2888:3888

3)更改conf/log4j.properties的內容

第4行

zookeeper.log.dir=/home/hadoop/logs/zookeeper/

第6行

zookeeper.log.threshold=INFO

第7行

zookeeper.tracelog.dir=/home/hadoop/logs/zookeeper/

4)更改bin/ zkEnv.sh

第56行

ZOO_LOG_DIR="/home/hadoop/logs/zookeeper/"

5)拷貝zookeeper到每臺機器

相關命令建文檔開頭

6)在每臺的機器的dataDir目錄下,新建文件myid,輸入對應的編號

新建文件:touch myid

即server.X後面的X

7)啓動zookeeper

如配置環境變量直接執行如下命令,若沒有配置需進到zookeeper安裝文檔下的bin目錄

每臺機器都需要啓動

zkServer.sh start  

剛起來的時候會報錯,全部機器都起來後,就不會報錯了

8)測試

Java代碼

zkServer.sh status

出現:

ModeleaderModefollower

證明啓動成功

 

Hadoop(hdfs)集羣部署:

1.修改etc/hadoop/hadoop-env.sh

修改如下內容:

第25行修改jdk路徑

export JAVA_HOME=/home/hadoop/jdk1.7.0_80

第72行去掉#,並修改日誌地址

export HADOOP_LOG_DIR=/home/hadoop/logs/hadoop

2.修改etc/hadoop/core-site.xml, 

在<configuration>標籤中添加如下內容:

<property>

        <name>fs.defaultFS</name>

        <value>hdfs://myHadoop</value>

                   <description>表示hdfs路徑的邏輯名稱hadoop 2.x以後叫fs.defaultFS </description>

         </property>

        

         <property>

        <name>hadoop.tmp.dir</name>

        <value>/home/hadoop/hdfs/tmp</value>

        <description>表示hadoop存放數據的目錄,即包括NameNode的數據,

                   也包括DataNode的數據。該路徑任意指定,只要實際存在該文件夾即可</description>

         </property>

         <property>

      <name>ha.zookeeper.quorum</name>

      <value>master:2181,master1:2181,slave1:2181,slave2:2181,slave3:2181</value>

         </property>

3.修改etc/hadoop/hdfs-site.xml

在<configuration>標籤中添加如下內容:

<!--指定hdfs默認副本數,默認3 -->

         <property>

                   <name>dfs.replication</name>

                   <value>2</value>

         </property>

         <!--指定hdfsnameservicens,需要和core-site.xml中的保持一致 -->

         <property>

                   <name>dfs.nameservices</name>

                   <value>myHadoop</value>

         </property>

         <!-- myHadoop下面有兩個NameNode,分別是h1,h2 -->

         <property>

                   <name>dfs.ha.namenodes.myHadoop</name>

                   <value>h1,h2</value>

         </property>

         <!-- h1RPC通信地址 -->

         <property>

                   <name>dfs.namenode.rpc-address.myHadoop.h1</name>

                   <value>master:9000</value>

         </property>

         <!-- h2RPC通信地址 -->

         <property>

                   <name>dfs.namenode.rpc-address.myHadoop.h2</name>

                   <value>master1:9000</value>

         </property>

         <!-- h1http通信地址 -->

         <property>

                   <name>dfs.namenode.http-address.myHadoop.h1</name>

                   <value>master:50070</value>

         </property>

         <!-- h2http通信地址 -->

         <property>

                   <name>dfs.namenode.http-address.myHadoop.h2</name>

                   <value>master1:50070</value>

         </property>

         <!-- 指定NameNode的元數據在JournalNode上的存放位置 -->

         <property>

                   <name>dfs.namenode.shared.edits.dir</name>

                   <value>qjournal://slave1:8485;slave2:8485;slave3:8485/myHadoop</value>

         </property>

         <!-- 開啓NameNode故障時自動切換 -->

    <property>

          <name>dfs.ha.automatic-failover.enabled</name>

          <value>true</value>

    </property>

         <!-- 配置失敗自動切換實現方式 -->

         <property>

                   <name>dfs.client.failover.proxy.provider.myHadoop</name>

                   <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

         </property>

         <!-- 配置隔離機制,如果ssh是默認22端口,value直接寫sshfence即可 -->

         <property>

                   <name>dfs.ha.fencing.methods</name>

                   <value>sshfence</value>

         </property>

        

         <!-- 使用隔離機制時需要ssh免登陸 -->

         <!--

         <property>

                   <name>dfs.ha.fencing.ssh.private-key-files</name>

                   <value>/home/hadoop/.ssh/id_rsa</value>

         </property>

         -->

         <!-- 指定JournalNode在本地磁盤存放數據的位置 -->

         <property>

                   <name>dfs.journalnode.edits.dir</name>

                   <value>/home/hadoop/data/journal</value>

         </property>

         <!-- h1h2上開啓WebHDFS (REST API)功能,不是必須 -->

    <property>

       <name>dfs.webhdfs.enabled</name>

       <value>true</value>

    </property>

         <!--  存貯在本地的名字節點數據鏡象的目錄,作爲名字節點的冗餘備份 -->

         <!--

         <property>

        <name>dfs.namenode.name.dir</name>

        <value>file://${hadoop.tmp.dir}/dfs/name</value>

    </property>

         -->

         <!-- 數據節點的塊本地存放目錄 -->

         <!--

    <property>

        <name>dfs.datanode.data.dir</name>

        <value>file://${hadoop.tmp.dir}/dfs/data</value>

    </property>

         -->

4.修改etc/hadoop/slaves,這個是所有datanode的機器 

slave1

slave2

slave3

6.修改etc/hadoop/log4j.properties

第19行

hadoop.log.dir=/home/hadoop/logs/hadoop

7.初始化hadoop 

將配置好的hadoop加壓文件拷貝到所有其他機器,

注:所有機器路徑必須一致用戶名一樣

如果已經配置文檔開頭的hadoop環境變量則可以在用戶的根目錄即/home/hadoop/下直接執行下面相關命令,若沒有配置環境變量只有進到hadoop安裝文檔下相應的sbin即bin目錄下執行

 

 

初始化hdfs文件:

1.在每個journalnode(即slave1,slave2,slave3)節點用如下命令啓動journalnode

sbin/hadoop-daemon.sh start journalnode

驗證:執行jps命令  出現JournalNode證明啓動成功

2.在主namenode(master)節點用格式化namenode

bin /hdfs namenode –format

3.在主namenode(master)節點啓動namenode進程

sbin /hadoop-daemon.sh start namenode

4.在備namenode(master1)節點執行命令

bin/hdfs namenode –bootstrapStandby

說明:這個是把備namenode節點的目錄格式化並把元數據從主namenode節點copy過來,並且這個命令不會把journalnode目錄再格式化了

5.啓動備namenode(master1)進程

sbin /hadoop-daemon.sh start namenode

驗證:執行jps命令  出現NameNode證明啓動成功

這時候,使用瀏覽器訪問 http://192.168.1.171:50070http://192.168.1.175:50070 。如果能夠看到兩個頁面,證明NameNode啓動成功了(本機C:\Windows\System32\drivers\etc\hosts必須添加192.168.1.171 master              192.168.1.175 master2   否則拒絕訪問)。這時,兩個NameNode的狀態都是standby

6.在其中一個namenode節點下格式化zk

bin/hdfs zkfc –formatZK

7.在兩個namenode節點都執行以下命令進行主NameNode選舉

sbin/hadoop-daemon.sh start zkfc

8.在所有datanode節點都執行以下命令啓動datanode

sbin/hadoop-daemon.sh start datanode

9.停止集羣命令

sbin/stop-dfs.sh

8.日常啓停命令

sbin/start-dfs.sh

sbin/stop-dfs.sh

Hbase集羣部署:

1.修改conf/hbase-env.sh

第28行

export JAVA_HOME=/home/hadoop/jdk1.7.0_80

第31行

export HADOOP_HOME=/home/hadoop/hadoop-2.7.3

第48行

export HBASE_LOG_DIR=/home/hadoop/logs/hbase

第129行

export HBASE_MANAGES_ZK=false

2.修改conf/hbase-site.xml

在<configuration>標籤下添加

<property>

    <name>hbase.rootdir</name>

    <value>hdfs://myHadoop/hbase</value>

    <description>設置 hbase 數據庫存放數據的目錄,這裏是放在hadoop hdfs,這裏要與hadoopcore-site.xml文件中的fs.defaultFS中的值一致,然後在後面添加自己的子目錄,我這裏定義是hbase</description>

  </property>

  <property>

    <name>hbase.cluster.distributed</name>

    <value>true</value>

    <description>打開 hbase 分佈模式</description>

  </property>

  <property>

    <name>hbase.master</name>

    <value>60000</value>

    <description>主備情況下只需要寫端口號,不必寫主機名</description>

  </property>

  <property> 

         <name>hbase.master.info.port</name> 

         <value>60010</value>

         <description>web界面訪問端口</description>

  </property>

  <property>

    <name>hbase.tmp.dir</name>

    <value>/home/hadoop/data/hbase</value>

    <description>hbase的一些臨時文件存放目錄。</description>

   </property>

  <property>

    <name>hbase.zookeeper.quorum</name>

    <value>master,slave1,slave2,slave3,master1</value>

    <description> 指定 zookeeper 集羣節點名 , 因爲是由 zookeeper 表決算法決定的</description>

  </property>

  <property>

    <name>hbase.zookeeper.property.clientPort</name>

    <value>2181</value>

   <description> 連接到zookeeper的端口,默認是2181</description>

  </property>

  <property>

         <name>hbase.zookeeper.property.dataDir</name>

         <value>/home/hadoop/data/zookeeper</value>

  </property>

  <property>

       <name>hbase.master.maxclockskew</name>

       <value>180000</value>

       <description>masterregionserver允許有3分鐘誤差</description>

 </property>

3.修改conf/regionservers

在regionsers文件中添加

slave1

slave2

slave3

4.新增conf/backup-masters

在conf目錄下新增文件

mkdir backup-masters

在backup-masters文件中添加

master1

作用:主要用於主機宕機後備用機接管hbase

5.修改conf/log4j.properties

第20行

hbase.log.dir=/home/hadoop/logs/hbase

6.拷貝hbase到所有的節點

同hadoop與zk

7.啓動hbase

配置了環境變量直接執行,沒有配置進入bin目錄下

start-hbase.sh

8.hbase自帶的web界面

http://192.168.1.171:60010/

http://192.168.1.175:60010/

9.測試

1.登錄hbase客戶端

文檔開頭配置hbase環境變量直接執行,沒有配置進到hbase安裝目錄下的bin

hbase shell

2.新建數據表,並插入3條記錄

hbase(main):003:0> create 'test', 't1'

(create '表名', '列族'

0 row(s) in 1.2200 seconds

hbase(main):003:0> list 'table'

test

1 row(s) in 0.0550 seconds  

hbase(main):004:0> put 'test', 'row1', 't1:a', 'value1'  

(put '表名', '行號', '列族:列', '列值' 

0 row(s) in 0.0560 seconds  

hbase(main):005:0> put 'test', 'row2', 't1:b', 'value2'  

0 row(s) in 0.0370 seconds  

hbase(main):006:0> put 'test', 'row3', 't1:c', 'value3'  

0 row(s) in 0.0450 seconds  

3.查看插入的數據

hbase(main):007:0> scan 'test' 

ROW        COLUMN+CELL 

row1       column=cf:a, timestamp=1288380727188, value=value1  

(行號      column=列族:列, timestamp=時間版本時間搓, value=列值) 

row2       column=cf:b, timestamp=1288380738440, value=value2  

row3       column=cf:c, timestamp=1288380747365, value=value3  

3 row(s) in 0.0590 seconds  

4.讀取單條記錄

hbase(main):008:0> get 'test', 'row1' 

COLUMN      CELL

cf:a        timestamp=1288380727188, value=value1 

1 row(s) in 0.0400 seconds 

5.停用並刪除數據表

hbase(main):012:0> disable 'test' 

0 row(s) in 1.0930 seconds 

hbase(main):013:0> drop 'test'

0 row(s) in 0.0770 seconds

先停用後刪除

6.退出

hbase(main):014:0> exit

如果Ctrl+z退出需要手動殺死線程(不然連接不會被釋放)

jps

殺死 Main線程號

10.日常命令

start-hbase.sh

stop-hbase.sh

 

 

 

dfs.namenode.support.allow.format=true

NN是否允許被格式化?在生產系統,把它設置爲false,阻止任何格式化操作在一個運行的DFS上。

建議初次格式化後,修改配置禁止

dfs.client.write.exclude.nodes.cache.expiry.interval.millis=600000

最大週期去讓DN保持在例外節點隊列中。毫秒。操過此週期,先前被排除的DN將被移除緩存並被嘗試再次申請Block。默認爲10分鐘。

dfs.heartbeat.interval=3

DN的心跳間隔3秒

dfs.namenode.heartbeat.recheck-interval

HeartbeatMonitor 會定期的檢測已註冊的數據節點的心跳包,每一次檢測間隔300000毫秒即默認5分鐘

 

Namenode判斷一個DataNode死亡的時間爲2* dfs.namenode.heartbeat.recheck-interval+10* dfs.heartbeat.interval即如果都爲默認值爲1030

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