海量列式非关系数据库HBase 原理深入
HBase读数据流程:
前置关键词描述:
- Block Cache :读缓存,缓存上一次读的数据,整个ReginServer只有一个
- MemStore :写缓存,缓存上一次写的数据,每个Store有一个
- WAL: 预写入日志
读取数据流程:
- 1.请求zk 查询meta表的地址
- 2.根据meta表的地址查询rowkey属于哪个reginserver的哪个regin,元数据缓存到MetaCache
- 3.先去BlockCache 和MemStore查找,找不到才去storeFile找,如果在storeFile 查询到,就缓存到BlockCache里
HBase写数据流程:
写数据流程:
- 1.请求zk 查询meta表的地址
- 2.根据meta表的地址查询rowkey属于哪个reginserver的哪个regin,元数据缓存到MetaCache
- 3.先写WAL,再写MemStore,写入MemStore就返回了,
- 如果MemStore内存不够,会flush storeFile文件,然后合并多个storeFile
注: Hbase的写流程比读流程效率高,因为写流程只需要写入内存,读流程先读内存,如果读不到,还需要读磁盘文件。
HBase的flush(刷写) 机制:
刷写条件:
- 1.MemStore大小达到128M
- 2.时间超过1小时
- 3.Reginserver的所有Memstore大小达到reginserver占用的堆内存大小的40%
注: 上述条件默认每10s检查一次
为防止检查之前达到刷写条件,会触发阻塞机制.
阻塞机制触发条件:
- Memstore达到512M
- Reginserver的所有Memstore大小达到堆内存的0.95*0.4
避免阻塞机制的解决方案:
如果出现这种情况,可以增大memstore大小,增大reginserver的堆内存大小。
Compact合并机制:
minor compact 小合并:
文件被选中条件:
- 1. 待合并文件数量大于3
- 2.待合并文件数量 小于10
- 3.文件大小小于128M的文件一定会加入
- 4.排除特别大的文件
合并触发条件:
- 1.menstore flush
- 2.定期检查,默认10s
Major compact:
- 合并所有的HFile,默认7天执行一次,生产中默认关闭
- 手动:major_compact 表名
注意:真正的删除是在这一步进行
Region 拆分机制:
IncreasingToUpperBoundRegionSplitPolicy:
0.94版本~2.0版本默认切分策略:
切分策略稍微有点复杂,总体看和ConstantSizeRegionSplitPolicy思路相同,一个region大小大于设
置阈值就会触发切分。但是这个阈值并不像ConstantSizeRegionSplitPolicy是一个固定的值,而是会
在一定条件下不断调整,调整规则和region所属表在当前regionserver上的region个数有关系.
region split的计算公式是:
regioncount^3 * 128M * 2,当region达到该size的时候进行split
例如:
第一次split:1^3 * 256 = 256MB
第二次split:2^3 * 256 = 2048MB
第三次split:3^3 * 256 = 6912MB
第四次split:4^3 * 256 = 16384MB > 10GB,因此取较小的值10GB
后面每次split的size都是10GB了
SteppingSplitPolicy:
2.0版本默认切分策略,其它版本参考百度:
这种切分策略的切分阈值又发生了变化,相比 IncreasingToUpperBoundRegionSplitPolicy 简单了
一些,依然和待分裂region所属表在当前regionserver上的region个数有关系,如果region个数等于
1,
切分阈值为flush size(128M) * 2,否则为MaxRegionFileSize(10GB)。这种切分策略对于大集群中的大表、小表会
比 IncreasingToUpperBoundRegionSplitPolicy 更加友好,小表不会再产生大量的小region,而是
适可而止。
Hbase 预分区:
为了负载均衡,提高读写效率,否则刚开始读写都在一个机器上进行。
通常解决负载均衡问题,还有以下解决方案:
- 给row key 加前缀
- 对row key 进行hash
- 反转
Region 合并:
Region的合并不是为了性能,而是出于维护的目的。
通过Merge类冷合并Region:
- 需要先关闭hbase集群
- 需求:需要把student表中的2个region数据进行合并:
student,,1593244870695.10c2df60e567e73523a633f20866b4b5.
student,1000,1593244870695.0a4c3ff30a98f79ff6c1e4cc927b3d0d.
这里通过org.apache.hadoop.hbase.util.Merge类来实现,不需要进入hbase shell,直接执行(需要 先关闭hbase集群):
hbase org.apache.hadoop.hbase.util.Merge student \
student,,1595256696737.fc3eff4765709e66a8524d3c3ab42d59. \
student,aaa,1595256696737.1d53d6c1ce0c1bed269b16b6514131d0.
通过online_merge热合并Region:
- 不需要关闭hbase集群,在线进行合并。
与冷合并不同的是,online_merge的传参是Region的hash值,而Region的hash值就是Region名称的最
后那段在两个.之间的字符串部分。
需求:需要把lagou_s表中的2个region数据进行合并:
student,,1587392159085.9ca8689901008946793b8d5fa5898e06. \
student,aaa,1587392159085.601d5741608cedb677634f8f7257e000.
需要进入hbase shell:
merge_region
'c8bc666507d9e45523aebaffa88ffdd6','02a9dfdf6ff42ae9f0524a3d8f4c7777'
RowKey 设计:
- RowKey长度原则
- rowkey是一个二进制码流,可以是任意字符串,最大长度64kb,实际应用中一般为10-100bytes, 以byte[]形式保存,一般设计成定长。
- 建议越短越好,不要超过16个字节 设计过长会降低memstore内存的利用率和HFile存储数据的效率。
- RowKey散列原则
- 建议将rowkey的高位作为散列字段,这样将提高数据均衡分布在每个RegionServer,以实现负载均 衡的几率。
- RowKey唯一原则
- 必须在设计上保证其唯一性
- RowKey排序原则
- HBase的Rowkey是按照ASCII有序设计的,我们在设计Rowkey时要充分利用这点
scan使用的时候注意:setStartRow,setEndRow 限定范围, 范围越小,性能越高。
海量列式非关系数据库HBase 原理深入的更多相关文章
- 海量列式非关系数据库HBase 架构,shell与API
HBase的特点: 海量存储: 底层基于HDFS存储海量数据 列式存储:HBase表的数据是基于列族进行存储的,一个列族包含若干列 极易扩展:底层依赖HDFS,当磁盘空间不足的时候,只需要动态增加Da ...
- 列式存储hbase系统架构学习
一.Hbase简介 HBase是一个开源的非关系型分布式数据库(NoSQL),它参考了谷歌的BigTable建模,实现的编程语言为 Java.它是Apache软件基金会的Hadoop项目的一部分,运行 ...
- 【HBase】与关系型数据库区别、行式/列式存储
[HBase]与关系型数据库区别 1.本质区别 mysql:关系型数据库,行式存储,ACID,SQL,只能存储结构化数据 事务的原子性(Atomicity):是指一个事务要么全部执行,要么不执行,也就 ...
- HBase 是列式存储数据库吗
在介绍 HBase 是不是列式存储数据库之前,我们先来了解一下什么是行式数据库和列式数据库. 行式数据库和列式数据库 在维基百科里面,对行式数据库和列式数据库的定义为:列式数据库是以列相关存储架构进行 ...
- Hbase与Oracle比较(列式数据库与行式数据库)
Hbase与Oracle比较(列式数据库与行式数据库) 1 主要区别 Hbase适合大量插入同时又有读的情况 Hbase的瓶颈是硬盘传输速度,Oracle的瓶颈是硬盘寻道时间. Hbase本质上只 ...
- Hadoop HBase概念学习系列之HBase里的列式数据库(十七)
列式数据库,从数据存储方式上有别于行式数据库,所有数据按列存取. 行式数据库在做一些列分析时,必须将所有列的信息全部读取出来 而列式数据库由于其是按列存取,因此只需在特定列做I/O即可完成查询与分析, ...
- 列式数据库~clickhouse 底层存储原理
简介:今天介绍列式数据库的一些基本原理 一 数据目录 Data目录 数据存储目录,数据按照part分成多个文件夹,每个文件夹下存储相应数据和对应的元信息文件 Metadata 表定义语句,存储所有表 ...
- 图解大数据 | 海量数据库查询-Hive与HBase详解
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/84 本文地址:http://www.showmeai.tech/article-det ...
- Parquet与ORC:高性能列式存储格式(收藏)
背景 随着大数据时代的到来,越来越多的数据流向了Hadoop生态圈,同时对于能够快速的从TB甚至PB级别的数据中获取有价值的数据对于一个产品和公司来说更加重要,在Hadoop生态圈的快速发展过程中,涌 ...
随机推荐
- Sqlserver 关于varchar(max) 笔记
看SQL server的版本,SQLserver2005以上 的nvarchar(max) 可以存放2G的内容,所以要是 SQL2005以上的nvarchar(max)足够你用的了.用nvarchar ...
- Sth about Educational DP Contest
Contest Website : atcoder.jp/contests/dp \[\begin{array}{c|C|c|c} TaskNum & TaskName & Statu ...
- Java 7 新特性之try-with-resources实践理解
想象这么一个情景,我们需要使用一个资源,在使用完之后需要关闭该资源,并且使用该资源的过程中有可能有异常抛出.此时我们都会想到用try-catch语句,在finally中关闭该资源.此时会有一个问题,如 ...
- Java 浮点数精确性探讨(IEEE754 / double / float)与 BigDecimal 解决方案
一.抛砖引玉 一个简单的示例: double a = 0.0; IntStream.range(0,3).foreach(i->a+=0.1); System.out.println(a); / ...
- MSF+Nmap TCP空闲扫描
MSF+Nmap TCP空闲扫描 前言 TCP空闲扫描是一种高级的扫描技术,可以冒充内网中另一台IP地址来对内网中的目标进行隐秘的扫描. 正文 在进行扫描之前,我们需要了解一个概念,即递增IP帧标识, ...
- 如何在 Matlab 中绘制带箭头的坐标系
如何在 Matlab 中绘制带箭头的坐标系 如何在 Matlab 中绘制带箭头的坐标系 实现原理 演示效果 完整代码 实现原理 使用 matlab 的绘制函数时,默认设置为一个方框形的坐标系, 图1 ...
- PTA数据结构习题集
https://blog.csdn.net/qq_43733499/category_8956159.html https://www.cnblogs.com/nonlinearthink/tag/% ...
- 数字化转型:敏捷和DevOps如何降低风险,提高速度
进行数字化转型就意味着团队需要应对经常发生冲突的挑战--例如,要应对在复杂的相互依赖环境中快速变化的需求.对软件开发人员来说,这是一个熟悉的困境. 如果使用传统的瀑布方法来应对这些挑战,就会发现,在线 ...
- IM敏感词算法原理和实现
效果 C++实现的代码请移步: Github-cpp-dirtyfilter 用法和效果: int main() { std::vector<std::string> words = { ...
- Docker开启TLS和CA认证
前言:Docker直接开启2375端口是不安全的,别人只要连上之后就可以任意操作,下面是开启Docker的TLS和CA认证方法,并使用Jenkins和Portainer连接. 一.生成证书 查看服务器 ...