HBase
Hbase安装
准备环境
- Hadoop 集群安装配置
- ZooKeeper 3.4.X 安装和配置
- Hbase 下载解压修改配置文件 散发到集群
ZooKeeper 3.4.X 安装与配置
zookeeper有单机、伪分布式集群、完全分布式集群三种部署方式,本文中主要讲解完全分布集群的配置方法,其他两种参见
完全分布式集群中假设我们有三台主机h1 h2 h3, 下载ZooKeeper 3.4.X1
2
3
4tar -xzfv zookeeper-3.4.x.tar.gz -C '安装目录'
mkdir -p '预设zookeeper的data目录'(/home/weixiang/data/zookeeper/)
mkdir -p '预设zookeeper的logs目录'(/home/weixiang/logs/zookeeper/)
cd '安装目录/ZooKeeper 3.4.X/conf'
将zookeeper添加到环境变量中,编辑/etc/profile文件 添加export ZOOKEEPER_HOME=安装目录/zookeeper-3.4.xexport PATH=......:$ZOOKEEPER_HOME/bin
修改zoo_sample.cfg 重命名为zoo.cfg 并开始编辑1
2
3
4
5
6
7
8
9tickTime=2000
dataDir=对应预设zookeeper的data目录(/home/weixiang/data/zookeeper/)
dataLogDir=对应预设zookeeper的logs目录(/home/weixiang/logs/zookeeper/)
clientPort=2181
initLimit=5
syncLimit=2
server.1=h1:2888:3888
server.2=h2:2888:3888
server.3=h3:2888:3888
通过scp -r “源目录” “目的主机目录” 命令将zookeeper 3.4.X 文件夹整个拷贝到其他节点
在每个节点的预设zookeeper的data目录(/home/weixiang/data/zookeeper/)上建立myid文件并写入节点编号(这个编号对应配置文件中的server.X其中的X) 例如在h2 这个节点myid的内容应为2
运行脚本启动,停止,查看状态
在每个安装zookeeper的节点上启动zkServer.sh start
查看状态zkServer.sh status 可以得到以下结果:
[hadoop@mdw ~]$ zkServer.sh status
JMX enabled by default
Using config: ……/../conf/zoo.cfg
Mode: follower/leader
在每个安装zookeeper的节点上停止zookeeper服务zkServer.sh stop
如果出错查看zookeeper.out错误信息
Hbase的安装与配置
已在h1 h2 h3 h4 h5上安装好了hadoop: h1 为namenode h2-5 为datanode
已在h1 h2 h3上安装好了zookeeper
将在h1 h2 h3 上装hbase 并将h1 作为master和regionserver,h2-3作regionserver
首先要确定hadoop,Hbase,JDK版本兼容的问题,根据兼容表格选取合适的版本
在本文中我们选取的是hbase 1.3.2.1 下载链接
在h1节点下载,下载后通过 tar -xzvf hbase-1.3.2.1-bin.tar.gz -C '安装目录(例如 /usr/)' 来解压。解压后编辑/usr/hbase-1.3.2.1/conf目录下的hbase-env.sh文件 添加如下内容1
2
3
4export JAVA_HOME=/usr/java/jdk1.8.0_172
export HBASE_LOG_DIR=/usr/hbase-1.3.2.1/logs #日志路径 如果路径不存在先建立路径
export HBASE_MANAGES_ZK=false #表示hbase不用内部的zookeeper
export HBASE_CLASSPATH=/usr/hadoop-2.6.5/etc/hadoop #hadoop配置文件所在位置
编辑hbase-site.xml 文件如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://h1:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>h1,h2,h3</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/weixiang/data/zookeeper</value>
</property>
<property>
<name>hbase.master</name>
<value>hdfs://h1:60000</value>
</property>
</configuration>
以上配置文件涉及zookeeper的要与已经装好的zookeeper信息相符合,涉及到hadooop的也要与已装的hadoop相符。
编辑regionservers文件,将regionservers的主机名添加到文件中1
2
3
4
5h1
h2
h3
最后在建立hdfs-site.xml 软连接到hadoop的hdfs-site.xml配置文件ln -s hdfs-site.xml /usr/hadoop-2.6.5/etc/hadoop/hdfs-site.xml
效果如下
lrwxrwxrwx. 1 weixiang weixiang 42 Aug 7 18:00 hdfs-site.xml -> /usr/hadoop-2.6.5/etc/hadoop/hdfs-site.xml
至此hbase配置完成通过scp -r命令将hbase文件夹复制到各个节点的安装目录
在各个节点将hbase添加到环境变量中,编辑/etc/profile文件 添加export HBASE_HOME=安装目录/hbase-1.3.2.1export PATH=......:$HBASE_HOME/bin
Hbase 的启动和相关脚本说明
脚本使用小结:
- 开启集群,start-hbase.sh
- 关闭集群,stop-hbase.sh
- 开启/关闭所有的regionserver、zookeeper,hbase-daemons.sh start/stop regionserver/zookeeper
- 开启/关闭单个regionserver、zookeeper,hbase-daemon.sh start/stop regionserver/zookeeper
- 开启/关闭master hbase-daemon.sh start/stop master, 是否成为active master取决于当前是否有active master
两个进阶脚本 - rolling-restart.sh 可以用来挨个滚动重启
- graceful_stop.sh move服务器上的所有region后,再stop/restart该服务器,可以用来进行版本的热升级
几个细节:
hbase-daemon.sh start master 与 hbase-daemon.sh start master –backup,这2个命令的作用一样的,是否成为backup或active是由master的内部逻辑来控制的
stop-hbase.sh 不会调用hbase-daemons.sh stop regionserver 来关闭regionserver, 但是会调用hbase-daemons.sh stop zookeeper/master-backup来关闭zk和backup master,关闭regionserver实际调用的是hbaseAdmin的shutdown接口
通过$HBASE_HOME/bin/hbase stop master关闭的是整个集群而非单个master,只关闭单个master的话使用$HBASE_HOME/bin/hbase-daemon.sh stop master
$HBASE_HOME/bin/hbase stop regionserver/zookeeper 不能这么调,调了也会出错,也没有路径会调用这个命令,但是可以通过$HBASE_HOME/bin/hbase start regionserver/zookeeper 来启动rs或者zk,hbase-daemon.sh调用的就是这个命令
常用到的HBase启动脚本有:
- $HBASE_HOME/bin/start-hbase.sh
启动整个集群 - $HBASE_HOME/bin/stop-hbase.sh
停止整个集群 - $HBASE_HOME/bin/hbase-daemons.sh
启动或停止,所有的regionserver或zookeeper或backup-master - $HBASE_HOME/bin/hbase-daemon.sh
启动或停止,单个master或regionserver或zookeeper
以start-hbase.sh为起点,可以看看脚本间的一些调用关系
start-hbase.sh的流程如下:
- 运行hbase-config.sh(作用后面解释)
- 解析参数(0.96版本及以后才可以带唯一参数autorestart,作用就是重启)
- 调用hbase-daemon.sh来启动master;调用hbase-daemons.sh来启动regionserver zookeeper master-backup
hbase-config.sh的作用:
装载相关配置,如HBASE_HOME目录,conf目录,regionserver机器列表,JAVA_HOME目录等,它会调用$HBASE_HOME/conf/hbase-env.sh
hbase-env.sh的作用:
主要是配置JVM及其GC参数,还可以配置log目录及参数,配置是否需要hbase管理ZK,配置进程id目录等
hbase-daemons.sh的作用:
根据需要启动的进程,
如为zookeeper,则调用zookeepers.sh
如为regionserver,则调用regionservers.sh
如为master-backup,则调用master-backup.sh
zookeepers.sh的作用:
如果hbase-env.sh中的HBASE_MANAGES_ZK” = “true”,那么通过ZKServerTool这个类解析xml配置文件,获取ZK节点列表(即hbase.zookeeper.quorum的配置值),然后通过SSH向这些节点发送远程命令:
cd ${HBASE_HOME};
$bin/hbase-daemon.sh –config ${HBASE_CONF_DIR} start/stop zookeeper
regionservers.sh的作用:
与zookeepers.sh类似,通过${HBASE_CONF_DIR}/regionservers配置文件,获取regionserver机器列表,然后SSH向这些机器发送远程命令:
cd ${HBASE_HOME};
$bin/hbase-daemon.sh –config ${HBASE_CONF_DIR} start/stop regionserver
hbase-daemon.sh的作用:
无论是zookeepers.sh还是regionservers.sh或是master-backup.sh,最终都会调用本地的hbase-daemon.sh,其执行过程如下:
- 运行hbase-config.sh,装载各种配置(java环境、log配置、进程ID目录等)
- 如果是start命令?滚动out输出文件,滚动gc日志文件,日志文件中输出启动时间+ulimit -a信息,如“Mon Nov 26 10:31:42 CST 2012 Starting master on dwxx.yy.taobao””..open files (-n) 65536..”
- 调用$HBASE_HOME/bin/hbase start master/regionserver/zookeeper
- 执行wait,等待3中开启的进程结束
- 执行cleanZNode,将regionserver在zk上登记的节点删除,这样做的目的是:在regionserver进程意外退出的情况下,可以免去3分钟的ZK心跳超时等待,直接由master进行宕机恢复
- 如果是stop命令?
根据进程ID,检查进程是否存在;调用kill命令,然后等待到进程不存在为止 - 如果是restart命令?
调用stop后,再调用start
Hbase简介
- HBase是一个分布式的、面向列的开源数据库,该技术来源于Chang et al所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。
- 就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力,并利用hdfs文件系统作为后端存储
- HBase是Apache的Hadoop 项目的子项目。
- HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式
Hbase 逻辑模型
- 以表的形式存放数据
- 表由行与列组成,每个列属于某个列族,由行和列确定的存储单元称为元素
- 每个元素保存了同一份数据的多个版本,由时间戳来标识区分
行建:行键可以是最大长度不超过64KB的任意字符串,并按照字典序存储
对于经常要一起读取的行,要对行键值精心设计,以便它们能放在一起存储
- 行键是数据行在表里的唯一标识,并作为检索记录的主键
- 访问表里的行只有三种方式
1.通过单个行键访问
2.给定行键的范围访问
3.全表扫描
列族与列:
- 列表示为<列族>:<限定符>
- Hbase在磁盘上按照列族存储数据,这种列式数据库的设计非常适合于数据分析的情形
- 列族里的元素最好具有相同的读写方式(例如等长的字符串),以提高性能
- 在创建表的时候要指定列族的数目,但是列族中限定符的数目(即列的数目)可以不定
时间戳:
- 对应每次数据操作的时间,可由系统自动生成,也可以由用户显式的赋值
- Hbase支持两种数据版本回收方式:1 每个数据单元,只存储指定个数的最新版本 2 保存指定时间长度的版本(例如7天)
- 常见的客户端时间查询:“某个时刻起的最新数据”或“给我全部版本的数据”
- 元素由 行键,列族:限定符,时间戳唯一决定
- 元素以字节码形式存放,没有类型之分
Hbase 物理模型

物理结构说明:
由于Hbase后端存储采用HDFS,HDFS中很难对文件进行修改操作,即使是最基本的追加append操作也是很难实现的,因此Hbase在修改数据时实际上是插入一个新时间戳的记录,并且Hbase在删除时所做的操作只是打上删除标签,当storefile文件合并的时候再剔除删除项和时间戳过期的记录。
Region与RegionServer:
- 表在行方向上,按照行键范围划分成若干的Region
- 每个表最初只有一个region,当记录数增加到超过某个阈值时,开始分裂成两个region
- 物理上所有数据存放在HDFS,由Region服务器提供region的管理
- 一台物理节点只能跑一个HRegionServer
- 一个Hregionserver可以管理多个表的Region实例
- 一个Region实例包括Hlog日志和存放数据的Store
- Hmaster作为总控节点
- Zookeeper负责调度
HLog:
- 用于灾难恢复(掉电、物理介质损坏等)
- 预写式日志,记录所有更新操作,操作先记录进日志,数据才会写入
-ROOT- 和 .META. 表:
- HBase中有两张特殊的Table,-ROOT-和.META.
- .META.:记录了用户表的Region信息分布情况,.META.本身可以分布在多个regoin
- -ROOT-:记录了.META.表的Region信息,-ROOT-只有一个region
- Zookeeper中记录了-ROOT-表的location
Memstore与storefile:
- 一个region由多个store组成,每个store包含一个列族的所有数据,这也是为什么Hbase是列式数据库
- Store包括位于把内存的memstore和位于硬盘的storefile
- 写操作先写入memstore,当memstore中的数据量达到某个阈值,Hregionserver会启动flashcache进程写入storefile,每次写入形成单独一个storefile
- 当storefile文件的数量增长到一定阈值后,系统会进行合并,在合并过程中会进行版本合并和删除工作,形成更大的storefile
- 当storefile大小超过一定阈值后,会把当前的region分割为两个,并由Hmaster分配到相应的region服务器,实现负载均衡
- 客户端检索数据时,先在memstore找,找不到再找storefile
Key-Value format:
在Hbase中会建立B+树作为索引,B+ tree的叶子节点就是形如上图的key-value,而索引节点现实按照Key中的Row建立索引再逐层按照其他属性如列族(column family)进行索引。 因此相同列族的记录会在同一个子树下。
物理模型图解:
比较
Hbase vs Oracle:
- 索引不同造成行为的差异
- Hbase适合大量插入同时又有读的情况
- Hbase的瓶颈是硬盘传输速度,Oracle的瓶颈是硬盘寻道时间,因为Hbase所有操作都可以看作是插入操作而且是大批量的,因此速度取决于与硬盘的传输速度。但是oracle经常要随机读写,update时先找到修改内容对应block装载到内存,修改再回写到硬盘。
- Hbase很适合寻找按照时间排序top n的场景
- Hbase不能复杂的统计适合做简单的key-value查询
参考文章:
1: https://spaces-x.github.io/2018/07/26/hadoop-d-2/#Hadoop%E9%9B%86%E7%BE%A4%E9%83%A8%E7%BD%B2
2: https://www.cnblogs.com/lsdb/p/7297731.html
3: https://blog.csdn.net/gnail_oug/article/details/46981607
4: https://www.w3cschool.cn/hbase_doc/
5: https://hbase.apache.org/book.html
6: http://zjushch.iteye.com/blog/1736065
