hbase的搭建是比较简单的,无论是单机模式还是分布式都相对容易。本人选择的是1.3.1的版本,按照官方的文档很快就搭建起来了,但是启动的时候出现了错误。无论是baidu还是google都没有找到答案,起初还以为是版本差异,然后使用了1.2.6版本,结果还是原来的错误,看了错误日志之后也是云里雾里的,后来无意间发现了问题的根源,然后 继续使用1.3.1了,在这里记录一下。
在搭建Hbase之前,我已经搭建好了Hadoop和Zookeeper,搭建的资料网上也比较多。所以没有搭建好这两个环境的需要先搭建一下。
搭建的时候可以直接参考官方文档就好,文档上面介绍的已经非常清楚了。下面我就按照官方的思路走一遍搭建过程。
首先介绍一下我手中的机器,我一共有三个机器,搭建规划就是下面的表格中的样子。
Node Name | Master | ZooKeeper | RegionServer |
---|---|---|---|
centos1 | yes | yes | yes |
centos2 | no | yes | yes |
centos3 | backup | yes | yes |
可以说是与官方的大同小异。其中以centos1作为主节点,centos3作为备用主节点。
1.首先将下载好的hbase解压到文件夹中,我这里是解压到了/opt中(以下操作均在centos1节点上进行)。
tar -zxvf hbase-1.3.1-bin.tar.gz -C /opt/
2.配置一下环境变量,这个也不是必须的,也就是以后启动的时候方便一点,修改/etc/profile,添加:
export HBASE_HOME=/opt/hbase-1.3.1
export PATH=${HBASE_HOME}/bin:$PATH
3.编辑hbase中的conf/regionservers,把原来的localhost删除点,写上想要作为regionservers的节点。我这里直接写的就是centos1、centos2、centos3.
4.按照官方的步骤接下来是在conf目录中创建一个backup-masters的文件,其中写上想要作为备用主节点节点名,所以我这里写的就是centos3了。
5.编辑conf/hbase-env.sh文件,修改里面的JAVA_HOME和HBASE_MANAGES_ZK的值。将JAVA_HOME添加成环境中的java环境即可,HBASE_MANAGES_ZK修改为false。
export JAVA_HOME=/usr/local/jdk
export HBASE_MANAGES_ZK=false
JAVA_HOME就不用解释了,这是HBASE_MANAGES_ZK的描述:
Tell HBase whether it should manage it’s own instance of Zookeeper or not.
其实hbase里面自带了一个zookeeper,而这个属性的值就是是否使用这个自带的zookeeper,很显然我这里要使用自己的zookeeper,所以修改为false。
6.接下来修改hbase-site.xml中的配置信息。
<configuration>
<property>
<name>hbase.rootdirname>
<value>hdfs://cluster/hbasevalue>
property>
<property>
<name>hbase.cluster.distributedname>
<value>truevalue>
property>
<property>
<name>hbase.zookeeper.quorumname>
<value>centos1,centos2,centos3value>
property>
<property>
<name>hbase.zookeeper.property.dataDirname>
<value>/opt/bigdata/zookeepervalue>
property>
<property>
<name>hbase.tmp.dirname>
<value>/opt/bigdata/hbase/tmpvalue>
property>
configuration>
hbase.rootdir:
就是来选择将数据写入到什么目录中,这里我选择的就是HDFS,因为我的Hadoop的一个HA的配置,所以我写的就是集群的名字cluster了,如果不是HA的话,可以写上namenode节点名就好。后面的hbase其实就是HDFS中的一个目录了,以后的hbase数据就会放到这个hbase目录中的,不需要手动创建,启动的时候会自动创建的。
hbase.cluster.distributed
设置为true就是开启完全分布式。
hbase.zookeeper.quorum
设置为安装有ZK的节点。
hbase.zookeeper.property.dataDir
设置zk的数据存放目录。
7.接下来需要hbase能够知道我的hdfs的配置,需要将hadoop中的hdfs-site.xml拷贝到hbase的conf中,至于解释我没有在官方文档中看到,但是在中文版官方文档http://abloz.com/hbase/book.html#standalone_dist有提到,也就是为了保证hbase和hdfs的配置一致性。
cp /opt/hadoop-2.7.2/etc/hadoop/hdfs-site.xml ./
2.2.2.2.3. HDFS客户端配置
如果你希望Hadoop集群上做HDFS 客户端配置 ,例如你的HDFS客户端的配置和服务端的不一样。按照如下的方法配置,HBase就能看到你的配置信息:在hbase-env.sh里将HBASE_CLASSPATH环境变量加上HADOOP_CONF_DIR 。
在${HBASE_HOME}/conf下面加一个 hdfs-site.xml (或者 hadoop-site.xml) ,最好是软连接
如果你的HDFS客户端的配置不多的话,你可以把这些加到 hbase-site.xml上面.
例如HDFS的配置 dfs.replication.你希望复制5份,而不是默认的3份。如果你不照上面的做的话,HBase只会复制3份。
8.然后在centos2、centos3中做以上相同的配置,直接使用scp 进行发送即可。
scp hdfs-site.xml regionservers hbase-env.sh hbase-site.xml backup-masters centos2:/opt/hbase-1.3.1/conf/
scp hdfs-site.xml regionservers hbase-env.sh hbase-site.xml backup-masters centos3:/opt/hbase-1.3.1/conf/
9.是的,配置就是这么简单,接下来就可以在启动hbase了,在centos1中使用:start-hbase.sh。这个命令是在hbase的bin目录中的,因为刚才配置了HBASE_HOME的环境变量,所以在任意目录下均可使用,否则只能在相应的目录下才能使用了。
如果一些顺利的话,在centos1、centos2、centos3中使用jps可以看到相关的进程了。在centos1和centos3中分别有HMaster和HRegionServer,而centos2中只有HRegionServer,这正好符合我的设计观点。
启动的时候可能会有一个警告:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m;
这个警告其实是正常的,可以看看一个解释:http://blog.csdn.net/zhangge360/article/details/51864036
但是在最初的时候,启动的并不顺利,发现在centos2和centos3中并没有看到相关进程,也就是说hbase服务没有正常启动,在logs中看到以下错误:
java.lang.RuntimeException: Failed construction of Regionserver: class org.apache.hadoop.hbase.regionserver.HRegionServer
at org.apache.hadoop.hbase.regionserver.HRegionServer.constructRegionServer(HRegionServer.java:2706)
at org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.start(HRegionServerCommandLine.java:64)
at org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.run(HRegionServerCommandLine.java:87)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.hadoop.hbase.util.ServerCommandLine.doMain(ServerCommandLine.java:126)
at org.apache.hadoop.hbase.regionserver.HRegionServer.main(HRegionServer.java:2721)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.apache.hadoop.hbase.regionserver.HRegionServer.constructRegionServer(HRegionServer.java:2704)
... 5 more
Caused by: java.io.IOException: Problem binding to centos2/192.168.01.03:16020 : Cannot assign requested address. To switch ports use the 'hbase.regionserver.port' configuration property.
at org.apache.hadoop.hbase.regionserver.RSRpcServices.(RSRpcServices.java:1002)
at org.apache.hadoop.hbase.regionserver.HRegionServer.createRpcServices(HRegionServer.java:667)
at org.apache.hadoop.hbase.regionserver.HRegionServer.(HRegionServer.java:543)
... 10 more
Caused by: java.net.BindException: Cannot assign requested address
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:433)
at sun.nio.ch.Net.bind(Net.java:425)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at org.apache.hadoop.hbase.ipc.RpcServer.bind(RpcServer.java:2742)
at org.apache.hadoop.hbase.ipc.RpcServer$Listener.<init>(RpcServer.java:661)
at org.apache.hadoop.hbase.ipc.RpcServer.<init>(RpcServer.java:2178)
at org.apache.hadoop.hbase.regionserver.RSRpcServices.<init>(RSRpcServices.java:994)
错误就是很直白的告诉了ip错了,刚开始还以为是端口冲突了,查看之后发现并没有占用hbase的默认端口,然后按照错误中的建议修改了端口属性:hbase.regionserver.port,发现并没有解决问题。
因为问题肯定是在ip中的,所以几经探索之后发现了问题的所在地。
我在每个机器中的/etc/hosts里面都是放置了centos1、centos2、centos3的真实节点ip和名称。但是在centos2和centos3中不知为何并没有进行解析。所以我尝试着将centos2和centos3中对应的本机IP换成了127.0.0.1,结果发现能够启动了。
启动之后可以通过WEB端口进行查看相关服务信息:
因为我是在centos1中启动的start-hbase.sh服务,所以就会把centos1当做Master(事实上也可以在任意一个hbase机器上启动Master),将centos3当做Backup Master,通过WEB界面也可以看到:
centos1:16010
centos3:16010
记着是16010端口哦,与之前的老版本有点不一样的。