HBase进阶
date: 2020-10-26 15:43:00
updated: 2020-10-26 18:45:00
HBase进阶
1. 架构
master负责管理多个region server,一个region server里有多个region。
一个表会划分多个region,起初只有一个,数据增多,region增大到一定程度会拆分成2个region
一个表最终被保存在多个region server里
hmaster挂了不影响读写,但是 create table 这种涉及元数据的操作,如果hmaster挂了就会报错
一个region里有多个store,一个store代表一个列族。(region按照行键来划分,所以相当于每一行有几个列族就有几个store)
store包括两部分:内存中的memstore和磁盘的storefile。写数据会先写到memstore,当数据达到阈值(默认64M)后 region server 会启动 flushcache 进行将数据写到 storefile里,每次形成一个storefile
当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、major ),在合并过程中会进行版本合并和删除工作(major),形成更大的storefile
当一个region所有storefile的大小和数量超过一定阈值后,会把当前的region分割为两个,并由hmaster分配到相应的regionserver,实现负载均衡
客户端检索数据,先在memstore找,找不到再去blockcache查找,找不到再找storefile,即:client->memstore->blockcache->storefile。如果读到了会把数据放到blockcache里缓存,方便下次读取
Region是HBase中存储和负载均衡的最小单元,不同的Region可以分布在不同的 Region Server上
Region由一个或者多个Store组成,每个store保存一个columns family
每个Strore又由一个memStore和0至多个StoreFile组成
memstore为写入缓存,blockcache为读取缓存
2. 写数据
- Client 向 zk 发送请求,请求 meta 表所有的 regionServer
- zk 返回 regionServer 地址
- Client 获取到 meta 表,请求对应的 region 所在的 regionServer
- 返回 meta 表数据
- Client 向 regionServer 发送写数据请求
- 写入 wal(write ahead log)
- 将数据写入 memstore
- regionServer 反馈给 Client 写入成功
在 0.9 版本(低版本)时,还存在一个 -ROOT- 表,作用是为了避免meta表过大而拆分为多个子表,可以通过 -ROOT- 表来对meta表进行管理
第6步和第7步 具体流程如下:
hbase-server-2.3 版本 搜索 HRegion 类,再搜索 STEP 1,
doMiniBatchMutate(BatchOperation<?> batchOp)
方法即为写数据的部分// STEP 1. Try to acquire as many locks as we can and build mini-batch of operations with locked rows => 写入之前先获取锁 // STEP 2. Update mini batch of all operations in progress with LATEST_TIMESTAMP timestamp
// We should record the timestamp only after we have acquired the rowLock,
// otherwise, newer puts/deletes are not guaranteed to have a newer timestamp => client如果不传时间戳,会自动获取服务器端的时间戳 // STEP 3. Build WAL edit
// STEP 4. Append the WALEdits to WAL and sync. // STEP 5. Write back to memStore
hbase-server-1.3 版本
doMiniBatchMutate(BatchOperation<?> batchOp)
方法不一样。也是先Build WAL edit
,写入日志,但是并没有先同步,而且先写入memstore,在 finally 那里去判断 wal log 是否同步成功,如果不成功,回滚 memstore 记录
写数据时会先向hlog写(方便memstore里的数据丢失后根据hlog恢复,向hlog中写数据的时候也是优先写入内存,后台会有一个线程定期异步刷写数据到hdfs,如果hlog的数据也写入失败,那么数据就会发生丢失)
频繁的溢写会导致产生很多的小文件,因此会进行文件的合并,文件在合并的时候有两种方式,minor和major,minor表示小范围文件的合并,major表示将所有的storefile文件都合并成一个
3. Flush 过程
当写数据到一定程度之后,会把内存中的数据flush到磁盘,配置项在 hbase-default.xml
1. habse.regionserver.global.memstore.size
默认大小为内存大小的0.4。当regionserver的所有的memstore的大小超过这个值的时候,会阻塞客户端的读写
2. habse.regionserver.global.memstore.size.lower.limit
默认大小为第一个配置项的大小的0.95。即从这个值开始flush到内存,如果写数据过快,超过flush的速度,导致memstore逐渐变大,达到堆大小的0.4,那么就会暂停读写操作,专注于flush,直到memstore的大小下降
3. hbase.regionserver.optionalcacheflushinterval
默认为1个小时(当前内存最后一次编辑时间+1个小时),自动flush到磁盘
4. hbase.hregion.memstore.flush.size
单个region里memstore大小。默认为128M,超过这个大小就会刷写
5. hbase.regionserver.max.logs
如果wal的文件数量达到这个值(默认32),就会刷写
6. hbase.regionserver.hlog.blocksize
默认HDFS 2.x版本默认的blocksize大小
4. 读数据
- Client 向 zk 发送请求,请求 meta 表所有的 regionServer
- zk 返回 regionServer 地址
- Client 获取到 meta 表,请求对应的 region 所在的 regionServer
- 返回 meta 表数据
- Client 向 regionServer 发送读数据请求
- 同时会读 memstore 和 storefile,如果 storefile 里有数据,会加载到 blockcache 中,然后把数据做一个合并,取时间戳最大的那条数据返回给client,并且将数据写入到 blockcache
- 遵循的大体流程是 client->memstore->blockcache->storefile。如果读到了会把数据放到blockcache里缓存,方便下次读取
同时去读内存和磁盘,是为了避免磁盘的时间戳大于内存的时间戳,即put数据的时候设置了老时间戳
5. compact 合并
memstore不断flush到磁盘,生成hfile。
minor compactions 会把多个文件hfile合并为一个大的hfile
major compactions 会把所有hfile合并为一个hfile,默认是7天,但是生产上应该关闭,会非常消耗资源,应在空闲时间手动触发
compact 会 rewrite hfile to a single storefile 重写的过程会下载hdfs文件,然后重新写入,所以很消耗资源
hbase.hstore.compactionThreshold
是一个store(列族)允许的hfile个数,超过这个个数就会合并
6. region split 切分
region 交给不同服务器,缓解热点问题 => hfile 不断拆分,文件越来越大,到最后有可能还是会导致热点问题的存在,因为有的文件特别大,查的数据都在这个文件里 => 建表的时候实现 预分区
HBase 默认分区规则
memstore.flush.size=128MB
max.store.size=10G
分区规则:Min(R^2 * “hbase.hregion.memstore.flush.size”, “hbase.hregion.max.filesize”)
第一次拆分大小为:min(10G,11128M)=128M // 一开始的时候就一个region,当数据量达到128M时,会一分为二,变成2个region,然后会往第二个region里写数据,但是第一个不会写,处于半满状态 => 之前分裂的region都不会再被写入数据,处于半满状态
第二次拆分大小为:min(10G,33128M)=1152M
第三次拆分大小为:min(10G,55128M)=3200M
第四次拆分大小为:min(10G,77128M)=6272M
第五次拆分大小为:min(10G,99128M)=10G
第五次拆分大小为:min(10G,1111128M)=10G // 最大是10G
官方建议使用一个列族,避免的问题是:有的列族很多数据,有的列族可能只有几条数,按照region切分,然后flush到磁盘,可能会产生很多的小文件
HBase进阶的更多相关文章
- MapReduce/Hbase进阶提升(原理剖析、实战演练)
什么是MapReduce? MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算.概念"Map(映射)"和"Reduce(归约)",和他们 ...
- 第五章:大数据 の HBase 进阶
本课主题 HBase 读写数据的流程 HBase 性能优化和最住实践 HBase 管理和集群操作 HBase 备份和复制 引言 前一篇 HBase 基础 (HBase 基础) 简单介绍了NoSQL是什 ...
- 大数据学习(14)—— HBase进阶
HBase读写流程 在网上找了一张图,这个画的比较简单,就拿这个图来说吧. 写流程 1.当Client发起一个Put请求时,首先访问Zookeeper获取hbase:meta表. 2.从hbase:m ...
- 第四章:大数据 の HBase 基础
本课主题 NoSQL 数据库介绍 HBase 基本操作 HBase 集群架构与设计介紹 HBase 与HDFS的关系 HBase 数据拆分和紧缩 引言 介绍什么是 NoSQL,NoSQL 和 RDBM ...
- HBase基础理论知识
来源:第四章:大数据 の HBase 基础 本课主题 NoSQL 数据库介绍 HBase 基本操作 HBase 集群架构与设计介紹 HBase 与HDFS的关系 HBase 数据拆分和紧缩 引言 ...
- 北风风hadoop课程体系
课程一.基于Linux操作系统平台下的Java语言开发(20课时)课程简介本套课程主要介绍了Linux系统下的Java环境搭建及最基础的Java语法知识.学习Linux操作系统下Java语言开发的好处 ...
- Cloudera Hadoop 5& Hadoop高阶管理及调优课程(CDH5,Hadoop2.0,HA,安全,管理,调优)
1.课程环境 本课程涉及的技术产品及相关版本: 技术 版本 Linux CentOS 6.5 Java 1.7 Hadoop2.0 2.6.0 Hadoop1.0 1.2.1 Zookeeper 3. ...
- 深入浅出Hadoop Mahout数据挖掘实战(算法分析、项目实战、中文分词技术)
Mahout简介 Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目, 提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建 ...
- 最完整的历史记录hadoop
课程主要涉及Hadoop Sqoop.Flume.Avro重要子项目的技术实战 课程针对人群 1.本课程适合于有一定java基础知识.对数据库和sql语句有一定了解,熟练使用linux系统的技术人员, ...
随机推荐
- Spring Boot 如何使用拦截器、过滤器、监听器?
过滤器 过滤器的英文名称为 Filter, 是 Servlet 技术中最实用的技术. 如同它的名字一样,过滤器是处于客户端和服务器资源文件之间的一道过滤网,帮助我们过滤掉一些不符合要求的请求,通常用作 ...
- chrome禁止三方cookie,网站登录不了怎么办
背景 新版chrome(80+)浏览器默认屏蔽所有三方cookie已经不是什么新闻了,具体原因这里不去深究,有大量相关文章介绍,由于目前许多网站都依赖三方cookie,因此该特性的推出还是造成了一些的 ...
- 基于Java反射的定时任务设计
一.使用场景 1.不需要立即执行.立即得到结果返回. 2.如果执行失败.需要有失败补偿机制. 3.和业务代码解耦,适用于不同的务场景. 4.调用接口的入参.出参 统计,方便查询. 二.执行顺序 1.业 ...
- Emit动态生成代理类用于监控对象的字段修改
利用Emit动态生成代理对象监控对象哪些字段被修改,被修改为什么值 被Register的对象要监控的值必须是Virtual虚类型 必须使用CreateInstance创建对象 必须使用DynamicP ...
- 【宝塔面板】centOS部署前后端分离所有遇到的坑,Django
1:刚刚买完服务器,在宝塔面板安装完一切工具,Django顺利运行后(不能运行一般是起了中文名) # 问题:想迁移数据库,结果发现-bash: python3: command not found# ...
- P2947 Look Up S
题目描述: 约翰的N(1≤N≤10^5)头奶牛站成一排,奶牛i的身高是Hi(l≤Hi≤1,000,000).现在,每只奶牛都在向右看齐.对于奶牛i,如果奶牛j满足i<j且Hi<Hj,我们可 ...
- python排序算法总结和实现
------------------希尔排序------------- 一直没搞懂希尔排序怎么搞得 def Shell_sort(L): step = len(L)/2 while step > ...
- Thymeleaf 异常:Exception processing template "index": An error happened during template parsing (template: "class path resource [templates/index.html]")
Spring Boot 项目,在 Spring Tool Suite 4, Version: 4.4.0.RELEASE 运行没有问题,将项目中的静态资源和页面复制到 IDEA 的项目中,除了 IDE ...
- 使用MVC 5、Web API 2、KnockoutJS、Ninject和NUnit开发、架构和测试Web应用程序
做一名微软软件开发人员就像在国际煎饼屋订早餐一样.每道菜都有一堆煎饼,你必须从各种各样的煎饼和糖浆口味中选择.对于web应用程序,解决方案堆栈是一组软件子系统或组件,用于交付功能完整的解决方案(无论是 ...
- Go strconv包
strconv包 该包主要实现基本数据类型与其字符串表示的转换. 常用函数为Atoi().Itia().parse系列.format系列.append系列. 更多函数请查看官方文档. string与i ...