导图社区 HBase基础
小白必备《HBase基础》,注释内含大量解析,无他唯手熟尔!满满干货!有需要的小伙伴赶快下载收藏哦~
编辑于2022-01-09 20:08:45HBase 基础
简介
HBase 与 NoSQL
NoSQL是一个通用术语,泛指一个数据库并不是使用SQL作为主要语言的非关系型数据库
HBase是BigTable的开源java版本。是建立在HDFS之上,提供高可靠性、高性能、列存储、可伸缩、实时读写NoSQL的数据库系统
HBase 特征
1)仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务 2)主要用来存储结构化和半结构化的松散数据 3)支持的数据类型:byte[] 4)主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加存储和处理能力 5)HBase中的表特点: 大:一个表可以有上十亿行,上百万列 面向列:面向列(族)的存储和权限控制,列(族)独立检索 稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏
HBase特点
1)强一致性读/写 2)自动分块 3)自动RegionServer故障转移 4)MapReduce 5)Java Client API 6)Thrift/REST API 7)块缓存和布隆过滤器 8)运行管理
集群搭建

HBase数据模型
简介
术语
表 Table
1)HBase中数据都是以表形式来组织的 2)HBase中的表由多个行组成
# HBase的WebUI node1.itcast.cn:16010

行 Row
1)HBASE中的行由一个rowkey(行键)和一个或多个列组成,列的值与rowkey、列相关联 2)行在存储时按行键按字典顺序排序 3)行键的设计非常重要,尽量让相关的行存储在一起
列 Column
列蔟 Column Family
1)每个列蔟都有一组存储属性,例如: · 是否应该缓存在内存中 · 数据如何被压缩或行键如何编码等 2)列蔟中不存储任何内容
列限定符(Column Qualifier)
1)列蔟中包含一个个的列限定符,这样可以为存储的数据提供索引 2)列蔟在创建表的时候是固定的,但列限定符是不作限制的
单元格 Cell
1)单元格是行、列蔟和列限定符的组合 2)包含一个值和一个时间戳(表示该值的版本) 3)单元格中的内容是以 byte[] 二进制存储的

常用shell操作
启动HBase Shell
增
创建表:create '表名','列蔟名'...
删
1)先禁用表:disable "表名" 2)再删除表:drop "表名"
删除指定行:deleteall '表名','rowkey'
清空表:truncate 'ORDER_INFO'
改
更新指定单元格:put '表名','ROWKEY','列蔟名:列名','值'
查
查看有什么表:list 扫描整张表:scan '表名',{FORMATTER => 'toString'} 扫描整张表,只显示3条:scan '表名', {LIMIT => 3, FORMATTER => 'toString'} 查看单独一行:get '表名','rowkey' 查看单独一行(显示中文):get '表名','rowkey', {FORMATTER => 'toString'}
统计表中有多少条数据:count '表名'
过滤器
scan '表名', { Filter => "过滤器(比较运算符, '比较器表达式')” }
# 查询状态为已付款的订单 scan 'ORDER_INFO', {FILTER => "SingleColumnValueFilter('C1', 'STATUS', =, 'binary:已付款')", FORMATTER => 'toString'}
shell管理操作
status 显示服务器状态

whoami 显示用户

list 显示当前所有表

count 统计指定表记录数

describle 展示表结构信息

exits 检查表是否存在

is_enabled、is_disabled 检查表是否启用或禁用

alter 改变表和列蔟的模式

disable/enable 禁用一张表/启用一张表
drop 删除一张表,记得在删除表之前必须先禁用
truncate 清空表的数据,禁用表-删除表-创建表
HBase高可用

HBase Java编程
HBase架构
HBase简单架构图
Master Server 1)监控RegionServer 2)处理RegionServer故障转移 3)处理元数据的变更 4)处理region的分配或移除 5)在空闲时间进行数据的负载均衡 6)通过Zookeeper发布自己的位置给客户端 Region Server 1)处理分配给它的Region 2)负责存储HBase的实际数据 3)刷新缓存到HDFS 4)维护HLog 5)执行压缩 6)负责处理Region分片
RegionServer结构
Store 1)Region按列蔟垂直划分为「Store」,存储在HDFS在文件中 MemStore 1)MemStore与缓存内存类似 2)当往HBase中写入数据时,首先是写入到MemStore 3)每个列蔟将有一个MemStore 4)当MemStore存储快满的时候,整个数据将写入到HDFS中的HFile中 StoreFile 1)每当任何数据被写入HBASE时,首先要写入MemStore 2)当MemStore快满时,整个排序的key-value数据将被写入HDFS中的一个新的HFile中 3)写入HFile的操作是连续的,速度非常快 4)物理上存储的是HFile WAL 1)WAL全称为Write Ahead Log,它最大的作用就是 故障恢复 2)WAL是HBase中提供的一种高并发、持久化的日志保存与回放机制 3)每个业务数据的写入操作(PUT/DELETE/INCR),都会保存在WAL中 4)一旦服务器崩溃,通过回放WAL,就可以实现恢复崩溃之前的数据 5)物理上存储是Hadoop的Sequence File
HBase 工作机制
读数据流程
hbase数据读取流程: 1)从zookeeper找到meta表的region的位置,然后读取meta表中的数据。而meta中又存储了用户表的region信息 2)根据namespace、表名和rowkey根据meta表中的数据找到对应的region信息 3)找到对应的regionserver,查找对应的region 4)先从MemStore找数据,再去BlockCache中找,如果没有,再到StoreFile上读 5)可以把MemStore理解为一级缓存,BlockCache为二级缓存,但注意scan的时候BlockCache意义不大,因为scan是顺序扫描
数据存储流程
HBase的数据存储过程是分为几个阶段的。写入的过程与HBase的LSM结构对应。 1)为了提高HBase的写入速度,数据都是先写入到MemStore(内存)结构中,V2.0 MemStore也会进行Compaction 2)MemStore写到一定程度(默认128M),由后台程序将MemStore的内容flush刷写到HDFS中的StoreFile 3)数据量较大时,会产生很多的StoreFile。这样对高效读取不利,HBase会将这些小的StoreFile合并,一般3-10个文件合并成一个更大的StoreFile
步骤1:数据写入MemStroe 1)Client访问zookeeper,从ZK中找到meta表的region位置 2)读取meta表中的数据,根据namespace、表名、rowkey获取对应的Region信息 3)通过刚刚获取的地址访问对应的RegionServer,拿到对应的表存储的RegionServer 4)去表所在的RegionServer进行数据的添加 5)查找对应的region,在region中寻找列族,先向MemStore中写入数据
步骤2:MenStore溢写合并 1)当MemStore写入的值变多,触发溢写操作(flush),进行文件的溢写,成为一个StoreFile 2)当溢写的文件过多时,会触发文件的合并(Compact)操作,合并有两种方式(major,minor)

步骤3:StoreFile合并 1)当MemStore超过阀值的时候,就要flush到HDFS上生成一个StoreFile。因此随着不断写入,HFile的数量将会越来越多,根据前面所述,StoreFile数量过多会降低读性能 2)为了避免对读性能的影响,需要对这些StoreFile进行compact操作,把多个HFile合并成一个HFile 3)compact操作需要对HBase的数据进行多次的重新读写,因此这个过程会产生大量的IO。可以看到compact操作的本质就是以IO操作换取后续的读性能的提高
Regin管理
regoin分配
1)一个region只能分配给一个region server 2)Master记录了当前有哪些可用的region server,以及当前哪些region分配给了哪些region server,哪些region还没有分配。当需要分配的新的region,并且有一个region server上有可用空间时,master就给这个region server发送一个装载请求,把region分配给这个region server。region server得到请求后,就开始对此region提供服务。
region server上线
1)Master使用ZooKeeper来跟踪region server状态 2)当某个region server启动时 1. 首先在zookeeper上的server目录下建立代表自己的znode 2. 由于Master订阅了server目录上的变更消息,当server目录下的文件出现新增或删除操作时,master可以得到来自zookeeper的实时通知 3. 一旦region server上线,master能马上得到消息。
region server下线
1)当region server下线时,它和zookeeper的会话断开,ZooKeeper而自动释放代表这台server的文件上的独占锁 2)Master就可以确定 1. region server和zookeeper之间的网络断开了 2. region server挂了 3)无论哪种情况,region server都无法继续为它的region提供服务了,此时master会删除server目录下代表这台region server的znode数据,并将这台region server的region分配给其它还活着的节点
Region分裂
1)当region中的数据逐渐变大之后,达到某一个阈值,会进行裂变 1. 一个region等分为两个region,并分配到不同的RegionServer 2. 原本的Region会下线,新Split出来的两个Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上。
自动分区

手动分区

Master工作机制
Master上线
从zookeeper上获取唯一一个代表active master的锁,用来阻止其它master成为master
Master下线
由于master只维护表和region的元数据,而不参与表数据IO的过程,master下线仅导致所有元数据的修改被冻结
HBase批量装载 - Bulk load
HBase的数据最终是需要持久化到HDFS HBase也有自己的数据格式,那就是HFile。Bulk Load就是直接将数据写入到StoreFile(HFile)中,从而绕开与HBase的交互,HFile生成后,直接一次性建立与HBase的关联即可。使用BulkLoad,绕过了Write to WAL,Write to MemStore及Flush to disk的过程
【java案例】 1. 导入POM依赖 2. 创建包结构 3. 导入配置文件 4. 检查windows环境变量 5. 编写实体类 6. 构建读取数据的Mapper 7. 编写驱动类 8. 上传数据文件到HDFS 9. 加载数据文件到HBase 10. MapReduce程序排错
HBase 协处理器
observer协处理器
endpoint协处理器
协处理器加载方式
静态加载方式( Static Load)

动态加载方式 ( Dynamic Load)

协处理器卸载

HBase 数据结构
常见数结构
二叉搜索树
平衡二叉树
红黑树
B树
B+树
稠密索引

稀疏索引

HBase 调优