CentOS 6下HBase分佈式安裝實錄

系統環境

OS:CentOS 6.4 64-bit
RAM:2G
CPU:Intel Core i5-2400 3.10GHz
Hadoop版本:hadoop-2.4.0.tar.gz
HBase版本:hbase-0.98.2-hadoop2-bin.tar.gz
html

主機列表

主機
IP地址  
用途
cos2 
192.168.135.54
namenode,hmaster,zookeeper node
cos3
192.168.135.55
datanode,hregionserver,zookeeper node
cos4
192.168.135.102
datanode,hregionserver,zookeeper node


準備工做

1、爲主機命名

Hadoop(HBase)集羣內全部主機必須具備惟一主機名,配置中均不能直接使用IP做爲主機的標識。
下面以cos2主機爲例說明:
#vim /etc/sysconfig/network
java

NETWORKING=yes
HOSTNAME=cos2.cosdomain

其他各主機以此類推。 node

2、配置/etc/hosts(集羣內各主機都同樣)

127.0.0.1   localhost localhost.localdomain
192.168.135.54 cos2 cos2.cosdomain
192.168.135.55 cos3 cos3.cosdomain
192.168.135.102 cos4 cos4.cosdomain linux

其中192.168.135.54爲主機cos2一個網卡的固定IPV4地址。 shell

3、安裝JDK並設置JAVA_HOME  (建議集羣內各主機都設置成同樣,方便管理)

# tar zxvf jdk_1.8.0_linux_x64.tar.gz -C /jdk apache

# vim /etc/profile vim

最後加入下面幾行 bash

export JAVA_HOME=/jdk1.8.0_05
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar dom

4、建立hadoop和hbase用戶(集羣內各主機都同樣)

# groupadd hadoop
# useradd -g hadoop hadoop
# passwd hadoop
# groupadd hbase
# useradd -g hbase hbase
# passwd hbase

以Linux系統下用戶hadoop、hbase的名義運行hadoop、hbase程序時,必須確保hadoop、hbase用戶對hadoop、hbase配置文件中相應的目錄(如/opt/hadoop_data)有讀、寫、執行權限。 ssh

5、安裝配置SSH

Hadoop啓動之後,namenode是經過SSH來啓動和中止各個datanode上的各類守護進程的,這就需要在節點之間執行指令的時候是不須要輸入密碼的形式,故咱們 須要配置SSH運用無密碼公鑰認證的形式。
以本文中的三臺機器爲例,如今cos2是 namenode節點,他 須要鏈接cos3和cos4。 須要肯定每臺機器上都安裝了ssh,而且datanode機器上sshd服務已經啓動。  

在各主機上執行
# service sshd status
openssh-daemon (pid  1836) 正在運行...
確保sshd服務正在運行
也可使用
#netstat -ant|grep 22
查看sshd默認的監聽端口


若沒有安裝ssh,執行
# yum install -y openssh

下面開始設置cos2到cos3和cos4主機上的無密碼登陸:

在cos2主機上作以下操做:

# sudo hadoop
$ ssh-keygen -t rsa-P '' -f ~/.ssh/id_rsa
$ ssh-copy-id -i ~/.ssh/id_rsa.pub  cos3 
hadoop@cos3‘s password: 

$ ssh-copy-id -i ~/.ssh/id_rsa.pub  cos4 
hadoop@cos4‘s password: 

$ ssh cos3   //驗證是否配置成功,不用輸密碼便可登陸cos3
$ ssh cos4   //驗證是否配置成功,不用輸密碼便可登陸cos4

6、設置NTP時鐘同步

集羣的時鐘要保證基本的一致。稍有不一致是能夠容忍的,可是很大的不一致會形成奇怪的行爲。 所以,可運行 NTP 或者採用其它方式同步集羣的時間.
若是你查詢的時候或者是遇到奇怪的故障,能夠檢查一下系統時間是否正確!

7、修改Linux系統下hadoop和hbase用戶的ulimit和nproc參數值

詳見http://hbase.apache.org/book.html#basic.prerequisites,或者谷歌一下CentOS怎樣設置ulimit和nproc

8、開放hadoop和hbase用到的端口或者關閉iptables

9、確保hadoop和hbase兼容

詳見http://hbase.apache.org/book.html#hadoop

安裝並配置hadoop

集羣內機器的環境(JDK、Hadoop、HBase安裝目錄、JAVA_HOME、HADOOP_HOME)徹底同樣,這樣能夠在一臺機器上配置好,而後把配置好的hadoop目錄hadoop-2.4.0整個文件夾經過scp拷貝拷貝到其餘機器的相同位置便可。

1.在cos2機器上執行以下操做:

(1)
# tar zxvf hadoop-2.4.0.tar.gz -C /opt/hadoop-2.4.0
# chown -R hadoop:hadoop /opt/hadoop-2.4.0


(2)配置/opt/hadoop-2.4.0/etc/hadoop目錄下的四個文件:
core-site.xml:

<configuration>
               <property>
                  <name>fs.defaultFS</name>
                  <value>hdfs://cos2:8020</value>
              </property>
              <property>
                  <name>hadoop.tmp.dir</name>
                 <value>/opt/hadoop_data</value>
              </property>
         </configuration>


hdfs-site.xml:

<configuration>
  <property>
    <name>dfs.name.dir</name>
    <value>/opt/hadoop-name-dir/name1, /opt/hadoop-name-dir/name2</value> 
    <description>dfs.name.dir是namenode持久存儲命名空間鏡像及編輯日誌的本地文件系統路徑。 當這個值是一個逗號分割的目錄列表時,nametable數據將會被複制到全部目錄中作冗餘備份。
  </description>
  </property>
  <property>
    <name>dfs.data.dir</name>
    <value>/opt/hadoop-data-dir/data1,/opt/hadoop-data-dir/data2</value>
    <description>dfs.data.dir是datadode存放塊數據的本地文件系統路徑,逗號分割的列表。 當這個值是逗號分割的目錄列表時,數據將被存儲在全部目錄下,一般分佈在不一樣設備上。
  </description>
  </property>
  <property>
    <name>dfs.replication</name>
    <value>2</value>
    <description>dfs.replication是數據須要備份的數量,默認是3,若是此數大於集羣的機器數會出錯。
    </description>
  </property>
  <property>
    <name>dfs.datanode.max.transfer.threads</name>
    <value>4096</value>
  </property>
</configuration>


注:只需建立到/opt/hadoop-data-dir/、/opt/hadoop-name-dir/ 一級目錄,不要建立下一級,讓hadoop自動建立。

mapred-site.xml:
<configuration>
  <property>
    <name>mapred.job.tracker</name>
    <value>cos2:8021</value>
  </property>
  <property>
    <name>mapred.local.dir</name>
    <value>/opt/mapred-local-dir</value>
  </property>
</configuration>

hadoop-env.sh:   

export JAVA_HOME=/jdk1.8.0_05/


(3)

$ vim /etc/profile

最後加入下面幾行

export HADOOP_HOME==/opt/hadoop-2.4.0
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

(4)

$ vim $HADOOP-HOME/etc/hadoop/slaves
加入兩行,即datanode的節點名稱
cos3
cos4

經過以上步驟hadoop即安裝配置完成。

2.把配置好的hadoop文件夾拷貝到其餘集羣的機器中。

若是有環境不同的地方,修改相應的配置文件使之適應目標主機的環境。


3.啓動hdfs

  $ hdfs namenode -format    
  格式化hadoop namenode,不少時候namenode啓動不起來能夠試試格式化一下
   
  # start-dfs.sh 和start-yarn.sh    //啓動hadoop的各個監護進程
 
   在namenode機器上執行完命令後,namenode會自動啓動全部從節點的hadoop。查看每一臺主機會看到/opt/hadoop-name-dir/和/opt/hadoop-data-dir等目錄。
     
   

4.查看hadoop進程與端口

在namenode執行 jps 命令
8032 HMaster
12697 Jps
3931 NameNode
4109 SecondaryNameNode
7966 HQuorumPeer

在datanode執行 jps 命令
6486 HQuorumPeer
6567 HRegionServer
3849 DataNode
10987 Jps

還可使用netstat -nat|grep 端口號來查看配置的服務端口的監聽狀況
 
另外,還能夠經過http://cos2:50070  和 http://localhost:50030 頁面查看namenode 和 jobtracker運行信息。


5.中止hadoop

$ stop-yarn.sh 和 stop-dfs.sh   //關閉hadoop的各個監護進程

6.增長與刪除數據節點

(待續)


安裝並配置hbase

在主機cos2上執行1 - 4步

1. 將hbase-0.98.2-hadoop2-bin.tar.gz包解壓在目錄/opt/hbase-0.98.2,並執行#chown -R hbase:hbase /opt/hbase-0.98.2命令

2. 配置/opt/hbase-0.98.2/conf/hbase-env.sh文件

export JAVA_HOME=/jdk1.8.0_05/
export HBASE_MANAGES_ZK=true


3. 編輯/opt/hbase-0.98.2/conf/hbase-site.xml 文件,增長如下內容

<property>
    <name>hbase.rootdir</name>
    <value>hdfs://cos2:8020/hbase</value>  
        <description>粗體部分的路徑必定要跟hadoop中core-site.xml中fs.defaultFS中的路徑相同,不然拋錯。這個目錄是region server的共享目錄,用來持久化Hbase。URL須要是'徹底正確'的,還要包含文件系統的scheme。例如,要表示hdfs中的'/hbase'目錄,namenode運行在cos2的8020端口。則須要設置爲hdfs://cos2:8020/hbase。默認狀況下Hbase是寫到/tmp的。不改這個配置,數據會在重啓的時候丟失。默認: file:///tmp/hbase-${user.name}/hbase
    </description>
</property>
<property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
</property>
 <property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/opt/zookeeper-data-dir</value>
    <description>ZooKeeper保存數據的目錄(這個路徑hadoop用戶擁有操做權限)。默認值是/tmp將會在重啓的時候會被操做系統刪掉。
    </description>
  </property>
<property>  
    <name>hbase.zookeeper.quorum</name>  
    <value>cos2,cos3,cos4</value>
    <description>hbase中zookeeper的quorum個數,必須是奇數。</description>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>

4.編輯/opt/hbase-0.98.2/conf/regionservers

徹底分佈式模式的還須要修改conf/regionservers. 在這裏列出了你但願運行的所有 HRegionServer,一行寫一個host (就像Hadoop裏面的 slaves 同樣). 
列在這裏的server會隨着集羣的啓動而啓動,集羣的中止而中止.

vim /opt/hbase-0.98.2/conf/regionservers
加入兩行
cos3
cos4


,而後使用SCP命令拷貝hbase安裝目錄到cos三、cos4主機上。

5.啓動HBase

在cos2執行

$start-hbase.sh //必須先啓動hadoop。若是採用不受hbase管理的單獨zookeepe,還要先啓動zookeeper。



這樣全部節點的HBase服務都會被啓動。 


6.查看HBase集羣信息

若是一切正常,使用jdk自帶的jps命令查看可獲得相似以下輸出

在Master節點(cos2)上:

$ jps
2721 NameNode
2898 SecondaryNameNode
8197 HQuorumPeer
3766 HMaster
3887 Jps


在RegionServer節點(cos3或者cos4上),能夠看到相似以下輸出:
$ jps
2968 HRegionServer
5720 HQuorumPeer
2525 DataNode
3023 Jps
也能夠在地址  http://cos2:60010/master.jsp  查看HBase運行信息。


7.hbase shell控制檯操做

接下來就能夠啓動hbase shell
$./hbase shell
執行基本操做命令
>create 'table1','cf1'

8.中止hbase集羣

$ stop-hbase.sh #必須先中止hbase,而hadoop和zookeeper中止順序沒有限制
$ stop-dfs.sh
$ 中止zookeeper(若是採用不受hbase管理的單獨zookeeper,須要執行該命令。)


Multi-Master配置

典型狀況下,HMaster與Hadoop的NameNode運行在同一主機上,但爲了增長可靠性,能夠設置Multi-Master. If run in a multi-Master environment, all Masters compete to run the cluster. If the active Master loses its lease in ZooKeeper (or the Master shuts down), then then the remaining Masters jostle to take over the Master role.


配置方法:

在$HBASE_HOME/conf/ 目錄下新增文件配置backup-masters,在其內添加要用作Backup Master的節點hostname。例如:
$ vim backup-masters
-------------------------------

cos03

以後,啓動整個集羣,咱們會發現,在cos03主機上也啓動了HMaster進程:

$ jps
----------------
7902 jps
5338 HMaster
此時查看cos03上master節點的log,能夠看到以下的信息:

2014-12-31 14:40:10,120 INFO org.apache.hadoop.hbase.master.ActiveMasterManager: Another master is the active master, cons02,60000,xxxxxxx; waiting to become the next active master




該信息說明,當前hbase集羣有活動的master節點,該master節點爲cos02,因此cos03節點開始等待,直到cos02節點上的master掛掉。cos03會變成新的Active Master節點。

此時,直接kill掉cos02節點上HMaster進程,查看cos03上master節點log會發現:

2014-12-31 14:40:10,436 DEBUG org.apache.hadoop.hbase.master.ActiveMasterManager: No master available. Notifying waiting threads
2014-12-31 14:40:10,438 INFO org.apache.hadoop.hbase.master.ActiveMasterManager: Master=cos03,60000,xxxxxxxx
2014-12-31 14:40:10,443 DEBUG org.apache.hadoop.hbase.master.ActiveMasterManager: A master is now available





可見,cos03節點上Backup Master 已經結果HMaster,成爲Active HMaster。

錯誤集錦

(1)ERROR: Can't get master address from ZooKeeper; znode data == null

緣由:運行hbase(zookeeper)的用戶沒法寫入zookeeper文件,致使znode data爲空。

解決:在hbase-site.xml指定一個運行hbase的用戶有寫入文件權限的目錄做爲zookeeper數據目錄,如
  <property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/home/user88/zk_data</value>
  </property>

(2)HMaster起動失敗,HBASE_HOME/logs/下的master日誌有打印
master.HMaster: Unhandled exception. Starting shutdown.
java.net.ConnectException: Call From cos2.com/10.0.3.218 to cos2:8020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused

緣由:除了http://wiki.apache.org/hadoop/ConnectionRefused中緣由外,還應保證/etc/hosts文件中不存在 ::1 localhost localhost.localdomain這一行

解決:刪除/etc/hosts文件中不存在 ::1 localhost localhost.localdomain這一行

(3)start-dfs.sh啓動HDOOP_HOME/logs下日誌中報錯org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /tmp/xxxxxxxx/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible.  

緣由:  在linux下hadoop等的各類數據默認保存在/tmp目錄下。 當重啓系統後/tmp目錄中的數據信息被清除,致使hadoop啓動失敗。

解決: bin/hadoop namenode -format 格式化後,恢復了默認設置,便可正常啓動。
或者在hadoop的core-site.xml中加入如下配置
              <property>
                  <name>hadoop.tmp.dir</name>
                 <value>/opt/hadoop_data</value>
              </property>

附錄A.Hadoop自動安裝shell腳本


#!/bin/bash  
  
#validate user or group  
validate() {  
 if [ 'id -u' == 0 ];then  
   echo "must not be root!"  
   exit 0  
 else  
   echo "---------welcome to hadoop---------"  
 fi  
}  
  
#hadoop install  
hd-dir() {  
 if [ ! -d /home/hadoop/ ];then  
   mkdir /home/hadoop/  
 else  
   echo "download hadoop will begin"  
 fi  
}  
  
download-hd() {  
 wget -c http://archive.apache.org/dist/hadoop/core/stable/hadoop-1.0.4.tar.gz -O /home/hadoop/hadoop-1.0.4.tar.gz  
 tar -xzvf /home/hadoop/hadoop-1.0.4.tar.gz -C /home/hadoop  
 rm /home/hadoop/hadoop-1.0.4.tar.gz  
 Ln -s /home/hadoop/hadoop-1.0.4 /home/hadoop/hadoop1.0.4  
}  
  
#hadoop conf  
hd-conf() {  
 echo "export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-i386" >> /home/hadoop/hadoop1.0.4/conf/hadoop-env.sh  
 echo "#set path jdk" >> /home/hadoop/.profile  
 echo "export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-i386" >> /home/hadoop/.profile  
 echo "#hadoop path" >> /home/hadoop/.profile  
 echo "export HADOOP_HOME=/home/hadoop/hadoop1.0.4" >> /home/hadoop/.profile  
 echo "PATH=$PATH:$HADOOP_HOME/bin:$JAVA_HOME/bin" >> /home/hadoop/.profile  
 echo "HADOOP_HOME_WARN_SUPPRESS=1" >> /home/hadoop/.profile  
#hadoop core-site.xml  
 echo "<configuration>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml  
 echo "<property>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml  
 echo "<name>fs.default.name</name>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml  
 echo "<value>hdfs://hadoop-master:9000" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml  
 echo "</property>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml  
 echo "<property>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml  
 echo "<name>hadoop.tmp.dir</name>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml  
 echo "<value>/home/hadoop/tmp</value>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml  
 echo "</property>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml  
 echo "</configuration>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml  
#hadoop hdfs-site.xml  
  
 echo "<configuration>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml  
 echo "<property>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml  
 echo "<name>dfs.name.dir</name>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml  
 echo "<value>/home/hadoop/name</value>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml  
 echo "</property>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml  
 echo "<property>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml  
 echo "<name>dfs.data.dir</name>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml  
 echo "<value>/home/hadoop/data</value>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml  
 echo "</property>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml  
 echo "<property>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml  
 echo "<name>dfs.replication</name>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml  
 echo "<value>1</value>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml  
 echo "</property>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml  
 echo "</configuration>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml  
# hadoop mapred-site.xml  
  
 echo "<configuration>" >> /home/hadoop/hadoop1.0.4/conf/mapred-site.xml  
 echo "<property>" >> /home/hadoop/hadoop1.0.4/conf/mapred-site.xml  
 echo "<name>mapred.job.tracker</name>" >> /home/hadoop/hadoop1.0.4/conf/mapred-site.xml  
 echo "<value>hadoop-master:9001</value>" >> /home/hadoop/hadoop1.0.4/conf/mapred-site.xml  
 echo "</property>" >> /home/hadoop/hadoop1.0.4/conf/mapred-site.xml  
 echo "</configuration>" >> /home/hadoop/hadoop1.0.4/conf/mapred-site.xml  
#hadoop master  
 echo "hadoop-master" >> /home/hadoop/hadoop1.0.4/conf/masters  
  
#hadoop slaves  
 echo "hadoop-master" >> /home/hadoop/hadoop1.0.4/conf/slaves  
source /home/hadoop/.profile  
}  
  
hd-start() {  
hadoop namenode -format  
}  
  
  
yes-or-no() {  
  echo "Is your name $* ?"  
  while true  
  do  
     echo -n "Enter yes or no: "  
     read x  
     case "$x" in  
     y | yes ) return 0;;  
     n | no ) return 1;;  
     * ) echo "Answer yes or no";;  
   esac  
  done  
}  
  
echo "Original params are $*"  
  
if yes-or-no "$1"  
then  
  echo "HI $1,nice name!"  
  validate  
  hd-dir  
  download-hd  
  hd-conf  
else  
  echo "Never mind!"  
fi




參考文獻

http://blog.csdn.net/hguisu/article/details/7237395

http://hbase.apache.org/book.html#basic.prerequisites

http://www.cnblogs.com/ventlam/archive/2011/01/22/HBaseCluster.html

相關文章
相關標籤/搜索