hbase的一些要点
hbase特点及简介:
hbase源自于谷歌的三大论文之一
GFS -- hdfs
MapReduce - MR
BigTable - hbase
hbase在以Hadoop为基础的生态圈中的地位
hbase和Hadoop的hdfs结合使用,构建在hdfs上的数据库(hbase为hdfs上的海量的结构化或非结构数据构建了层层的索引)
为存储在hdfs上的海量的数据提供存储及随机检索平台
可以与MapReduce、hive、spark等分析框架集成,为数据分析框架提供数据源
基于【列存储】的分布式数据库
列存储和行存储的区别
RDBMS都是基于行存储
表的每行数据是一个连续的存储单元
如果在select查询时只涉及到其中的几列,无关的列数据也会被加载读取,系统io较大
hbase基于列存储的数据库
表的每列数据是一个连续的存储单元
如果在select查询时只涉及到其中的几列,只有相关的列数据才会被加载读取,大大降低系统的io流
因为每列的数据类型都是一样的,更容易实现压缩存储
hbase适合存储结构化或非结构化的数据
mysql hive上的表都是二维表,每条数据的字段的个数和名称都是固定
hbase表中存储的每行数据可以有不同的列数据及列种类
有基于key-value形式数据存储的特点
可以根据一个key快速获取对应的value值
key:rowkey+列簇+列名 =》 唯一的cell单元格
key:rowkey+列簇+列名+时间戳 =》 唯一的value值
因为在一个单元格中可以存储多个基于时间戳区分的value值
高可靠性、高性能、可伸缩的分布式数据库
高可靠性、可伸缩 =》 hdfs
高性能 =》对比RDBMS,hbase可以为海量数据提供的存储及随机实时检索平台
hbase本身不支持sql查询标准
可以借助其他框架或插件实现sql查询
通过hive映射hbase表数据=》可以通过hql间接分析hbase表数据
通过phoenix插件
标准的sql语句-》phoenix插件转换 -》hbase 的查询 java api
hive与hbase的区别!! hive
面向分析的数据仓库工具(非数据库),使用hive sql分析
查询数据时高延迟
表中存储【映射】的是结构化的数据
hive表数据默认是行存储
hive上的表为逻辑表
hive本身不能存储数据及查询数据,完全依赖Hadoop
hdfs -- 数据存储
MapReduce -- 分析
本质将hql转换为MapReduce hbase
面向数据存储和检索的数据库
查询延迟非常的低
适合存储结构化和非结构化的数据
hbase表数据默认是列存储
hbase上的表为物理表
hbase是一个构建在hdfs上的面向列存储的分布式数据库
可以依靠自身的检索机制从海量表中进行随机实时的读写操作 RDBMS与hbase的区别 -- 简述 RDBMS与hive的区别 -- 简述 -------------------------------------- hbase架构角色
(hbase框架是一个主从架构)
master
hbase的主节点
master服务主要作为
管理用户对hbase上的表的增删改查(对表整体而不是表数据)
管理分配表的region给regionserver节点
负责对regionserver集群上的region的个数进行负载均衡
监控所有regionserver从节点的运行状态及regionserver节点宕机后的容灾处理
master是借助zookeeper感知regionserver上线和下线 regionserver
hbase集群的从节点
负责当前服务器节点上master所分配的表的region
真正响应客户端读写请求的节点
master不参与表数据的读写流程 zookeeper
hbase强依赖zookeeper
持有hbase集群的节点信息(集群节点的元数据)及hbase上所有表的寻址入口信息(meta表的region所在的regionserver节点信息)
持有hbase集群的节点信息
hbase有几个master节点和regionserver节点及节点的详细
hbase上所有表的寻址入口信息
hive表的元数据 -- 存储了mysql中
hbase表的元数据 -- 有hbase执行存储管理
hbase上所有用户表的元数据信息存储在hbase上的一张meta表中
通常meta表的数据量较少所以只有1个region
该region会被分配给某个regionserver节点进行管理
而zookeeper持有了meta表的region所在的regionserver节点信息
寻址入口?
因为所有的用户或客户端在向hbase集群上读写数据时都需要先获取所有表的元数据信息(meta表数据)
meta表中存有哪些用户表的元数据信息呢?
用户表有几个region
每个region的'rowkey'范围
每个region被分配给了哪个regionserver管理
zookeeper基于第三方观察者模式监控master及regionserver的运行状态保证hbase的高可用性 hfds
强依赖hdfs上
hbase表的数据最终落地到hdfs上
通常将hbase的regionserver服务与hdfs的datanode部署在同一台服务器上
hbase的数据存储模型及存储模型中的专业术语 rowkey : 行健
用来标记唯一的一行数据
类似RDBMS中的主键 column family 【CF】:列簇 / 列族
可以将一些列定义在一起形成一个家族
列簇可以为列增加一层索引
同一张表中列簇的数量一般 小于等于2个 ???
建表时一张表至少要有一个列簇
column :列
字段,列名
一个列必须属于某个列簇
在hbase表中不同的行可以有不同的列
cell : 单元格
单元格是hbase中最小最基本的存储单元
单元格是实际值的存储
单元格内存储的值一般小于15M
每个单元格包含的数据信息有
rowkey+cf+c+时间戳+value
单元格中的时间戳
value值插入到单元格中的时间
时间戳可以用来区分同一个单元格中的多个历史值
hbase的表中的单元格支持多个历史版本值
默认建表时只支持一个版本值
可以指定支持多个历史版本值
region的内部结构
每个region是由1个或多个store组成,每个store下存储了同一个类簇下的所有的数据(cell单元格),store的数量=表的列簇的数量 ,每个region还包含一个Hlog预写制日志文件 store的组成
每个store是由1个memstore和0到多个storeFile文件组成
memstore:
是一个数据写入缓存区
可以用来加快hbase表的写数据速度
默认阈值为128M =》 <name>hbase.hregion.memstore.flush.size</name>
$ vi hbase-common/src/main/resources/hbase-default.xml
storeFile:
hbase的表数据文件
最终落地在hdfs上形成Hfile文件
Hlog预写制日志文件
Hlog文件可以用来临时保持写入到memstore中的数据防止regionserver节点宕机造成数据丢失
当数据写入memstore之前默认将数据写入到Hlog中一份
假如memstore中数据丢失可以从HLog中将数据进行恢复 hbase表在hdfs上的目录路径情况
/hbase/data/ 表数据
/hbase/data/default
建表时不指定命名空间库默认存储在此目录下
在表名命名的目录下会出现1个或多个以region编号命名的目录
在region编号命名的目录下会出现1个或多个以列簇名命名的目录
在以列簇名命名的目录下会出现0到多个storeFile文件 表的region的命名:
表名,Start Key,时间戳.region编号
emp,,1536047033109.3eee90200aa437fe7f60e476df533fd2.
hbase数据检索流程(架构流程)介绍 client
读写hbase的框架(MapReduce、hive、spark、flume..)或hbase shell
zookeeper
基于观察者模式监控master及regionserver的运行状态
存储了hbase集群的节点信息及meta表的位置信息
master
管理表的region的增删改查及分配
master借助zookeeper监控regionserver运行状态
regionserver启动后会在zookeeper上注册节点的服务器信息
master主节点可以配置多个 备份 (Backup Masters)
master节点不参与hbase表数据读写流程,通常io低
regionserver
管理当前节点上的region
响应客户端读写请求的节点
处理region的写数据过程的三大机制(flush、compaction、split)
Hadoop
hbase利用Hadoop的hdfs提高了一个数据存储平台
在hdfs上的hbase的文件有两种
storeFile(Hfile)
storeFile文件为Hadoop的二进制格式文件
在hbase上表的数据没有数据类型,在底层都是字节数组
Hlog
预写制日志文件(WAL) -- 借助 oracle
Hlog文件为Hadoop的sequence格式的文件
Hlog文件与regionserver节点的数量关系
在0.9x版本中 一个region对应的一个Hlog文件
在1.x版本中
可以配置一个regionserver节点对应一个Hlog文件
这样可以减少Hlog文件的寻址次数 hbase表数据的读数据流程: --- 根据某个rowkey到emp表读取某行数据 1、client先去访问zookeeper,从zookeeper里面获取meta表所在位置信息
0.96之前的版本除了meta表还有一个root表,root表存储meta表位置信息,先通过zookeeper获取root表位置
在从root表中读取meta表位置
现在直接将meta表位置存入zookeeper中,减少会话次数
2、client向meta表的region所在regionserver发起访问,读取meta表数据,获取hbase集群上所有user表的元数据
3、根据当前的rowkey判断meta表中emp表的对应的region的位置信息,client找到了当前需要访问的emp表对应的region及所在的regionserver服务器
4、client向对应regionserver服务器发起读请求
5、regionserver收到client访问请求并相应
6、找到对应的region及store后,先扫描memstore,在扫描blockcache(读缓存),最后再读取storefile[HDFS]文件
7、regionserver把数据响应给client hbase表数据的写数据流程: --- 根据某个rowkey向emp表写入数据 1、client先去访问zookeeper,从zookeeper里面获取meta表所在位置信息
0.96之前的版本除了meta表还有一个root表,root表存储meta表位置信息,先通过zookeeper获取root表位置
在从root表中读取meta表位置
现在直接将meta表位置存入zookeeper中,减少会话次数
2、client向meta表的region所在regionserver发起访问,读取meta表数据,获取hbase集群上所有user表的元数据
3、根据当前的rowkey判断meta表中emp表的对应的region的位置信息,client找到了当前需要访问的emp表对应的region及所在的regionserver服务器
4、client向对应regionserver服务器发起写请求
5、regionserver收到client请求,并响应,regionserver先把数据写入HLog,防止数据丢失
6、再把数据写入memstore内存缓存区,默认128M
7、当Hlog和memstore都写入成功,则这条数据写入成功
8、当memstore达到阀值[128M],会把memstore里面的数据Flush成storefile
9、当[128M]storefile越来越多,会触发compaction合并操作,把多storefile合并成一个大的storefile
合并的期间会彻底删除过期的或之前打上删除表的cell
对hbase表数据进行删除时数据并没有立即从Hfile文件中删除,而是打上了一个'删除标签'
在大合并期间会对打上'删除标签'的cell及TTL到期的数据进行彻底删除
对所有文件中的数据依据rowkey的字典顺序进行排序
10、当单个storefiles越来越大,达到一定阀值(10G或其他动态阈值)时会触发split操作,region被一分为二被master分配管理
hbase写数据过程的三个机制 **flush机制
当memstore中的数据达到一定阈值会将memstore中的数据flush为storeFile文件 <property>
<name>hbase.hregion.memstore.flush.size</name>
<value>134217728</value>
<description>
Memstore will be flushed to disk if size of the memstore
exceeds this number of bytes. Value is checked by a thread that runs
every hbase.server.thread.wakefrequency.</description>
</property> 思考:
一个regionserver节点上可能管理了100个region,假设每个region内有两个store,则当前的regionserver节点需要维护的memstore总个数为 100*2 = 200个
假设某一时刻所有的memstore中的数据都在120M左右,则此此时当前regionserver节点上总的memstore占用的内存空间为 24G 如何避免这种情况出现 <property>
<name>hbase.regionserver.global.memstore.size</name>
<value></value>
<description>Maximum size of all memstores in a region server before new
updates are blocked and flushes are forced. Defaults to 40% of heap (0.4).
Updates are blocked and flushes are forced until size of all memstores
in a region server hits hbase.regionserver.global.memstore.size.lower.limit.
The default value in this configuration has been intentionally left emtpy in order to
honor the old hbase.regionserver.global.memstore.upperLimit property if present.</description>
</property>
属性的默认值为0.4(40%)
当一个regionserver节点上全部的memstore空间被占用超过regionserver--jvm中的heap堆内存空间的40%时,会对此节点上所有的region进行更新(写或修改)阻塞,同时将memstore中的数据强制flush为storeFile region进行更新(写或修改)阻塞什么时候解除
当占用的内存量小于40%
memstore中的数据强制flush为storeFile 什么时候解除呢
当占用的内存量小于38% regionserver--jvm中的heap堆内存空间大小:
export HBASE_HEAPSIZE=1G
开发中需要对此属性进行修改: 4G-15G <property>
<name>hbase.regionserver.global.memstore.size.lower.limit</name>
<value></value>
<description>Maximum size of all memstores in a region server before flushes are forced.
Defaults to 95% of hbase.regionserver.global.memstore.size (0.95).
A 100% value for this value causes the minimum possible flushing to occur when updates are
blocked due to memstore limiting.
The default value in this configuration has been intentionally left emtpy in order to
honor the old hbase.regionserver.global.memstore.lowerLimit property if present.</description>
</property>
属性的默认值为0.4*0.95=0.38
当一个regionserver节点上全部的memstore空间被占用超过regionserver--jvm中的heap堆内存空间的38%时,开始进行将memstore中的数据强制flush为storeFile ** compaction机制
当flush到hdfs上的storeFile文件逐步增多,小文件过程会影响到hbase后续的数据检索性能
compaction过程分为两个过程
minor compaction
小合并
hbase会启动一个专用的线程监控每个store下的storeFile文件的数量
当数据量达到3个时会进行一次小合并
小合并是一种归类合并(并没有排序及判断cell有无删除或过期)
major compaction
大合并
每隔一段时间(3.5天-10.5天)自动进行一次大合并
大合并期间会进行以下操作
对store下所有的storeFile文件进行加载重写并按照rowkey的字典顺序进行排序
将打上删除标签的cell或过期的cell进行彻底删除 **split机制
当某个region下的某个store下的storeFile文件合并后的达到到的一定的阈值(10G或小于10G值),会触发整个region的分割 触发分割的阈值: 0.94版本之前:
单纯使用以下属性进行控制
当合并后的storeFile文件超过10G时就会触发split分割
<property>
<name>hbase.hregion.max.filesize</name>
<value>10737418240</value>
<description>
Maximum HStoreFile size. If any one of a column families' HStoreFiles has
grown to exceed this value, the hosting HRegion is split in two.</description>
</property>
结论:
对于数据量较少的小表不友好
数据量少分割的概率很低,不利于分布式的读写操作 0.96-0.98 <property>
<name>hbase.regionserver.region.split.policy</name>
<value>IncreasingToUpperBoundRegionSplitPolicy</value>
</property> IncreasingToUpperBoundRegionSplitPolicy类底层依据一个公式来判断表的region是否需要split分割
公式:
Min(R*R*hbase.hregion.memstore.flush.size ,hbase.hregion.max.filesize )
Min(R*R*128M ,10G )
R表示某一台regionserver节点上某个表的region的个数 假如emp表,region被散列分配在regionserver集群上
如果在regionserver01上持有了emp表的1个region,此时emp表的region在regionserver01上的分割阈值为:min ( 1*1*128M ,10G ) =》128M
如果在regionserver01上持有了emp表的2个region,此时emp表的region在regionserver01上的分割阈值为:min ( 2*2*128M ,10G ) =》512M
如果在regionserver01上持有了emp表的3个region,此时emp表的region在regionserver01上的分割阈值为:min ( 3*3*128M ,10G ) =》1152M
……
如果在regionserver01上持有了emp表的9个region,此时emp表的region在regionserver01上的分割阈值为:min ( 9*9*128M=10.125G ,10G ) =》10G 结论:
当某个regionserver节点上持有某个表的region的个数达到9个时,分割阈值变为固定的10G
此策略可以自动适应大表和小表 1.x版本
使用的是SteppingSplitPolicy控制region的分割阈值
<property>
<name>hbase.regionserver.region.split.policy</name>
<value>org.apache.hadoop.hbase.regionserver.SteppingSplitPolicy</value>
<description>
A split policy determines when a region should be split. The various other split policies that
are available currently are ConstantSizeRegionSplitPolicy, DisabledRegionSplitPolicy,
DelimitedKeyPrefixRegionSplitPolicy, KeyPrefixRegionSplitPolicy etc.
</description>
</property> 控制策略:
某台regionserver节点上持有某个表的region个数为1个时=》分割阈值为hbase.hregion.memstore.flush.size*2=256M
其他数量时=》分割阈值为固定的10G 可以避免0.96-0.98版本中 初期时表的region分割过于频繁的弊端 region在分割时不利因素
对应的region短暂的offline
消耗集群的资源
hbase的一些要点的更多相关文章
- 深入理解HBase Memstore
2013/08/09 转发自http://www.cnblogs.com/shitouer/archive/2013/02/05/configuring-hbase-memstore-what-you ...
- 1.HBase In Action 第一章-HBase简介(后续翻译中)
This chapter covers ■ The origins of Hadoop, HBase, and NoSQL ■ Common use cases for HBase ■ A basic ...
- HBase系统入门--整体介绍
转自:http://www.aboutyun.com/thread-8957-1-2.html 问题导读:1.HBase查询与写入哪个更好一些?2.HBase面对复杂操作能否实现?3.Region服务 ...
- HBase学习之深入理解Memstore-6
MemStore是HBase非常重要的组成部分,深入理解MemStore的运行机制.工作原理.相关配置,对HBase集群管理以及性能调优有非常重要的帮助. HBase Memstore 首先通过简 ...
- 详细解析 HBASE 配置的各种要点
文章更新于:2020-04-06 安装惯例,需要的文件附上链接放在文首. 文件名:hbase-2.2.4-bin.tar.gz 文件大小:213.24 MB 下载链接:http://download. ...
- 【转】Flume(NG)架构设计要点及配置实践
Flume(NG)架构设计要点及配置实践 Flume NG是一个分布式.可靠.可用的系统,它能够将不同数据源的海量日志数据进行高效收集.聚合.移动,最后存储到一个中心化数据存储系统中.由原来的Fl ...
- HBase修改压缩格式及Snappy压缩实测分享
一.要点 有关Snappy的相关介绍可参看Hadoop压缩-SNAPPY算法,如果想安装Snappy,可以参看Hadoop HBase 配置 安装 Snappy 终极教程. 1. HBase修改Tab ...
- Phoenix实现用SQL查询HBase
博客已转移,请借一步说话,http://www.weixuehao.com/archives/111 HBase,一个NoSQL数据库,可存储大量非关系型数据. HBase,可以用HBase shel ...
- 《OD学HBase》20160814
一.HBase引入 http://hbase.apache.org/ 大数据的数据库 1. 概述 Hadoop生态系统中的一个分布式.可拓展.面向列.可伸缩,具有自动容错功能的数据库. NoSQL数据 ...
随机推荐
- poj1207 3n+1 problem
The 3n + 1 problem Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 60496 Accepted: 19 ...
- 循环结构while
Note:高能:语句结构都是由关键字开头,用冒号结束! 一:语句结构 while 判断条件: 语句 二:基本规则 (1)使用缩进来划分语句块,相同缩进数的语句在一 ...
- Git&Version Control
Git Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. [1] Git 是 Linus Torvalds 为了帮助管理 Linux 内 ...
- Handler Bundle Runnable
Handler: 不能在子线程更新UI,可以通过handler来实现在子线程发送消息在主线程更新 Bundle: https://blog.csdn.net/qq_36895346/ar ...
- 数据仓库 - 2.数据仓库设计思路及ETL设计思路
一.数据仓库构建思想 构造数据仓库有两种方式:一是自上而下,一是自下而上. Bill Inmon先生推崇“自上而下”的方式,即一个企业建立唯一的数据中心,就像一个数据的仓库,其中数据是经过整合.经过清 ...
- Selenium 3----设置元素等待
在做Web应用的自动化测试时,定位元素必不可少,这个过程经常出现定位不到元素的情况,常见原因有哪些呢? 1.描述错误 提高编写水平.细心 2.Frame/Iframe框架原因 在元素所在框架里定位该元 ...
- 如何将WORD表格转换成EXCEL表格
WORD和EXCEL都可以制作表格,但WORD表格与EXCEL表格之间有着很明显的差距,所以在办公中经常会需要将WORD转换成EXCEL,今天小编就教大家一招将WORD表格转换成EXCEL表格. 操作 ...
- Kruskal || BZOJ 1601: [Usaco2008 Oct]灌水 || Luogu P1550 [USACO08OCT]打井Watering Hole
题面:P1550 [USACO08OCT]打井Watering Hole 题解:无 代码: #include<cstdio> #include<cstring> #includ ...
- Nginx的upstream反向代理、负载均衡详解
这篇文章的前提是已经配置好了NGINX,而且tomcat已经配置好了,而且能能够访问了. 说反向代理之前,我们先看看正向代理,正向代理也是大家最常接触的到的代理模式. 正向代理最大的特点是客户端非常明 ...
- 监听器 Listener
监听器:监听某个对象状态的变化 被监听的对象:request.session.servletContext 监听对象的创建和销毁/对象属性的变化 ServletContext HttpSession ...