前言:
之前已经讲解了Hive,HDFS。本篇来讲HBase。前面有介绍Hadoop相关的组件安装及使用,此文将针对Hadoop中的HDFS的基础上搭建HBase,有兴趣的可以往回看我写的Hadoop其他文章。
一、概念
HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的 分布式存储系统 ”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
1.2:HBase系统架构
ClientHBase Client使用HBase的RPC机制与HMaster和HRegionServer进行通信,对于管理类操作,Client与HMaster进行RPC;对于数据读写类操作,Client与HRegionServer进行RPC
- Zookeeper
Zookeeper Quorum中除了存储了-ROOT-表的地址和HMaster的地址,HRegionServer也会把自己以Ephemeral方式注册到Zookeeper中,使得HMaster可以随时感知到各个HRegionServer的健康状态。此外,Zookeeper也避免了HMaster的单点问题,见下文描述
- HMaster
HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行,HMaster在功能上主要负责Table和Region的管理工作:
1. 管理用户对Table的增、删、改、查操作
2. 管理HRegionServer的负载均衡,调整Region分布
3. 在Region Split后,负责新Region的分配
4. 在HRegionServer停机后,负责失效HRegionServer 上的Regions迁移
- HRegionServer
HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。
HRegionServer内部管理了一系列HRegion对象,每个HRegion对应了Table中的一个Region,HRegion中由多个HStore组成。每个HStore对应了Table中的一个Column Family的存储,可以看出每个Column Family其实就是一个集中的存储单元,因此最好将具备共同IO特性的column放在一个Column Family中,这样最高效。
HStore存储是HBase存储的核心了,其中由两部分组成,一部分是MemStore,一部分是StoreFiles。MemStore是Sorted Memory Buffer,用户写入的数据首先会放入MemStore,当MemStore满了以后会Flush成一个StoreFile(底层实现是HFile),当StoreFile文件数量增长到一定阈值,会触发Compact合并操作,将多个StoreFiles合并成一个StoreFile,合并过程中会进行版本合并和数据删除,因此可以看出HBase其实只有增加数据,所有的更新和删除操作都是在后续的compact过程中进行的,这使得用户的写操作只要进入内存中就可以立即返回,保证了HBase I/O的高性能。当StoreFiles Compact后,会逐步形成越来越大的StoreFile,当单个StoreFile大小超过一定阈值后,会触发Split操作,同时把当前Region Split成2个Region,父Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上。下图描述了Compaction和Split的过程:
在理解了上述HStore的基本原理后,还必须了解一下HLog的功能,因为上述的HStore在系统正常工作的前提下是没有问题的,但是在分布式系统环境中,无法避免系统出错或者宕机,因此一旦HRegionServer意外退出,MemStore中的内存数据将会丢失,这就需要引入HLog了。每个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中(HLog文件格式见后续),HLog文件定期会滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的 HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应region的目录下,然后再将失效的region重新分配,领取 到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。
1.3、Hbase与关系型数据的区别
二、下载
wget https://archive.apache.org/dist/hbase/hbase-1.4.11/hbase-1.4.11-bin.tar.gz
以下是HBase各版本和Hadoop版本的支持情况,官方有相关说明,下面表格中:
"S" = 支持
"X" = 不支持
"NT" = 未测试
我的Hadoop版本是2.6.0的
三、解压并指定目录
tar -zxvf hbase-1.4.11-bin.tar.gz -C /usr/java/big_data/
四、修改配置文件
1、配置环境变量
vim etc/profile
2、修改hbase-env.sh文档
进入hbase目录下,执行下面的语句进行编辑hbase-env.sh文档,在保存时,如果不让保存,要确认当前用户是否有编辑权限
vim conf/hbase-env.sh
#查看JDK路径
java -verbose
3、配置hbase-site.xml文档
vim conf/hbase-site.xml
配置文档添加以下内容
<configuration>
<property>
<name>hbase.rootdir/<name>
<value>hdfs://localhost:9000/hbase/<value>
<property>
<name>hbase.zookeeper.property.dataDir/<name>
<value>/home/hadoop_data/zookeeper/<value>
<property>
<name>hbase.cluster.distributed/<name>
<value>true/<value>
内容解析:
- hbase.rootdir:访问地址
- hbase.zookeeper.property.dataDir:ZK的数据存储位置,可随意定义
- hbase.cluster.distributed:是否集群,就算单机也可以算是集群,所以为true,方便你升级转集群少改点配置
五、启动Hbase
./bin/start-hbase.sh
启动成功后,会输出三个日志,我们使用jps查看进程,发现,在HDFS和HIVE的基础上又多了三个进程。是否还记得前面我们设置ZK的地址吗?在图二中,可以看到,在HBase启动后,自动帮我们创建了一个zookeerper文件,并且在文件里生成了一些文档。这三个进程在前面的概念中有介绍。
- HQuorumPeer:Zookeeper进程
- HMaster:master进程
- Hregionserver:Hregionserver进程
六、验证Hbase与HDFS连接
我们回到Hadoop的目录下,执行hdfs dfs -ls /命令来查看一下是否有hbase的目录,这说明Hbase与HDFS已经连接配置成功。看创建时间,跟上图的ZK是一个时间。到此Hbase单节点群集就已经搭建完成,看似简单,其实还需要结合前面的Hadoop的HDFS的搭建能使用。所以才建议大家回过头去看我之前写的其他的文章一起结合起来阅读。
七、HBase Shell命令
1、启动Shell命令窗口
回到Hbase目录,执行./bin/hbase shell命令,进入shell窗口,如下图所示,进入命令行后,就可以使用上面的Shell命令
2、Status:返回hbase集群的状态信息:如下图,1个活跃master,0个备用masters,1个服务
3、Version:HBase版本号
4、List:列出hbase中存在的所有表,从下图可以看出,第一次list没有看到表的存在,当我们创建一个表时,再执行第二次list,可以看到刚创建的表
5、Create:创建表;create 表名,列族名1,列族名2.......
6、Alter:修改列族(column family)模式:可以在已有的表进入列族修改,比如增加或删除
7、Count:统计表中行的数量
8、Put:向指向的表单元添加值
9、Delete: 删除指定对象的值(可以为表,行,列对应的值,另外也可以指定时间戳的值)
10、Deleteall:删除指定行的所有元素值
11、Scan:通过对表的扫描来获取对用的值
八、结束语
。。。。。还有其他命令,有兴趣的小伙伴可以网上查询,对于HBASE的执行原理,我将在会其他文章中介绍,本篇已写太多,就不便详细介绍。请关注我,后续会继续介绍其他内容,包括使用JAVA如何调用HBASE,Spark操作等文章分享。
閱讀更多 IT追夢—廈門站 的文章