简介
Hbase是hadoop领域中的一个数据库产品,是基于map(key,value)结构来存储数据实现海量数据的毫秒级查询。是一个高可靠的分布式存储系统,利用hdfs存储数据,利用mapreduce处理海量数据,利用zookeeper作为协调工具,按照列族存储的列式数据库。
关系型数据库如mysql,oracle在以下业务场景中不太适合,而habse则可以解决这些问题。
1数据量巨大达到亿级别关系数据库查询效率降低
2表中的字段随业务不断变化时多时少,关系数据库在定义表时字段个数是确定好的
3表中字段很多但业务中只需要查询很少的字段,关系数据库先从磁盘中获取全部字段再根据业务进行过滤
Hbase分布式存储,按照id横向切分成多个region
把数据文件横向拆分成多个文件存放在多个节点上,这样单个服务器的上的数据量就会减小,数据量变小查询效率自然提高。
表中的数据必须按照主键排序存储
因为数据文件存储在多个节点上这就要求表的数据必须是有序的,按照id的顺序进行排序存储,我们只需要管理一个映射文件即可。
列族,将每个节点上的文件进行纵向切分
假设有100个字段,hbase会按照业务要求将100个字段划分为多个列族,每个列族是独立的数据文件存储在磁盘上,一般按查询量来划分列族。
下图是一个简单的介绍,表有100个字段并被横向切分存储在server1和server2中,又根据业务情况将字段划分为2个列族,另有一个映射文件记录表中数据存在于那个server上。
Hbase是分布式存储,分为3大部分
Region server存放数据的节点
Master接收用户的操作负责做决策
Zookeeper它是存储master与regionserver的交互状态负责协调管理
Hbase逻辑结构
1命名空间namespace,类似关系数据库的database
2表
3行键rowkey,类似主键
4列族columnfamily
5列限定符column qualifier,类似表中的字段
6时间戳timestamp
7value本身
8单元格cell,是rowkey,columnfamily,timestamp,value的组合
Hbase是基于key,value存储的,其中key是行键value是其他全部的值,而在value中列族也是key,value结构,key是列限定符,value是带有时间戳的value。
查找数据
比如t1,r1,f1:c1,其中t1表示表,r1是行键,f1是列族,c1是列,hbase会先根据映射关系确定regionserver,再在region server上确定那个region,最后再在region上找到记录并取值,每次会根据单元纬度一步步缩小范围。
安装
下载
我下载的是1.1.8,不建议使用0.98因为之后的升级版本改动大
http://hbase.apache.org/
上传到linux上并解压缩
[root@shb01 local]# tar -zxvfhbase-1.1.8-bin.tar.gz
Hbase目录
lib:存放依赖架包,我下载的这个版本的hbase依赖hadoop2.5.1
bin:存放hbase的命令脚本,主要用到start-hbase.sh,stop-hbase.sh,hbase,其中cmd文件是windows下使用。
conf:是配置文件主要有3个,hbase-env.sh,regionservers,hbase-site.xml
Hbase有3种启动方式本地,伪分布,集群。
本地模式
启动hdfs再执行bin目录下的start-hbase.sh即可
[root@shb01hbase-1.1.8]# start-dfs.sh
[root@shb01hbase-1.1.8]# bin/start-hbase.sh
使用jps查看HMaster进程已经启动
[root@shb01hbase-1.1.8]# jps
4491 NameNode
4586 DataNode
4758SecondaryNameNode
5320 Jps
4972 HMaster
浏览器中输入http://shb01:16010/master-status,访问16010端口
集群模式
我有两个linux节点分别是192.168.79.131(shb01)和192.168.79.139,将在这连个服务器上搭建一个hbase集群。
修改192.168.79.131中hbase目录下conf的3个配置文件
在hbase-env.sh文件最后加入3个配置
export HBASE_MANAGES_ZK =true //表示不使用外部zookeeper,由hbase自己管理
export JAVA_HOME=/usr/local/jdk1.7.0_79//jdk
export HBASE_LOG_DIR=/usr/local/logs/hbase//日志位置
在hbase-site.xml中修改如下:
hbase.rootdir:命名空间,表,数据的存放目录
hbase.tmp.dir:hbase的临时目录
hbase.cluster.distributed:是否分布式集群,这里是true
hbase.zookeeper.quorum:hbase启动依赖zookeeper,这个表示zookeeper节点
hbase.zookeeper.property.dataDir:zookeeper数据存放地址
hbase.rpc.timeout:rpc配置,不如此项不配置则默认半小时后关闭HMaster进程
<configuration>
<property >
<name>hbase.rootdir</name>
<value>hdfs://shb01:9000/hbase</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>/usr/local/hadoop_repo/hbase/tmp</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>shb01,192.168.79.139</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/hadoop_repo/hbase/zk</value>
</property>
<property>
<name>hbase.rpc.timeout</name>
<value>1440000</value>
</property>
<property>
<name>zookeeper.session.timeout</name>
<value>90000</value>
</property>
<property>
<name>hbase.zookeeper.property.tickTime</name>
<value>9000</value>
</property>
<property>
<name>hbase.regionserver.restart.on.zk.expire</name>
<value>true</value>
</property>
</configuration>
regionservers
在regionservers文件中加入节点信息
shb01
192.168.79.139
拷贝当前节点的hbase到139节点下
[root@shb01 local]# scp -r hbase-1.1.8/ root@192.168.79.139:/usr/local/
配置环境变量
在etc/profile中将hbase配置进去
export HBASE_HOME=/usr/local/hbase-1.1.8
exportPATH=.:$JAVA_HOME/bin:/usr/local/hadoop-2.6.0/bin:/usr/local/hadoop-2.6.0/sbin:/usr/local/sqoop-1.4.6/bin:$HBASE_HOME/bin:$PATH
最后在131节点启动hbase
[root@shb01 local]# start-hbase.sh
从输出信息看Hbase先启动zookeepr,再启动master,最后启动region server。之后在131上执行jps会看到有HMaster,HRegionServer,HQuorumPeer进程,139上有HRegionServer,HQuorumPeer进程。
注意要启动hadoop集群
浏览器中访问http://shb01:16010/可以看到hbase信息,页面显示server端口是16020
至此,一个简单的hbase集群搭建完毕。