【hbase0.96】基于hadoop搭建hbase的心得

时间:2021-11-03 08:23:34

hbase是基于hadoop的hdfs框架做的分布式表格存储系统,所谓表格系统就是在k/v系统的基础上,对value部分支持column family和column,并支持多版本读写。

 

hbase的工作原理是保证系统中key全局有序存储,每个regionserver负责的某一个key range,并在regionserver中数据量过大的时候由master负责通知其分列成2个key range,并将其中一个key range交给其他regionserver维护,通过修改meta表生效从而达到了自动迁移,负载均衡。

 

一个核心的认识在于,任何一个key range的数据自身的可靠性依靠hdfs自身的多副本得到保证,对于hbase来说只需要关心一个key range当前由哪个regionserver读写,而key range的分裂实际上只是将1个存储文件分裂到hdfs上的2个文件,并通知其他的regionserver从hdfs上加载即可完成迁移。而regionserver的健康状况以及meta表存储在哪个regionserver均在zookeeper中记录,hbase发布版本自带了zookeeper,除非你想与其他服务共用zookeeper,否则不需要单独部署zk。

 

对于搭建hbase而言,首先必须保证hadoop分布式集群已经搭建成功,然后你也下载了hadoop兼容的hbase的二进制发布版本,这里我的hadoop是2.2版本,我选择了较稳定的hbase0.96版本,为了部署hbase你需要做下面的工作:

 

1,下载hbase二进制发布包,解压到hadoop的namenode节点上。

2,修改conf/hbase-site.xml:指定hbase连接到什么hdfs地址,指定hbase的数据存储目录tmp,指定hbase是分布式部署,指定内置zookeeper节点分别是什么,启动脚本会到对应机器上拉起zk,你应该了解zookeeper应该部署奇数个用于内部一致性选举,指定zookeeper的数据存储目录。

<configuration>
        <property>
                <name>hbase.rootdir</name>
                <value>hdfs://m1-reader-q1preonline07.m1.baidu.com:8010/hbase</value>
                <description>The directory shared by RegionServers.
                </description>
        </property>
        <property>
                <name>hbase.tmpdir</name>
                <value>/home/liangdong/hadoop/hbase/tmp</value>
                <description></description>
        </property>
        <property>
                <name>hbase.cluster.distributed</name>
                <value>true</value>
                <description>The mode the cluster will be in. Possible values are
                        false: standalone and pseudo-distributed setups with managed Zookeeper
                        true: fully-distributed with unmanaged Zookeeper Quorum (see hbase-env.sh)
                </description>
        </property>
        <property>
                <name>hbase.zookeeper.quorum</name>
                <value>m1-reader-q1preonline07.m1.baidu.com,m1-reader-q1preonline08.m1.baidu.com,m1-reader-q1preonline09.m1.baidu.com</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>/home/liangdong/hadoop/hbase/zookeeper</value>
                <description>Property from ZooKeeper's config zoo.cfg.
                        The directory where the snapshot is stored.
                </description>
        </property>
</configuration>

3,修改conf/regionservers:也就是指定hbase集群在哪些节点上启动,节点个数可以随时扩容,hbase会自动分裂一些regionserver上的key range并由空闲节点加载参与服务,这里我把我hadoop的3个datanode的地址填进去了:

m1-reader-q1preonline08.m1.baidu.com
m1-reader-q1preonline09.m1.baidu.com
m1-reader-q1preonline10.m1.baidu.com

4,把整个hbase目录scp到regionservers里指定的节点上的相同路径下去,在此之前我搭建hadoop时应该已经建立了好信任关系。

5,为了hbase的进程能够跑起来,必须让java能找到hbase的jar包,所以我在所有部署hbase(包括regionserver和master)的节点上修改了.bashrc,令CLASSPATH包含了hbase的所有jar包,像这样:

HBASE_HOME=/home/liangdong/hadoop/hbase

CLASSPATH=${CLASSPATH}":"`find ${HBASE_HOME}/lib/*.jar | awk '{path=path":"$0}END{print path}'`

6,在master节点上调用bin/start-hbase.sh就可以启动所有的regionserver了,同时zookeeper和master进程均被拉起,你应该可以通过jps看到HMaster进程,它负责全局负载均衡,管理数据分裂与迁移,而HQuorumPeer就是内置的zk进程,HRegionServer就是管理实际的数据读写节点了。

7,部署成功后,你可以执行bin/hbase shell启动hbase命令行,输入status确认节点个数是否符合预期,之后就可以创建表格,读写数据了。

8,我没有在conf里指定各进程的服务地址,如果你需要做指定以及对hbase进行参数优化,可以参考官网的document,有一篇中文的里面有详细的调优指南等。

9,为了保障集群可用性,HMaster进程可以部署在多机上,同一时刻只有1个进程抢到Zookeeper注册并进行服务,其他节点均会观察ZK中的锁,一旦当前HMaster进程崩溃释放ZK锁,另外一个HMaster进程就会注册到ZK开始管理整个集群。 部署多个HMaster进程,只需要在hbase-site.xml里配置hbase.master这个选项,将机器HOST填写到其中即可,比如你希望B机器充当HMaster的一个冗余节点,那么你去B机器上把hbase-site.xml里添加上hbase.master,并将值写为B机器的Host,然后调用一下bin/habase master start就启动起来了,这个肯定是不能从主控机start-hbase.sh来弄的。

10,有任何搭建问题,可以在下面留言,谢谢。