Hbase2.0.5总结
- 1.什么是Hbase?
- 2.Hbase与MySQL和Kafka之间联系与区别?
- 3关系型数据库与非关系型数据库之间区别?
- 4.分析Hbase逻辑结构图--对比MySQL来理解
- 5.分析Hbase物理结构
- 6.hbase数据模型指哪些?
- 7.大表分布式拆分流程
- 8.Hbase基础架构--不完整版
- 9.什么叫做元数据的入口?
- 10.对于Hbase安装注意事项
- 11.在公司中,节点时间不同步regionserver无法启动?怎么处理?
- 12.Hbase中常用命令
- 13.RegionServer架构(说说你对RegionServer架构理解)
- 14.Hbase写流程
- 15.MemStore Flush
- 16.读流程
- 17.什么是布隆过滤器?
- 18.StoreFile Compaction
- 19 .Region Split
- 20. flume遇到小文件怎么处理?
1.什么是Hbase?
1.一个分布式,可扩展的大数据存储数据库,非关系型数据库NOSQL
2.Hbase与MySQL和Kafka之间联系与区别?
1.Mysql对于海量的数据扩展,只能插磁盘
2.Hbase 多节点,插磁盘
3.kafka 顺序写,一般可达600M/S,随机写100M/s
Hbase能对数据,随机 实时读写访问,响应时间在1s内
京东近几年 data=> Hbase 近几年
对于Hbase的使用,用的时候不能瞎用,有讲究
3关系型数据库与非关系型数据库之间区别?
关系型数据库: 不支持分布式 支持事务 表与表之间进行关联处理数据
非关系型数据库: 支持分布式,没有事务
4.分析Hbase逻辑结构图–对比MySQL来理解
1..查询对比
(MySQL查询)
一张表,例如user表,有ID主键:
当按照ID来查询信息,即索引查询信息,速度很快。只需要根据ID迅速找到对应字段信息
当按照name查询时,速度慢,因为需要扫描整个表
(NOSQL即现在Hbase查询)
非关系数据库是KV存储结构,当你按照name查询,不在扫描所有,按照K找速度更快。
2.逻辑结构表说明
上图主要画的是为了能够表现想关系型数据库那样,要记得区分什么逻辑和物理结构
3.RowKey可理解为Mysql中ID,对比Mysql你会发现多了列族(帽子)
RowKey是有序的,按照字典序排序
4.为什么要拆出Region?(数据逻辑结构拆分)
数据表太大了,需要进行拆分,裂开,方便查询,提升速率,这是表的设计原理,以列族进行拆分叫做store
5.为什么Region包含store?
数据按照rowkey进行分,按行分,这样行显的横着比较长,需要竖着切,按照列族来切。
6.既然说hbase是按照kv进行存储,那么K是谁?
rowkey+列族名+属性名就是K
可以按照三维坐标来理解Hbase逻辑结构。
5.分析Hbase物理结构
1.TimeStamp:时间戳,一般我们叫两个版本,即你这条信息的生成时间(操作时间记录)
2.上图中phone属性,为什么有两条记录
t3可能是填手机号填错误了,t4时刻修改了一次。查询手机号,一般是返回表中最新时间戳对应的手机号码,即找出相同rowkey对应列族对应phone,时间戳值最大的那个就是你要查的手机号。
3.每次写,我们就追加一条,但是结合性能考虑,会出现一个问题,写入块,查询时间变慢,因此Hbase在读的时候需要进行优化。不然不可能达到对海量数据存储与使用。
4.store有自己的storefile
6.hbase数据模型指哪些?
1.namespace 命名空间,例如gmall类比于Hbase空间,gmall下面有多张表。hbase系统自带两个命名空间(也称之为内置表)(default和hbase),命名空间下面存放的是表。
2.table
与mysql区别:在mysql中,表一旦创建,想要再增加一列字段不行
在Hbase中可以,实现方式:需要标记在哪个列族后面加。
3.row 一行数据
hbase中每行数据由rowkey和列族组成,rowkey按照字典排序,查询只能根据rowkey进行检索(理解为三维,第一维没找到,何谈第二维)
4.column
每个列由列族和列限定符号,限定符号就是指属性信息一种,例如名字、城市、手机号。我们限定符号使用时,只对应一条属性
在创建表的时候,列族需要指定,限定符无需预定义
5.timeStamp
时间戳,即版本。数据写入记录写入hbase时间
6.cell
由{rowkey, column Family:column Qualifier, time Stamp} 唯一确定的单元。cell中的数据全部是字节码形式存贮。
7.大表分布式拆分流程
首先按照rowkey横着拆成region,rowkey几亿条,分布式存在多节点上,对于每个节点region需要竖着拆,即按照列族进行拆变成store。store包含类似三维坐标信息:即rowkey,列族,列限定符号。这三条信息组成某条字段信息。store里面有storefile,storefile存储在HDFS上。
8.Hbase基础架构–不完整版
1.RegionServer:Hbase进程。storefile类似于记录文件小本本,只对HDFS上storefile,记录和管理。
2.Region记录你要管理的东西(region从物理层面来说,没有任何东西,文件存在HDFS上)
3.若RegionServer挂掉,找其他RegionServer
4.怎么找其他RegionServer?
通过zookeeper来管理,类似kafka节点管理,zookeeper leader,来实现分布式。因此RegionServer需要配置类似brokersid一样标注TRegionServer是几号,然后由zookeeper来管理,实现分布式,zookeeper决定谁是Hmaster
因此我们可以得出结论,一台机器hbase启动是单点启动,若master挂掉,怎么办?即老大挂了,因此需要配置HA,防止出现这种状况,这就类别前面学的hadoopHA,kafka一样,
master是按照启动先后顺序决定谁是master。
9.什么叫做元数据的入口?
先知道meta,才知道在哪个region里面,元数据在对应的节点上,在节点上查节点信息,叫做元数据的入口,类似于门卫。
10.对于Hbase安装注意事项
1.一般越依赖于其他框架的越多,对于软件卸就越麻烦,直接卸载,可能会有残留新,再次装,可能出问题。
对于Hbase卸载,卸载干净,首先先卸载hbase,然后在zookeeper和HDFS中把hbase相关信息删掉,在重新安装
2.对与hbase-site.xml参数需要理解
hbase.rootdir指根目录,存储文件地方,指定一个目录
hbase.zookeeper.quorum,hbase知道端口号是2181,所以没加
HMaster 进程名,jps可以查看
3.在安装过程中,出现打印日志功能,需要更新,不要管,为什么要更新,我们就是打印日志。
4.hbase不需要配置群起群关,作者已经帮我们写好了
stop-hbase.sh
start-hbase.sh
告诉你日志存在哪
11.在公司中,节点时间不同步regionserver无法启动?怎么处理?
解决方案:
方案1.找运维
方案2.随便找一个内网电脑,其他内网电脑进行对表,怎么对表涉及hadoop关于时间服务器配置。
方案3.属性:hbase.master.maxclockskew设置更大的值,调大间隔
调大间隔可能出现数据倾斜现象
12.Hbase中常用命令
1.DDL与DML区别
DDL:创建数据库,创建表,视图,对表进行增删改查,对索引进行增删改查
DML:
SELECT 查询数据
INSERT 插入数据
UPDATE 更新数据
DELETE 删除数据
2.进入hbase shell,只需知道help和help “方法名”,就可以知道怎么使用常用的命令
3.注意事项:在企业中,凡是涉及到数据删除的命令要严谨,要问清楚,delete删除最新版本信息 deleteall删除全部版本信息
append不常用,一般是追加,追加原本value,不是追加一行数据
4.create、put、list、scan、get、truncate hlep 常用的命令
5.使用create命令,可以不写命名空间,默认放在default命名空间。
6.Hbase命令区分大小写,对于符合特别严格。
alter 'student',{NAME=>'info',VERSIONS=>3},表示将info列族中的数据存放3个版本。
不写VERSIONS默认为1
7.对于添加列族,删除列族,可以百度查一些资料,上面会有命令演示。
8.在企业中,scan命名使用注意事项:
scan '表名' 一张表 ,在企业千万不能干,尤其是实时项目,它会在你的控制台一致运行,一直跑信息处理,虽然不会OOM,但是费CPU
scan (rowkey to row key)范围是左闭有开即扫描的信息 [a,b)
另外scan扫描按照rowkey值扫描,rowkey是按照字典进行排序的,这点要明确。因此rowkey设计非常重要
9.drop删除表,需要先让表为disable状态
disable '表名'
truncate清空表信息,自带disable
13.RegionServer架构(说说你对RegionServer架构理解)
1.store里面出现了MemStore(写缓存)结合没出出现之前,进行了优化,写缓存在写在内存里面,达到设定的阈值=>刷写到storefile,每次刷新都会生成一个新的storefile,为什么要这样设置,它类似于Hdoop中MR对小文件的处理。
2.写缓存写在内存里面,断电?
data会丢失,用WAL进行重放
3.WAL 预写日志(类似于你拿个小本本记录你明天要干什么事情)
保证预写日志资源不会数据丢失
4.Block Cache读缓存,读先缓存里面有还是没有,有直接用,没有在继续找里面文件。
Block块是有讲究的。
5.抛开Hbase而言,我们一般存文件方式加index==>某个地方,查的时候,通过index==>找到对应文件
14.Hbase写流程
1)Client先访问zookeeper,获取hbase:meta表位于哪个Region Server。
2)访问对应的Region Server,获取hbase:meta表,根据读请求的namespace:table/rowkey,查询出目标数据位于哪个Region Server中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache,方便下次访问。
3)与目标Region Server进行通讯;
4)将数据顺序写入(追加)到WAL;
5)将数据写入对应的MemStore,数据会在MemStore进行排序;
6)向客户端发送ack;
7)等达到MemStore的刷写时机后,将数据刷写到HFile。
1.写流程肯定会涉及到put命令
2.写到哪?regionserver,客户端先的知道meta在哪,需要请求zookeeper,meta表所在的regionserver在哪,zookeeper会把meta给客户端,首先现自己拷贝一份到内存,不能一直问zookeeper。所以叫metacache,然后客户端向Hbase请求meta,表名对应region,在哪个regionserver,返回meta和RS,RS代表是rowkey的范围
3.首先MemStore什么时候返回ACK?,ack值kafka中ack取值一样原理
写到写缓存里面就返回ACK,为什么不在WAL返回?因为WAL可以重放,整个流程它还是先写WAL===>在写到缓存里面,什么时候会写到StoreFile,MemStore达到阈值就会刷写出来到HDFS中
15.MemStore Flush
1.什么时候刷写?
达到阈值就会刷写,一个region可能有多个store
一个store对应一个Memstore,刷写的时候一起往下刷写。
2.需要注意的问题,store按照列族切的,列族太多可能出问题。数据划分有点慢。
3.一个region多个store规则是是一起往下刷写,可能引起一下问题?涉及到优化
例如一个store达到1M刷写,另一个还只存了1kB,谁先达到了刷写机制,就会执行这个任务调度,这就可能造成小文件过多现象。
在Hadoop里面shuffle中,环形缓冲区达到80%刷写,90%不能再写,刷写减低百分比,才能继续输入data
4.刷写时机:
1)当某个memstore达到了128M所在的region下写缓存会刷写,同时会阻止写数据
2)当region server中memstore的总大小达到JVM总缓存,JVM会给hbase40%,在你hbase使用达到95%警戒线就会limit,强迫下面的region执行刷写。
3)自动刷写(默认时间是1小时)
4)WAL文件数量超限,一般不会达到,现在企业不怎么用这个相关参数。
Memstore刷写时机官网上有:查的流程如下:
hbase.apache.org官网=>开发文档API=>2.2=>Ref Guide=>https://hbase.apache.org/2.2/book.html
把2.2给为2.0,在查询
找到
7. Default Configuration
在这里面可以找到对应的参数
16.读流程
读流程1
1.先去请求meta表所在的RegionServer
2.fzookeeper返回meta
3.client先自己缓存meta cache
4.请求meta 返回meta 获取RS,RS对应的RowKey范围
5.发送get请求
6.读的位置多个地方
Block cache (之前读过)
MemStore(没读过)
storeFile(前两个都没读过),前两个是内存
读的就是HFile
读流程
1.一个HFile不是整个一个文件,里面是block
2.HDFS切这个块,一个block块 65k 小块
3.HFile要存这些索引,通过索引找到64K小块 读出去,全放在Block Cache所以这就是Block Cache由来叫做块缓存。
读的原理:先看缓存,没有 块 有索引
优化:eg:上次读了3个小块,这次读直接拿索引,性能极大提升,不用从头读。
例如查 RowKey=1001数据扫描Hfile 存在海量HFile,太慢。先查1001 Hfile处理。 优化===> Merge
把文件拉过来合并。
4.三个文件都叫过滤器
1)时间范围过滤器 eg:get 13:00-15.00数据 刷写默认时间范围是1小时 设置max时间 mintime
2)RowKey范围过滤器 rowkeybao保证Hbase文件必须有序,排序在MemStore排序,分区内有序,分区间无序
3)布隆过滤器
17.什么是布隆过滤器?
原形:一个数据,特别长的数组,每一个HFile都有一个过滤器,我们在put数据,例如
1001 rk
hash之后
跟数组对比
在继续put
1008 rk
hash之后
跟数组中标记做对比
现在想知道1010在不在Hash File里面
把1010 先has 的到hash 需要在 布隆过滤器 对比 比较 能对应上 有 否则 没有
布隆过滤器能够实现海量数据的碰撞
为什么数组这么长,避免Hash值有冲突
比如对200万值碰撞处理
大概需要1亿位长度数组
有一个公式:200万先乘(3-10)在乘10
今后用布隆过滤器碰撞,一般数组长度就是放大20-20倍左右
布隆过滤器在哪里用到过?
实现过滤去重
1.离线项目:group by
2.实时项目:布隆过滤器处理最快,hash值查找速度个数级别最快
18.StoreFile Compaction
由于memstore每次刷写都会生成一个新的HFile,且同一个字段的不同版本(timestamp)和不同类型(Put/Delete)有可能会分布在不同的HFile中,因此查询时需要遍历所有的HFile。为了减少HFile的个数,
以及清理掉过期和删除的数据,会进行StoreFile Compaction。
Compaction分为两种,分别是Minor Compaction和Major Compaction。Minor Compaction会将临近的若干个较小的HFile合并成一个较大的HFile,
并清理掉部分过期和删除的数据。Major Compaction会将一个Store下的所有的HFile合并成一个大HFile,并且会清理掉所有过期和删除的数据。
19 .Region Split
默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的Region Server,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的Region Server。
Region Split时机:
1.当1个region中的某个Store下所有StoreFile的总大小超过hbase.hregion.max.filesize,该Region就会进行拆分(0.94版本之前)。
2.当1个region中的某个Store下所有StoreFile的总大小超过Min(initialSize*R^3 ,hbase.hregion.max.filesize"),该Region就会进行拆分。其中initialSize的默认值为2*hbase.hregion.memstore.flush.size,R为当前Region Server中属于该Table的Region个数(0.94版本之后)。
具体的切分策略为:
第一次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了。
3.Hbase 2.0引入了新的split策略:如果当前RegionServer上该表只有一个Region,按照2 * hbase.hregion.memstore.flush.size分裂,否则按照hbase.hregion.max.filesize分裂。
split时候出现数据倾斜怎么处理?
rowkey按照字典序排序
1
10
100
1001
1002
2
3
处理方式实现预分区
20. flume遇到小文件怎么处理?
1.三个参数设置
2.合并
3.达到世时间,自动刷写
4.跟Hbase写原理类似。