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系统的技术人员, ...
随机推荐
- @RestController和@Controller区别
1) 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewRe ...
- 安装Angular CLI开发工具
目前,无论你使用什么前端框架,都必然要用到NodeJS工具,Angular也不例外,与其他框架不同的是,Angular一开始就使用"全家桶"式的设计思路,因此@angular/cl ...
- java中对 闰年的计算 以及月份天数
import java.io.*;//局部变量的使用import java.util.Scanner; public class HelloJava { public static void ...
- git server“丢失”commit问题探究
1 背景 gitlab某仓库有同事发现部分代码文件内容丢失,具体表现 A. dev分支commit信息是连续的,看不出明显的大时间范围批量丢失 B. 以SuncardCashier/control/C ...
- php 图片转base4的格式
<?php $url = '1.jpg'; $base64_img = base64_encode(file_get_contents($url));//将图片转base64编码 $imgArr ...
- 报表和仪表板在线设计器Stimulsoft Designer 最新版发布
Stimulsoft Designer是统一的Stimulsoft框架的一部分,该框架包括用于生成报表和分析数据的引擎.报表设计器和查看器. 您可以在计算机上创建报表,继续使用在线设计器在云中对其进行 ...
- Ubuntu部署和体验Nexus3
关于Nexus 如下图,在局域网部署了Nexus之后,可以缓存中央仓库的jar,开发者开发的二方库发布到Nexus上,局域网内的其他人也可以从Nexus下载这些二方库使用: 环境信息 本次实战是在Li ...
- Java安全之URLDNS链
Java安全之URLDNS链 0x00 前言 在学习Java的反序列化漏洞的时候,就不得不学习他的一个利用链.很多刚刚入门的对于利用链这个词可能比较陌生.那么这里先来了解一下Java反序列化和反序列化 ...
- AA.Dapper升级了
AA.Dapper基于dapper进一步封装而成的orm框架,提供增删改查.分页.事务.原生sql的功能,以满足日常的业务开发. 1.Repository层: DapperRepository类包含大 ...
- 浅谈 Java集合
Java 集合 集合是对象的容器,定义了多个对象进行操作的常用方法,可实现数组的功能. Java集合类库所处位置:java.util.*. 与现代的数据结构类库的常见做法一样,Java集合类库也将接口 ...