海量列式非关系数据库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生态圈的快速发展过程中,涌 ...
随机推荐
- 编程熊讲解LeetCode算法《二叉树》
大家好,我是编程熊. 往期我们一起学习了<线性表>相关知识. 本期我们一起学习二叉树,二叉树的问题,大多以递归为基础,根据题目的要求,在递归过程中记录关键信息,进而解决问题. 如果还未学习 ...
- Linux虚拟机配置SSH免密登录
本环境为CentOS 7(点击镜像下载iso文件),无图界面. 启动SSH服务 在/usr/sbin/有一个文件为sshd,然后输入绝对路径/usr/sbin/sshd即可开启ssh服务. 然后输入命 ...
- 关于Algorithm in Nutshell源代码
获取源码包 "Algorithm in Nutshell"的源码包ADK-1.0.zip在这本书主页上"Download Example Code"页面的Rel ...
- 卓越的教练是如何训练高手的?(谈谈memmove)
编者按:我们知道,优秀的运动员除了自身的天赋和努力之外,出色的教练必不可少.一个成功的企业除了拥有出类拔萃的员工之外,同样需要一位出色的教练,那就是企业的CEO.由此可见,如果我们要想成为一位优秀的程 ...
- Golang语言系列-01-Go语言简介和变量
Go语言简介 Go(又称Golang)是Google开发的一种静态强类型.编译型.并发型,并具有垃圾回收功能的编程语言. 罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pi ...
- Vue系列-03-vue-cli自动化工具
使用Vue-CLI创建项目 安装vue-cli脚手架 Mac安装vue-cli脚手架 lichengguo@lichengguodeMacBook-Pro ~ % sudo npm install - ...
- noip34
因为改不动T3而来水博客的屑 昨晚没睡好,大致看了一遍题面后,选择了死亡231,然后就死的很惨. T1 一开始大致看题面的时候,就略了一眼,加上没读全题,啥思路也没有,最后四十分钟滚回来看了看,发现就 ...
- shell脚本基本使用教程
sh脚本的固定第一行 #!/bin/bash 变量 #!/bin/bash var1=1 var2=2 var3=$[var1+var2] echo "$var3" 传达参数 sh ...
- Centos7上yum安装mongodb(安装epel中的版本可能会比较老)
yum install epel-release 搜索mongodb-server 安装mongodb yum install mongodb-server.x86_64 配置mongodb vim ...
- TypeScript 入门指南 【大白话】
前言 聊聊为何要学习TypeScript? 从开发角度来讲, TypeScript 作为强类型语言,对属性有类型约束.在日常开发中少了减少了不必要的因参数类型造成的BUG,当你在使用同事封装好的函数时 ...