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来理解

hbase双hmaster方案 hbase2.0新特性_zookeeper

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物理结构

hbase双hmaster方案 hbase2.0新特性_大数据_02

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基础架构–不完整版

hbase双hmaster方案 hbase2.0新特性_数据_03

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

hbase双hmaster方案 hbase2.0新特性_hbase_04


告诉你日志存在哪

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架构理解)

hbase双hmaster方案 hbase2.0新特性_hbase_05

1.store里面出现了MemStore(写缓存)结合没出出现之前,进行了优化,写缓存在写在内存里面,达到设定的阈值=>刷写到storefile,每次刷新都会生成一个新的storefile,为什么要这样设置,它类似于Hdoop中MR对小文件的处理。
2.写缓存写在内存里面,断电?
	data会丢失,用WAL进行重放
3.WAL 预写日志(类似于你拿个小本本记录你明天要干什么事情)
保证预写日志资源不会数据丢失

4.Block Cache读缓存,读先缓存里面有还是没有,有直接用,没有在继续找里面文件。
Block块是有讲究的。

5.抛开Hbase而言,我们一般存文件方式加index==>某个地方,查的时候,通过index==>找到对应文件

14.Hbase写流程

hbase双hmaster方案 hbase2.0新特性_hbase_06


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

hbase双hmaster方案 hbase2.0新特性_hbase_07

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.读流程

hbase双hmaster方案 hbase2.0新特性_zookeeper_08


读流程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

hbase双hmaster方案 hbase2.0新特性_大数据_09


读流程

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.什么是布隆过滤器?

hbase双hmaster方案 hbase2.0新特性_数据_10

原形:一个数据,特别长的数组,每一个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

hbase双hmaster方案 hbase2.0新特性_大数据_11

由于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分裂。

hbase双hmaster方案 hbase2.0新特性_数据_12


split时候出现数据倾斜怎么处理?

rowkey按照字典序排序

1

10

100

1001

1002

2

3

处理方式实现预分区

20. flume遇到小文件怎么处理?

1.三个参数设置
2.合并
3.达到世时间,自动刷写 
4.跟Hbase写原理类似。