Hbase1.3.1 完全分布式搭建。

来源:互联网 发布:企业网站推广优化 编辑:程序博客网 时间:2024/05/23 23:50

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.1export 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/jdkexport 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.rootdir</name>    <value>hdfs://cluster/hbase</value></property><property>  <name>hbase.cluster.distributed</name>  <value>true</value></property><property>  <name>hbase.zookeeper.quorum</name>  <value>centos1,centos2,centos3</value></property><property>  <name>hbase.zookeeper.property.dataDir</name>  <value>/opt/bigdata/zookeeper</value></property><property>    <name>hbase.tmp.dir</name>    <value>/opt/bigdata/hbase/tmp</value></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的数据存放目录。

  • hbase.tmp.dir
    设置临时文件存放目录,最好设置一下,要不默认的/tmp目录重启就会清空的。

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 moreCaused 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.<init>(RSRpcServices.java:1002)        at org.apache.hadoop.hbase.regionserver.HRegionServer.createRpcServices(HRegionServer.java:667)        at org.apache.hadoop.hbase.regionserver.HRegionServer.<init>(HRegionServer.java:543)        ... 10 moreCaused 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端口哦,与之前的老版本有点不一样的。

这里写图片描述

原创粉丝点击