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

主机列表

主机
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


准备工作

一、为主机命名

Hadoop(HBase)集群内所有主机必须具有唯一主机名,配置中均不能直接使用IP作为主机的标识。
下面以cos2主机为例说明:
#vim /etc/sysconfig/network

NETWORKING=yes
HOSTNAME=cos2.cosdomain

其余各主机以此类推。

二、配置/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

其中192.168.135.54为主机cos2一个网卡的固定IPV4地址。

三、安装JDK并设置JAVA_HOME  (建议集群内各主机都设置成一样,方便管理)

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

# vim /etc/profile

最后加入下面几行

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

四、创建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

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

六、设置NTP时钟同步

集群的时钟要保证基本的一致。稍有不一致是可以容忍的,但是很大的不一致会造成奇怪的行为。 因此,可运行 NTP 或者采用其它方式同步集群的时间.
如果你查询的时候或者是遇到奇怪的故障,可以检查一下系统时间是否正确!

七、修改Linux系统下hadoop和hbase用户的ulimit和nproc参数值

详见http://hbase.apache.org/book.html#basic.prerequisites,或者谷歌一下CentOS怎样设置ulimit和nproc

八、开放hadoop和hbase用到的端口或者关闭iptables

九、确保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安装目录到cos3、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

转载于:https://my.oschina.net/u/1377774/blog/265186

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值