Hbase读写数据过程详解(hbase0.96版本之前与hbase0.96版本之后对比)
@Author : Spinach | GHB
@Link : http://blog.csdn.net/bocai8058
文章目录
- HBase架构图
- -ROOT-和.META.结构
- -ROOT-
- .META.
- 两表关系(hbase0.96版本之前,之后删除了-ROOT-表)
- 写数据过程
- 读数据过程
- HBase各个模块功能
HBase架构图
-ROOT-和.META.结构
从存储结构和操作方法的角度来说,-ROOT-、.META.与其他表没有任何区别。它们与众不同的地方是HBase用它们来存贮一个重要的系统信息:
- -ROOT-:记录.META.表的Region信息。
- .META.:记录用户表的Region信息。
其中-ROOT-表本身只会有一个region,也就只会存放在一台RegionServer上。,这样保证了只需要三次跳转,就能定位到任意region。
hbase0.96版本之前
-ROOT-和.META.均存储在HBase中,可通过以下命令查看scan '-ROOT-'和scan ‘.META.’,存放-ROOT-的所处region的地址放在zookeeper中,路径为/hbase/root-region-server。
hbase0.96版本之后
.META.存储在HBase中,可通过以下命令查看scan ‘hbase:meta’,存放.META.的所处region的地址放在zookeeper中,路径为/hbase/meta-region-server。
-ROOT-
hbase0.96版本后删除了root表,新增了namespace,现在是讲解hbase0.96版本之前的版本。
当用户表特别大时,用户表的region也会非常多。.META.表存储了这些region信息,也变得非常大,这时.META.自己也需要划分成多个Region,托管到多个RegionServer上。这时就出现了一个问题:当.META.被托管在多个RegionServer上,如何去定位.META.呢?HBase的做法是用另外一个表来记录.META.的Region信息,就和.META.记录用户表的Region信息一样,这个表就是-ROOT-表。
除了没有historian列族之外,-ROOT-表的结构与.META.表的结构是一样的。另外,-ROOT-表的 RowKey 没有采用时间戳,也没有Encoded值,而是直接指定一个数字。
.META.
hbase(main):018:0> scan 'hbase:meta'
ROW COLUMN+CELL CallLog,,1528959142280.21bd88f3409aed49228d3b9dd9f8d7c0. column=info:regioninfo, timestamp=1538750384211, value={ENCODED => 21bd88f3409aed49228d3b9dd9f8d7c0, NAME => 'CallLog,,1528959142280.21bd88f3409aed49228d3b9dd9f8d7c0.', STARTKEY => '', ENDKEY => ''} CallLog,,1528959142280.21bd88f3409aed49228d3b9dd9f8d7c0. column=info:seqnumDuringOpen, timestamp=1538750384211, value=\x00\x00\x00\x00\x00\x00\x00( CallLog,,1528959142280.21bd88f3409aed49228d3b9dd9f8d7c0. column=info:server, timestamp=1538750384211, value=centos6:16201 CallLog,,1528959142280.21bd88f3409aed49228d3b9dd9f8d7c0. column=info:serverstartcode, timestamp=1538750384211, value=1538750349345 hbase:namespace,,1528879579816.45aa5ea87654b8e16223ca82c351473f. column=info:regioninfo, timestamp=1538750384222, value={ENCODED => 45aa5ea87654b8e16223ca82c351473f, NAME => 'hbase:namespace,,1528879579816.45aa5ea87654b8e16223ca82c351473f.', STARTKEY => '', ENDKEY => ''} hbase:namespace,,1528879579816.45aa5ea87654b8e16223ca82c351473f. column=info:seqnumDuringOpen, timestamp=1538750384222, value=\x00\x00\x00\x00\x00\x00\x00= hbase:namespace,,1528879579816.45aa5ea87654b8e16223ca82c351473f. column=info:server, timestamp=1538750384222, value=centos6:16201 hbase:namespace,,1528879579816.45aa5ea87654b8e16223ca82c351473f. column=info:serverstartcode, timestamp=1538750384222, value=1538750349345 ns1:calllogs,,1532873264166.bd62c4d5567f7d1533cb48fa517d9721. column=info:regioninfo, timestamp=1538750384217, value={ENCODED => bd62c4d5567f7d1533cb48fa517d9721, NAME => 'ns1:calllogs,,1532873264166.bd62c4d5567f7d1533cb48fa517d9721.', STARTKEY => '', ENDKEY => ''}ns1:calllogs,,1532873264166.bd62c4d5567f7d1533cb48fa517d9721. column=info:seqnumDuringOpen, timestamp=1538750384217, value=\x00\x00\x00\x00\x00\x00\x00\x0C ns1:calllogs,,1532873264166.bd62c4d5567f7d1533cb48fa517d9721. column=info:server, timestamp=1538750384217, value=centos6:16201 ns1:calllogs,,1532873264166.bd62c4d5567f7d1533cb48fa517d9721. column=info:serverstartcode, timestamp=1538750384217, value=1538750349345 3 row(s) in 0.0200 secondshbase(main):020:0> desc 'hbase:meta'
Table hbase:meta is ENABLED
hbase:meta, {TABLE_ATTRIBUTES => {IS_META => 'true', REGION_REPLICATION => '1', coprocessor$1 => '|org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint|536870911|'}
COLUMN FAMILIES DESCRIPTION
{NAME => 'info', BLOOMFILTER => 'NONE', VERSIONS => '10', IN_MEMORY => 'true', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', CACHE_DATA_IN_L1 => 'true', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLO
CKSIZE => '8192', REPLICATION_SCOPE => '0'}
1 row(s) in 0.0210 seconds
.META.表中每一行记录了一个Region的信息。
结构说明:
- rowkey
RowKey就是Region Name,它的命名形式是TableName,StartKey,TimeStamp.Encoded.。
第一个region的startKey是空字符串;
CallLog,,1528959142280.21bd88f3409aed49228d3b9dd9f8d7c0.
其中 Encoded 是TableName,StartKey,TimeStamp的md5值。
- Column Family
.META.表有两个Column Family:info和historian。其中info包含了三个Column:
1. regioninfo:region的详细信息,包括StartKey、EndKey以及Table信息等等。a. startKey,region的开始key,第一个region的startKey是空字符串;b. endKey,region的结束key,最后一个region的endKey是空字符串;
2. server:管理该region的 RegionServer 的地址。
3. serverstartcode:RegionServer 开始托管该region的时间。
两表关系(hbase0.96版本之前,之后删除了-ROOT-表)
hbase0.96版本后删除了root表,新增了namespace,现在是讲解hbase0.96版本之前的版本。
HBase的所有Region元数据被存储在.META.表中2.1,随着Region的增多,.META.表中的数据也会增大,并分裂成多个新的Region。为了定位.META.表中各个Region的位置,把.META.表中所有Region的元数据保存在-ROOT-表中,最后由Zookeeper记录-ROOT-表的位置信息。所有客户端访问用户数据前,需要首先访问Zookeeper获得-ROOT-的位置,然后访问-ROOT-表获得.META.表的位置,最后根据.META.表中的信息确定用户数据存放的位置,
-ROOT-表永远不会被分割,它只有一个Region,也就只会存放在一台RegionServer上。这样可以保证最多只需要三次跳转就可以定位任意一个Region。为了加快访问速度,.META.表的所有Region全部保存在内存中。客户端会将查询过的位置信息缓存起来,且缓存不会主动失效。如果客户端根据缓存信息还访问不到数据,则询问相关.META.表的Region服务器,试图获取数据的位置,如果还是失败,则询问-ROOT-表相关的.META.表在哪里。最后,如果前面的信息全部失效,则通过ZooKeeper重新定位Region的信息。所以如果客户端上的缓存全部是失效,则需要进行6次网络来回,才能定位到正确的Region。
写数据过程
hbase0.96版本之前
- Client通过Zookeeper的调度,向RegionServer发出写数据请求,zk存储了-ROOT-表(记录.META.表的Region信息),从-ROOT-表中找到.META.表(记录用户表的Region信息)。
- 根据namespace、表名和rowkey根据meta表的数据找到写入数据对应的region信息找到对应的regionserver;
- 把数据被写入Region的MemStore,并写到HLog中,直到MemStore达到预设阈值,MemStore中的数据被Flush成一个StoreFile。
- 随着StoreFile文件的不断增多,当其数量增长到一定阈值后,触发Compact合并操作,将多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除。
- StoreFiles通过不断的Compact合并操作,逐步形成越来越大的StoreFile。
- 单个StoreFile大小超过一定阈值后,触发Split操作,把当前Region Split成2个新的Region。父Region会下线,新Split出的2个子Region会被HMaster分配到相应的RegionServer上,使得原先1个Region的压力得以分流到2个Region上。
可以看出HBase只有增添数据,所有的更新和删除操作都是在后续的Compact历程中举行的,使得用户的写操作只要进入内存就可以立刻返回,实现了HBase I/O的高性能。
hbase0.96版本之后,新增了namespace
- zookeeper中存储了meta表的region信息,从meta表获取相应region信息,然后找到meta表的数据;
- 根据namespace、表名和rowkey根据meta表的数据找到写入数据对应的region信息找到对应的regionserver;
- 把数据被写入Region的MemStore,并写到HLog中,直到MemStore达到预设阈值,MemStore中的数据被Flush成一个StoreFile。
- 随着StoreFile文件的不断增多,当其数量增长到一定阈值后,触发Compact合并操作,将多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除。
- StoreFiles通过不断的Compact合并操作,逐步形成越来越大的StoreFile。
- 单个StoreFile大小超过一定阈值后,触发Split操作,把当前Region Split成2个新的Region。父Region会下线,新Split出的2个子Region会被HMaster分配到相应的RegionServer上,使得原先1个Region的压力得以分流到2个Region上。
读数据过程
hbase0.96版本之前
- Client访问Zookeeper,查找-ROOT-表,获取.META.表信息。
- 从.META.表查找,获取存放目标数据的Region信息,从而找到对应的RegionServer。
- 通过RegionServer获取需要查找的数据。
- Regionserver的内存分为MemStore和BlockCache两部分,MemStore主要用于写数据,BlockCache主要用于读数据。读请求先到MemStore中查数据,查不到就到BlockCache中查,再查不到就会到StoreFile上读,并把读的结果放入BlockCache。
寻址过程:client–>Zookeeper–>-ROOT-表–>META表–>RegionServer–>Region–>client
hbase0.96版本之后,新增了namespace
- zookeeper中存储了meta表的region信息,所以先从zookeeper中找到meta表region的位置,然后读取meta表中的数据。meta中又存储了用户表的region信息;
- 根据namespace、表名和rowkey在meta表中找到对应的region信息;
- 找到这个region对应的regionserver
- 查找对应的region;
- 先从MemStore找数据,如果没有,再到StoreFile上读(为了读取的效率)。
寻址过程:client–>Zookeeper–>META表–>RegionServer–>Region–>client
HBase各个模块功能
Client
- 整个HBase集群的访问入口;
- 使用HBase RPC机制与HMaster和HRegionServer进行通信;
- 与HMaster进行通信进行管理表的操作;
- 与HRegionServer进行数据读写类操作;
- 包含访问HBase的接口,并维护cache来加快对HBase的访问
Zookeeper
- 保证任何时候,集群中只有一个HMaster;
- 存贮所有HRegion的寻址入口;
- 实时监控HRegion Server的上线和下线信息,并实时通知给HMaster;
- 存储HBase的schema和table元数据;
- Zookeeper Quorum存储表地址、HMaster地址。
HMaster
- HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master在运行,主负责Table和Region的管理工作。
- 管理用户对表的创建、删除等操作;
- 管理HRegionServer的负载均衡,调整Region分布;
- Region Split后,负责新Region的分布;
- 在HRegionServer停机后,负责失效HRegionServer上Region迁移工作。
HRegion Server
- 维护HRegion,处理对这些HRegion的IO请求,向HDFS文件系统中读写数据;
- 负责切分在运行过程中变得过大的HRegion。
- Client访问hbase上数据的过程并不需要master参与(寻址访问Zookeeper和HRegion Server,数据读写访问HRegione Server),HMaster仅仅维护这table和Region的元数据信息,负载很低。
引用:https://blog.csdn.net/yyl424525/article/details/77505749 | https://www.jianshu.com/p/e2bbf23f1ba2 | https://blog.csdn.net/lw_ghy/article/details/60778843 | https://blog.csdn.net/WYpersist/article/details/80220654 | https://blog.csdn.net/map_lixiupeng/article/details/40857825
Hbase读写数据过程详解(hbase0.96版本之前与hbase0.96版本之后对比)相关推荐
- Python爬虫教程-Python爬取股票数据过程详解
这篇文章主要介绍了基于Python爬取股票数据过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 基本环境配置 python 3.6 pycha ...
- STM32通过IIC读取MPU6050原始数据过程详解
STM32通过IIC读取MPU6050数据过程详解 一:硬件介绍 此款MPU6050是通过IIC来与MCU通信的,它有两个IIC接口,第一个是主IIC,通过SCL和SDA两条线与MCU通信:第二个辅助 ...
- Thinking in BigData(八)大数据Hadoop核心架构HDFS+MapReduce+Hbase+Hive内部机理详解
纯干货:Hadoop核心架构HDFS+MapReduce+Hbase+Hive内部机理详解. 通过这一阶段的调研总结,从内部机理的角度详细分析,HDFS.MapReduce.Hbase.H ...
- hbase 二进制数据写入_分布式数据库HBase的架构设计详解(有彩蛋)
原标题:分布式数据库HBase的架构设计详解(有彩蛋) 本文根据DBAplus社群第99期线上分享整理而成,文末还有好书送哦~ 讲师介绍 陈鸿威 云财经大数据CTO 曾任百度高级工程师,现主持设计开发 ...
- python接入excel_使用python将excel数据导入数据库过程详解
因为需要对数据处理,将excel数据导入到数据库,记录一下过程. 使用到的库:xlrd 和 pymysql (如果需要写到excel可以使用xlwt) 直接丢代码,使用python3,注释比较清楚. ...
- python动态图表变化_Python数据可视化 pyecharts实现各种统计图表过程详解
Python数据可视化 pyecharts实现各种统计图表过程详解 发布时间:2020-09-10 04:53:26 来源:脚本之家 阅读:78 1.pyecharts介绍 Echarts是一款由百度 ...
- ECharts 数据各种图自适应 可视化 项目过程详解(附完整代码)
前言: 本篇文章的学习目的: 1.可视化面板布局适配屏幕 2.利用ECharts 实现柱状图展示 实现的技术栈: 基于 flexible.js +rem 智能大屏适配 VScode cssrem插件 ...
- Hadoop核心架构HDFS+MapReduce+Hbase+Hive内部机理详解
编者按:HDFS和MapReduce是Hadoop的两大核心,除此之外Hbase.Hive这两个核心工具也随着Hadoop发展变得越来越重要.本文作者张震的博文<Thinking in BigD ...
- Hadoop学习之Mapreduce执行过程详解
一.MapReduce执行过程 MapReduce运行时,首先通过Map读取HDFS中的数据,然后经过拆分,将每个文件中的每行数据分拆成键值对,最后输出作为Reduce的输入,大体执行流程如下图所示: ...
最新文章
- php执行URL解析
- 这八大互联网金融商业模式,你都知道吗?
- mysql数据库入门教程(8):数据的基本类型
- JAG Practice Contest for ACM-ICPC Asia Regional 2016.K.Non-redundant Drive(点分治)
- bzoj2005: [Noi2010]能量采集
- python 怎么取对数_概率矩阵分解(PMF)及MovieLens上的Python代码
- Coding and Paper Letter(十四)
- 小程序突破五层限制的方法
- OpenCV分水岭分割函数:watershed()介绍
- PHP Notice: undefined index xxx
- 如何以管理员身份运行电脑
- UG NX 12 抽取面特征
- 浅谈5G和4G有哪些区别?
- 中国网游,是福?还是祸?
- java通过反射调用有参数的方法
- HIF转16位TIF或者PNG
- 还不到4折:赶紧来抢券啊!!!
- E18-D80NK光电传感器
- JavaWeb课程设计(风险地区查询系统)
- java入库_Java实现商品的查找、添加、出库、入库操作完整案例