写在前面:我是「且听风吟」,目前是某上市游戏公司的大数据开发工程师,热爱大数据开源技术,喜欢分享自己的所学所悟,现阶段正在从头梳理大数据体系的知识,以后将会把时间重点放在Spark和Flink上面。
如果你也对大数据感兴趣,希望在这个行业一展拳脚。欢迎关注我,我们一起努力,一起学习。博客地址:https://ropledata.blog.csdn.net
博客的名字来源于:且听风吟,静待花开。也符合我对技术的看法,想要真正掌握一门技术就需要厚积薄发的毅力,同时保持乐观的心态。
你只管努力,剩下的交给时间!
文章目录
- 一、前言
- 二、HBase起源
- 三、HBase优点及适用场景
- 四、HBase架构设计
- 五、HBase存储设计
- 5.1、HLog设计
- 5.2、HFile设计
- 六、HBase数据模型
- 七、极速安装配置
- 八、Shell操作
- 8.1、基础操作
- 8.2、表操作
- 九、总结
一、前言
本文HBase版本:2.1.3
HBase是大数据从业者必知必会的技能,我们需要掌握HBase的原理,架构设计,存储设计,优点及适用场景等方方面面。由于它的logo是一个海豚的形象,因此本文深入到HBase的起源开始分析,从0开始带你畅游大数据的海豚湾!
二、HBase起源
了解一个技术之前,我们要知道它是怎么来的,解决了什么问题,然后才会根据咱们自己的业务需要来考虑技术选型。
HBase最早起源于Google公司于2006年发表的BigTable论文,而后经过迅速的发展壮大,在2010年的时候成为了Apache的顶级项目。后来很多大公司都对HBase进行了符合自己业务风格的二次开发,就像flume一样,大部分我们也都能使用。
HBase是一个高可靠性、高性能、面向列、可伸缩的分布式开源数据库,也就是NoSQL数据库,注意这里的NoSQL是指not only sql的意思。其实在我看来,HBase不能完全称得上分布式数据库,它其实更像是分布式存储系统,有点像HDFS。因为它没有大多数数据库所具有的RDBMS特性,比如没有触发器,不支持列的类型,也不支持高级查询语句。
那它这么菜,是怎么在大数据圈混的风生水起的呢?
咱们接着往下看!
三、HBase优点及适用场景
前面我们了解了HBase的起源,也吐槽了它的一些缺点,那它还这么火,肯定是有原因的。它的优点可以归纳如下:
- 高可靠,和hadoop HA一样,可以进行自动的故障转移;
- 高性能,存储数据时可以自动分片,通过Region分散在整个集群里,同时随着行数不断增长,Region也可以自动的切分和再分配;
- 强读写一致,保证了读写一致,所以适合高速的计算聚合操作;
- 最初是Hadoop的子项目,因此和HDFS高度集成,自由衔接;
- 代码写着简单,HBase提供了便捷高效的API,同时目前还有Phoenix助力,可谓如虎添翼;
- 优化了列查询,提供了块缓存和布隆过滤器,可以更高效的进行列查询。
结合这些HBase的优点,相信大家可以理解为什么我觉得HBase更像是一个分布式存储系统了吧?那它适合的业务场景也显而易见,可以概括如下:
-
海量数据存储
作为大数据的海豚湾,HBase有容乃大,它非常适合存储海量数据,比如百亿行的数据。因此在大数据体系里,可以使用HBase存储日志数据,各种组件的日志,业务操作日志等等疯狂往里塞。
-
实时列查询
前面我们介绍HBase优点的时候,已经说了HBase对于列查询做了很多优化,因此即使HBase存储着海量数据,你依然可以很快的查询到想要的RowKey对应的数据,因此在实际业务里HBase也经常应用于实时的查询场景。
看到这里更能感受到它的重要性了吧?下面我们接着分析HBase的结构设计。
四、HBase架构设计
从图中可以看出Hbase是由Client、Zookeeper、Master、HRegionServer、HDFS等几个组件组成,下面来介绍一下几个组件的相关功能:
从上面这个图里,我们可以发现HBase是由Client、Zookeeper、HMaster、HRegionServer、HDFS等几个组件组成,那么它们都有什么作用呢?可以概括如下:
- Client:其实client不仅包含了访问Hbase的接口,还维护了对应的cache来加速Hbase的访问,比如cache的.META.元数据的信息。
- Zookeeper:在大数据生态里zookeeper是很常见的,它主要作为分布式的协调。在HBase里它主要负责的工作如下:
- 保证集群中只有1个master在运行,如果master异常,会通过竞争机制产生新的master来提供服务;
- 监控RegionServer的状态,当RegionSevrer有异常的时候,通过回调的形式通知Master RegionServer上下线的信息;
- 通过Zoopkeeper存储元数据的统一入口地址。
- HMaster:其实HMaster是Master Server的实现,它主要负责监控集群中的RegionServer实例,并为RegionServer分配Region,同时它还维护整个集群的负载均衡,是所有元数据(metadata)改变的接口。一般在集群里它通常运行在NameNode上,并会运行两个后台线程:
- LoadBalancer线程,控制region来平衡集群的负载;
- CatalogJanitor线程,周期性的检查hbase:meta表。
- HRegionServer:其实它就相当于hadoop的DataNode,是RegionServer的实现,用来管理master为其分配的Region,并处理来自客户端的读写请求,负责和底层HDFS交互并存储数据到HDFS,Region变大以后的拆分,以及Storefile的合并工作,集群中RegionServer运行在DataNode上。
- HDFS:HDFS是HBase运行的底层的文件系统,为HBase提供高可用(Hlog存储在HDFS)的支持,提供元数据和表数据的底层分布式存储服务同时实现了数据多副本,保证了高可靠和高可用性。
了解了HBase的架构设计,那么HBase底层存储是怎么实现的呢?咱们接着往下看。
五、HBase存储设计
咱们分析HBase的数据存储方式,其实就是探讨数据如何在磁盘上进行有效的组织。因为我们通常以如何高效读取和消费数据为目的,而不是数据存储本身。其实在HBase中,表被分割成很多个更小的块然后分散的存储在不同的服务器上,这些小块叫做Regions,存放Regions的地方叫做RegionServer。Master进程负责处理不同的RegionServer之间的Region的分发,在Hbase实现中HRegionServer和HRegion类代表RegionServer和Region。HRegionServer除了包含一些HRegions之外,还会处理HLog和HFile两种类型的文件用于数据存储。
5.1、HLog设计
HFile是预写日志文件,也称为WAL,是write-ahead log的简称。关于HLog我们知道如下内容就可以了:
-
MasterProcWAL:HMaster记录管理操作,比如解决冲突的服务器,表创建和其它DDLs等操作到它的WAL文件中,这个WALs存储在MasterProcWALs目录下,它不像RegionServer的WALs,HMaster的WAL也支持弹性操作,就是如果Master服务器挂了,其它的Master接管的时候继续操作这个文件。
-
WAL记录所有的Hbase数据改变,如果一个RegionServer在MemStore进行FLush的时候挂掉了,WAL可以保证数据的改变被应用到。如果写WAL失败了,那么修改数据的完整操作就是失败的。
-
通常情况,每个RegionServer只有一个WAL实例。在2.0之前,WAL的实现叫做HLog
-
WAL位于*/hbase/WALs/*目录下
-
MultiWAL: 如果每个RegionServer只有一个WAL,由于HDFS必须是连续的,导致必须写WAL连续的,然后出现性能问题。MultiWAL可以让RegionServer同时写多个WAL并行的,通过HDFS底层的多管道,最终提升总的吞吐量,但是不会提升单个Region的吞吐量。
-
-
启用multiwal的配置代码:
// 启用multiwal <property> <name>hbase.wal.provider</name> <value>multiwal</value> </property>
5.2、HFile设计
HFile才是真实的数据存储文件,是Hbase在HDFS中存储数据的格式,它包含多层的索引,这样在Hbase检索数据的时候就不用完全的加载整个文件。索引的大小(keys的大小,数据量的大小)影响block的大小,在大数据集的情况下,block的大小设置为每个RegionServer 1GB也是常见的。
如果想更深入了解HBase的数据存储流程,我之前写过一篇文章,感兴趣的话可以参考:如何像海豚一样在数据海洋里遨游?|Hbase数据处理流程详解
六、HBase数据模型
了解了HBase的数据存储,那咱们还要了解一下HBase的数据模型,才能更好的掌握它。
首先我们需要知道如下这些术语的意义:
- Table:HBase的table是由多个行组成的;
- Row:一个行在Hbase中由一个或多个有值的列组成。Row按照字母进行排序,因此行健的设计非常重要。这种设计方式可以让有关系的行非常的近,通常行健的设计是网站的域名反转,比如(org.apache.www, org.apache.mail, org.apache.jira),这样的话所有的Apache的域名就很接近;
- Column:列由列簇加上列的标识组成,一般是“列簇:列标识”,创建表的时候不用指定列标识;
- Column Family:列簇在物理上包含了许多的列与列的值,每个列簇都有一些存储的属性可配置。例如是否使用缓存,压缩类型,存储版本数等。在表中,每一行都有相同的列簇,尽管有些列簇什么东西也没有存;
- Column Qualifier:列簇的限定词,理解为列的唯一标识。但是列标识是可以改变的,因此每一行可能有不同的列标识;
- Cell:Cell是由row,column family,column qualifier包含时间戳与值组成的,一般表达某个值的版本;
- Timestamp:时间戳一般写在value的旁边,代表某个值的版本号,默认的时间戳是你写入数据的那一刻,但是你也可以在写入数据的时候指定不同的时间戳
我们还需要知道HBase 是一个稀疏的、分布式、持久、多维、排序的映射,它以行键(row key),列键(column key)和时间戳(timestamp)为索引。
HBase在存储数据的时候,有两个SortedMap,首先按照rowkey进行字典排序,然后再对Column进行字典排序。
其实HBase表设计的好坏关键在于RowKey设计的质量,想要设计出一个尽可能完美的rowkey可以参考之前的一篇文章:大白话彻底搞懂HBase RowKey详细设计,这里我们就不再详细展开了。
好了,下面就开始极速的安装配置,进行HBase的使用吧!
七、极速安装配置
之前和一些大数据部门的同事以及初入大数据的萌新聊过,大家最初学习大数据的时候,最深恶痛绝的就是各个组件的安装配置问题。当初我学大数据那会,几乎每个组件都安装配置5遍以上,虽然安装配置也能学到一些内部的原理,但更多的还是浪费时间。
直到后来我接触了docker,由衷的发出了“人生苦短,我用docker”的感概。docker最大的好处就是可以直接使用前辈大牛们已经搭建好的环境,完美的复制到自己电脑上来,我们还可以加以修改变成自己的。真正的一次搭建,到处运行!好,废话不多说,下面开始授人以渔:
-
首先你要有个装有dokcer环境的电脑,虽然所有系统都是通用的,但还是推荐windows和macos系统。关于安装docker不再赘述,大家可以根据自己的电脑系统去查一下如何安装,网上这方面资料很多。
-
执行如下命令查看目前有哪些可用的HBase镜像:
docker search Hbase
-
可以发现第一个用的人最多,我们就用它了,执行如下命令,把这个镜像拉下来:
docker pull harisekhon/hbase
-
现在镜像也有了,直接把这个镜像运行起来就可以了,运行起来之后成为容器,运行命令如下:
docker run -d --name hbase001 -p 16010:16010 harisekhon/hbase:latest
-
现在镜像已经启动为容器了,我们只要进去这个容器里面就可以玩HBase了,执行如下命令进入HBase容器:
docker exec -it hbase001 bin/bash
-
进入容器后,执行hbase shell,就可以进入咱们hbase shell界面了:
hbase shell
可以看到,我们安装的正是HBase 2.1.3版本,这时候如果打开浏览器输入你的ip加端口16010,就可以看到如下web页面:
那到这里我们对HBase 2.1.3的安装配置就完成了,是不是很快很简单?如果你对这些docker命令不熟,相信我先记住,不管是安装哪个单一组件,都是这几个常用命令就搞定了。如果要安装完整的集群,就是想把整个大数据生态安装进来,网上也有现成的镜像,直接使用docker-compose就可以了。后面如果有时间,建议还没学习docker的朋友先花2天时间把docker搞定,后面再学大数据就事半功倍了。
到这里我们已经安装完成了,下面就开始愉快的玩耍吧~
八、Shell操作
既然是个数据库,那我们就先熟悉它的命令行操作,HBase在自身的/bin/目录下提供了一个命令行工具。
8.1、基础操作
-
首先进入HBase shell命令后
./hbase shell
-
查看帮助信息
help
-
退出hbase shell命令行
使用exit或者quit
8.2、表操作
-
查看当前有哪些表
list
-
新建一个表(注意新建表必须指定表名称和列族名)
如下命令创建了一个csdn表,列族是ropledata create 'csdn','ropledata'
注意:只会这个基础的建表语句是远远不够的,我们可以使用前面介绍的帮组命令查看更丰富的建表语法:help "create"
比如实际生产中,我们创建表的时候需要指定过期时间,还需要指定数据分配到各个region的切分方式,一般使用下面这个命令创建:
create 'csdn', {NAME =>'ropledata', COMPRESSION => 'SNAPPY',TTL => '1296000'},{SPLITS => ['09_', '18_', '27_', '36_', '45_', '54_', '63_', '72_', '81_', '90_']}
如上这个命令,我们设置了列族为 ropledata的过期时间是1296000秒,也就是15天。
-
列出表的信息
list "csdn"
-
查看表的详细描述信息
describe "csdn"
-
插入数据
put 'csdn','001','ropledata:a','1'
-
查看表里的数据
scan 'csdn'
注意:只会这个也是远远不够的,通常HBase表数据庞大,这样全局扫描,怕是要写检讨。
老方法,使用帮助命令查看scan有哪些方法:
help "scan"
这里会发现scan命令还是很丰富的,比如我们有上亿条数据,想要查看前10条,就可以使用:
scan 'csdn',{LIMIT=>10}
还可以指定起始rowkey来查询:
scan 'csdn',{STARTROW => '001', STOPROW => '100'}
scan命令是很有趣的,大家有时间可以安装帮助命令的提示逐个玩一下。
-
查看某个rowkey或者它下面的列族的数据
get 'csdn','001' get 'csdn','002','ropledata:b'
-
修改某个列下的数据,其实HBase里修改操作也是用put,当列相同时会把之前列的值给覆盖掉。
put 'csdn','002','ropledata:b','520'
-
统计表一共有多少rowkey,也就是行数
count 'csdn'
-
删除数据
-
删除指定rowkey下某列数据
delete 'csdn','001','ropledata:a'
-
删除指定rowkey下所有数据
deleteall 'csdn','001'
-
-
清空表数据(注意:清空表的操作顺序为先disable,然后再truncate,直接truncate时HBase可以自动先disable)
truncate 'csdn'
-
删除表
删除表必须分两步,不然会报错(ERROR: Table student is enabled. Disable it first.),第一步先disable表:
disable 'csdn'
第二步执行drop命令:
drop 'csdn'
-
变更表信息用alter,这里就不再赘述了,感兴趣的朋友可以使用help来练习。
提示:清空表的操作顺序为先disable,然后再truncate。
九、总结
本文从HBase的起源入手分析,和大家一起回顾了HBase的原理,架构设计,存储设计,优点及适用场景。并用docker快速构建了一个HBase2.x的环境,然后对hbase shell进行了介绍和操作演示。由于一般企业里不推荐使用原生HBase API写代码(不利于监控),因此一般公司有自己封装的API方法,所以本文不再赘述api的使用了,如果对原生HBase API感兴趣的话,可以去官网学习并使用。
如果您对我的文章感兴趣,欢迎关注点赞收藏,如果您有疑惑或发现文中有不对的地方,还请不吝赐教,非常感谢!!