环境:
操作系统:CentOS5.6,其他版本的Linux应该也可以。
jdk:sun jdk 1.6 32bit
hadoop:apache hadoop 1.0.4(hadoop 1.2.x也适用。2.0以上的版本,我自己还没有试过。)
hbase:apache hbase 0.94
实验环境包含三个结点,主机名称分别为:master, slave1和slave2。对于Hadoop的HDFS,NameNode已经运行于master,对于Hbase,希望HMaster服务运行于master,HRegionServer服务和zookeeper运行于master, slave1和slave2这三个结点。
先决条件:
(1)hadoop的版本与hbase的版本要对应,主要是hadoop目录下的hadoop-core-1.0.4.jar的版本与hbase的lib目录下的hadoop-core-1.0.4.jar一致。
(2)配置apache hadoop append,默认这个属性是false,需要设置为true
修改(hadoop/conf/hdfs-site.xml),并重启HDFS(或者重启Hadoop也行)
<property>
<name>dfs.support.append</name>
<value>true</value>
</property>
1)下载hbase,无需使用root用户,普通用户运行即可。
解压到每台计算机的用户目录
tar zxvf hbase-0.92.0.tar.gz
建立软连,方便使用
ln -s hbase-0.92.0 hbase
2)配置hbase
前提是安装完成hadoop,如何安装多结点的Hadoop系统就不赘述了,在所有结点上执行步骤1-4,可以先在namenode上进行配置,然后拷贝(scp命令)到其它结点。
1.修改conf/hbase-env.sh,添加jdk支持
export JAVA_HOME=/usr/local/jdk
export HBASE_MANAGES_ZK=true
export HBASE_LOG_DIR=/data/logs/hbase
说明:
(1)JDK的目录需要根据自己系统中Java的安装目录而定,不一定是“/usr/local/jdk”。
(2)HBASE_MANAGES_ZK=true 表示hbase由zookeeper管理,在启动hbase时,会自动启动zookeeper,所以,zookeeper无需单独安装,已经集成在hbase中。
2. 修改conf/hbase-site.xml,
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master</name>
<value>hdfs://master:60000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value> master,slave1,slave2</value>
<description>Comma separated list of servers in the ZooKeeper Quorum. For example, "host1.mydomain.com,host2.mydomain.com,host3.mydomain.com". By default this is set to localhost for local and pseudo-distributed modes of operation. For a fully-distributed setup, this should be set to a full list of ZooKeeper quorum servers. If HBASE_MANAGES_ZK is set in hbase-env.sh this is the list of servers which we will start/stop ZooKeeper on. </description>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/data/work/zookeeper</value>
<description>Property from ZooKeeper's config zoo.cfg. The directory where the snapshot is stored. </description>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>zookeeper.session.timeout</name>
<value>1200000</value>
</property>
<property>
<name>hbase.zookeeper.property.tickTime</name>
<value>6000</value>
</property>
说明:
(1)hbase.rootdir设置hbase在hdfs上的目录,主机名为hdfs的namenode节点所在的主机。尤其注意:<value>hdfs://master:9000/hbase</value>的值“hdfs://master:9000”与hadoop/conf/hdfs-site.xml中设定的值要完全一样,hdfs://master:9000/hbase 指明了存放hbase的目录名为hbase,目录名可以自定义。
(2)hbase.cluster.distributed设置为true,表明是完全分布式的hbase集群
(3)hbase.master设置hbase的master主机名和端口
(4)hbase.zookeeper.quorum设置zookeeper的主机,建议使用单数。<value> master,slave1,slave2</value>指明在master,slave1,slave2这三台主机上运行zookeeper。
(5)设定hbase.zookeeper.property.clientPort,把zookeeper.session.timeout的值调大,设定hbase.zookeeper.property.tickTime的值,从而使zookeeper运行更加稳定。
(6)hbase中使用主机名,而不是IP地址标识主机。因此需要修改hosts文件,建立各主机名与IP地址的对应关系。
[使用root权限] vi /etc/hosts ,指明主机名称与IP地址的对应关系,因为我的实验环境包含了三个结点:master,slave1,slave2,所以我需要添加的内容如下:
192.168.100.128 master
192.168.100.156 slave1
192.168.100.159 slave2
3.修改hadoop的目录下的conf/hdfs-site.xml
<property>
<name>dfs.datanode.max.xcievers</name>
<value>4096</value>
</property>
具体原因参考:Hbase在线手册 http://hbase.apache.org/book.html
4.修改hbase/conf/regionservers
将所有的datanode添加到这个文件,类似与hadoop中slaves文件。因为我想在“master,slave1,slave2”这三个结点上运行HRegionServer,所以,我的hbase/conf/regionservers 的内容为:
master
slave1
slave2
5.拷贝hbase到所有的节点,也就是说,步骤1-4在所有hbase结点上的配置是相同的。
6. 启动Hbase之前,确保hadoop已经正常启动并运行。可以使用jps命令查看master上是否存在NameNode服务,slave上是否存在DataNode服务。然后
启动hbase
$ ./bin/start-hbase.sh
注意事项:防火墙会阻挡访问hbase和zookeeper的网络连接,zookeeper若被防火墙阻挡,就会死掉,导致Hbase死掉。因此,需要配置iptables,允许相关端口的数据包通过,或者在测试阶段,直接先将iptables防火墙停掉:/sbin/service iptables stop 【停止iptables需要root权限】比较方便。
7 检查Hbase是否正常启动。
(1)在master上运行jps,会看到HMaster、HRegionServer和HQuorumPeer。
[user@master ~]$ jps
26023 HRegionServer
26615 Jps
15276 DataNode
15140 NameNode
25724 HQuorumPeer
15596 TaskTracker
25835 HMaster
15441 JobTracker
(2)在slave上运行jps,会看到HRegionServer和HQuorumPeer。
[user@slave2 ~]$ jps
10735 DataNode
13226 HQuorumPeer
10854 TaskTracker
13383 HRegionServer
19594 Jps
(3)其它方式:hbase自带的web界面
http://master:60010/
8 测试
1).登录hbase客户端
./bin/hbase shell
2).新建数据表,并插入3条记录
hbase(main):003:0> create 'test', 'cf'
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', 'cf:a', 'value1'
0 row(s) in 0.0560 seconds
hbase(main):005:0> put 'test', 'row2', 'cf:b', 'value2'
0 row(s) in 0.0370 seconds
hbase(main):006:0> put 'test', 'row3', 'cf: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
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
9、注意事项
注意防火墙的问题。防火墙会阻挡访问hbase和zookeeper的网络连接,因此,需要配置iptables,允许相关端口的数据包通过,或者在测试阶段,直接先将iptables防火墙停掉:/sbin/service iptables stop 【停止iptables需要root权限】比较方便。
10. 其它说明
(1)很多资料上建议在各个结点上安装配置NTP服务,保证各结点的时钟同步,否则Hbase运行可能会不稳定。我也在各个结点上安装了NTP服务,建议你也配置一下NTP服务。
(2) 错误参考及解答
http://hbase.apache.org/book.html
http://wiki.apache.org/hadoop/Hbase/Troubleshooting
(3)文中多数文字参考http://www.cnblogs.com/ggjucheng/archive/2012/05/04/2483474.html,并根据自己的实践和理解进行了修改和补充。在此表示感谢。