分布式NOSQL数据库--Hbase相关概念
2021/6/30 2:20:50
本文主要是介绍分布式NOSQL数据库--Hbase相关概念,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1.HBASE的功能和应用场景是什么?
★设计思想:将刚产生的数据写入分布式内存 ,内存存储达到一定阈值,将内存中的数据写入分布式磁盘【HDFS】
- (1) 功能:
对大数据量实现分布式的,高并发的和高性能的实时随机的存储(读写) - (2) 应用:
大数据量、高性能、高并发、按列存储、持久化大数据数据库存储(结构化或者半结构化)
2.为什么HBASE可以实现读写很快和大数据量存储?
- (1) 读写快:基于内存读写,达到实时效果
- (2) 大数据量:基于分布式磁盘存储
- (3) HBASE:分布式内存 + 分布式磁盘
- ①刚产生的数据写入分布式内存 ,内存存储达到一定阈值,将内存中的数据写入分布式磁盘【HDFS】
- ②写:写入分布式内存
- ③读:内存或者磁盘
★ 很多时候,Hbase的大量数据都存储在HDFS中,读取比较慢,怎么解决?
- a.使用Rowkey索引
- b.二进制文件(文件以二进制格式存储)
- c.构建有序数据存储
- d.列族设计
3.HBASE和HDFS以及Redis的区别
- (1) HBASE:分布式NOSQL数据库,实时数据库,分布式内存+分布式磁盘储存,大数据量临时或永久性存储
- (2) HDFS:分布式离线文件系统,分布式磁盘存储,大数据量永久性存储
- (3) Redis:分布式NOSQL数据库,实时数据库,分布式内存储存,大数据缓存或小数量永久性存储
4.Hbase名词解释
- (1)Namespace:HBASE中的数据库
- (2)Table:HBASE中的分布式表
- (3)Rowkey:行键,类似于MySQL中的主键,特点如下:
- ①唯一标识一行
- ②作为唯一索引
- ③HBASE表必须自带这一列,这一列的值由用户自己设计
- ④作为分区规则的判断条件:根据rowkey决定数据会写入哪个分区
- (4)ColumnFamily(cf)
列族,列的分组,任何一张Hbase的表,都至少要有一个列族,除了Rowkey以外的任何一列,都必须属于某个列族,Rowkey不属于任何一个列族- 设计原因:划分列族,读取数据时可以加快读取的性能【将拥有相似IO属性的列放入同一个列族(要读一起读,要写一起写)】
- (5)Qualifier:列标签,列的名称
- (6)Versions:多版本,HBASE中的某一行的某一列可以通过时间戳(timestamp)来储存多个版本的值
- (7)Region:分区,实现表的分布式概念
5.Hbase的架构及功能角色是什么?
-
(1)Client:负责连接服务端
- ①提交用户操作给服务端执行
- ②将服务端执行的结果返回给用户
-
(2)Hbase:由RegionServer的堆内存构建了分布式内存
-
①分布式主从架构
-
②HMaster:
-
1).管理所有从节点(监听从节点健康状态)
- a.监听Regionserver的状态,如果RegionServer发生故障,会实现这台RegionServer的数据恢复
- b.基本原理:所有RegionServer会在ZK中注册一个临时节点,Master会监听Zookeeper中的这些节点(类似于HA选举的原理)
- c.数据是如何恢复的?
HMaster会将这个regionserver对应的所有region恢复在别的regionserver上- a)若数据存储在内存上
- i.如果RegionServer断电故障,内存中的数据丢失
- ii.解决:通过持久化日志来实现
- iii.WAL(HLog,write ahead log),预写日志(数据在写入内存之前,会将这个操作记录在WAL中)
- iv.如果内存数据丢失,可以通过WAL进行恢复
- b)存储在HDFS上
如果RegionServer故障,不影响HDFS的数据
- a)若数据存储在内存上
-
2).管理元数据(将管理元数据不断写入ZK中)
- a.Master会接受所有DDL请求
- b.Master启动时会加载meta表和namespace的数据,获取元数据记录在ZK中
- c.Master会将所有管理类的元数据存储在ZK中
-
3)管理Region的分配(决定每个Region由哪个RegionServer进行管理)
- a.创建表、分配region
- b.regionserver故障,重新分配region到别的regionserver上
- c.region分裂,将新的region分配到regionserver上
-
-
③HRegionServer:存储节点(管理Region中的数据存储,接受客户端的读写请求)
- 1)负责管理所有Region的数据读写,接受客户端对于region的读写请求
- 2)实现分布式内存存储
- 3)负责维护所有存储对象:wal、region、store、memstore、blockcache、storefile
-
-
(3)HDFS:构建分布式磁盘存储
-
(4)Zookeeper:辅助选举,存储管理元数据
6.Hbase中常见的命令有哪些?
- (1)场景一:运维管理,运行Hbase脚本
- Hbase shell XXXXXXX.txt
- (2)场景二:开发测试,命令行,DDL
- ①Namespace:
Create_namespace,list_namespace,drop_namespace - ②Table:
Create[表名+列族],drop,disable,list,desc,exists…… - ③Put tbname,rowkey,cf:col,value,ts
- ④Detele taname,rowkey,cf:col
- ⑤Get tbname,rowkey,[cf:col]
- ⑥Scan tbname [Filter]
- ①Namespace:
- (3)场景三:生产开发,javaAPI,DML
7.Hbase的储存结构是什么(Region的内部存储结构)?
- Table/RegionServer:数据指定写入哪张表,提交给对应的某台RegionServer
- Region:实现分布式的构建,对整张表的数据进行数据划分
- Store:对分区数据按列族进行划分
- 不同列族的数据写入不同Store中,实现了按照列族将列进行分组;
- 根据用户查询时指定的列族,可以快速的读取对应的store;
- a.Menstore:每个Store都有一个,内存存储区域
- b.StoreFile:memstore满了,将memstore的数据写入HDFS变成storefile文件,每个Store有0个或者多个
- a)逻辑上,storefile属于Store
- b)物理上,storefile是存储在HDFS中的HFILE文件(二进制文件)
8.Hbase的数据分区规则是什么?
- 设计目的:保证大量的数据从此磁盘中读取依旧可以有很高的性能,构建有序数据(Rowkey全局有序)
★为什么要这么做?
构建全局有序,可以根据Region划分进行读取,避免全局扫描,提升从磁盘中读取大量数据的性能 - (1)Region划分:Region在-∞~ +∞区间内进行范围划分,默认只有一个,可自定义划分为多个
- (2)数据分区规则:根据Rowkey属于哪个分区就写入哪个分区
- ①实现每个分区内部的排序,就构建了全局有序
- ②写入数据的rowkey:比较是按照ASC码比较的,不是数值比较
9.热点问题
-
(1)什么是热点问题?
现象:某个时间段内,大量读写请求全部集中在某个Region中,导致这个RegionServer的负载过高,影响性能和安全性 -
(2)原因:
- ①一张表只有一个分区Region,所有数据都存储到这个分区中,分区要不断响应所有读写请求,出现热点
- ②一张表有多个分区,但Rowkey写入时是连续的,还是在可着一个分区响应
-
(3)解决方法:
- ①构建多个分区:预分区
原则:根据Rowkey或者Rowkey的前缀来构建预分区 - ②构建散列的Rowkey
- ③实现:
- 1)方式一:指定分隔段,实现预分区(前提:先设计Rowkey)
- 2)方式二:指定Region个数,自动进行Hash划分:字母和数字组合
- 3)方式三:Java API
- ①构建多个分区:预分区
10.Hbase的Rowkey如何设计?
- (1)业务原则:Rowkey的设计务必贴合业务的需求,尽量用最常用的条件组合作为Rowkey前缀
- 举个栗子:一般最常用的查询条件肯定是时间,如:timestamp_userid_orderid:订单表,所有时间查询都是走索引查询的
- (2**)唯一原则**:Rowkey必须具有唯一性,不能重复,一个Rowkey唯一标识一条数据
- (3)组合原则:将更多常用的查询条件的列放入Rowkey中组合成为Rowkey
- (4)散列原则:将Rowkey构建为散列(前缀不连续、反转、加盐)
- ①更换不连续的字段作为前缀,例如用户id
- 优点:构建了散列,数据存储相对来所均衡了
- 缺点:必须以前缀的字作为查询条件
- ②反转
一般用时间作为前缀,查询时候必须将数据反转再查询 - ③加盐(salt),本质上是对数据进行编码
缺点:查询的时候也必须对查询条件进行加盐然后再进行查询
- ①更换不连续的字段作为前缀,例如用户id
- (5)长度原则:保证业务的情况下,Rowkey越短越好,100字节以内
- ①原因:rowkey越长,比较性能越差,rowkey在底层的存储是冗余的
- ②问题:为了满足组合原则,rowkey超过了100字节怎么办?
- ③解决:实现编码,将一个长的rowkey,编码为8位,16位,32位
11.列族的设计规则是什么?
- (1)设计目的:提高查询的性能
- (2)底层实现:store层,不同的列族的数据存储在不同的store中
- (3)设计规则
- ①个数原则:根据业务场景合理划分列族的个数(一般1~3个)
注:如果列的个数不多:20列左右,可以不分列族,如果个数超过30列:建议划分2 ~ 3 个列族 - ②长度原则:列族的的名称只用于区分列族,在满足区分和业务标识的前提下,列族名称越短越好
- ①个数原则:根据业务场景合理划分列族的个数(一般1~3个)
12.Hbase使用过程中遇到哪些问题?
- (1)Hbase本身不支持SQL,如何让Hbase支持SQL开发?
- ①SQL on Hbase 工具
- 1)Hive:本质还是MR
- 2)Phonenix:专门为Hbase设计的SQL工具
- ②如果查询条件不能满足Rowkey前缀查询,走全表查询性能又比较差,怎么办?
答:构建二级索引。 - ③Hive on Hbase对比
- 1)Hive:SQL更加全面,但是不支持二级索引,底层通过分布式计算MR来实现
- 2)Phonenix:SQL支持相对来说不全面,不是通用性的SQL,有bug,但是性能较好,底层直接使用Hbase java API,支持索引实现
- ①SQL on Hbase 工具
13.Phonenix中的盐表是什么?
- (1)由Phoenix来实现自动对Rowkey编码,解决Rowkey的热点问题,不需要自己设计散列的Rowkey(自动对Hbase中盐表写入的Rowkey进行加盐)
- (2)基本语法大体类似于MySQL:upsert、delete、select
- (3)注意:一旦使用了盐表,对于盐表数据的操作只能通过Phoenix来实现,盐表不能自己指定分区段,由Phoenix自己根据自己规则来实现
14.Phoenix二级索引设计
基于Phoenix构建Hbase二级索引并维护二级索引
- step1:根据数据存储需求,创建原始数据表,将数据写入原始数据表
- Step2:根据数据查询需求,构建二级索引,Phoenix自动创建索引表
- Step3:查询数据时,Phoenix根据过滤条件是否存在二级索引,优先判断走二级索引代替全表扫描
- ①先查询索引表,根据条件查询索引表的rowkey
- ②分割得到原表的rowkey
- ③再查询原表,通过分割得到原表的rowkey,走索引查询得到需要的所有信息
- Step4:原始数据表发生数据变化时,Phoenix会自动更新索引表的数据
实现:协处理器
15.Phonenix支持几种二级索引?每种索引的应用场景和特点
- 分类:全局索引(Global Index)、覆盖索引(Coverd Index)、本地索引(Local Index),函数索引(一般不用)
基本语法:create [local] index indexName on tbname(col1……) 【include(col1)】 - (1)全局索引
- ①功能:当为某一列创建全局索引时,Phoenix自动创建一张索引表,将创建索引的这一列加上原表的rowkey作为新的rowkey(索引表,将索引字段与原表rowkey组合作为索引表的rowkey,实现二级索引查询)
- ②特点:默认只能对构建索引的字段做索引查询,若查询中包含了不是索引的字段或者条件不是索引字段,不走索引,但可强制走索引
- ③索引表结构
rowkey:查询条件字段【索引字段】 + 原表rowkey - ④应用:写少读多
- 1)当原表的数据发生更新操作提交时,会被拦截
- 2)先更新所有索引表,然后再更新原表
- (2)覆盖索引
- ①功能:在构建全局索引时,将经常作为查询条件或者结果的列放入索引表中,直接通过索引表来返回数据结果(索引表,基于全局索引,通过include将常用的字段直接放入索引表,查询时直接从索引表返回)
- ②特点:基于全局索引构建,将常用的查询结果放入索引表中,直接从索引表返回结果,不用再查询原表
- ③应用:适合于查询条件比较固定,数据量比较小的场景下
- ④注意:不建议将大部分列都放入覆盖索引,导致索引表过大,性能降低
- (3)本地索引
- ①功能:将索引数据与对应的原始数据放在同一台机器,避免了跨网络传输,提高了写的性能(通过建?列族构建rowkey来实现的)(将索引数据和原始数据都存储在原始数据表中,保证数据与索引存储在同一个region中,加快写入的性能)
- ②特点
- 1)即使查询数据中包含了非索引字段,也会走本地索引
- 2)本地索引会修改原始数据表
注:如果构建了本地索引,不能通过Hbase的API来读写数据的,必须通过Phoenix来实现读写 - 3)本地索引对盐表不生效
- ③应用:写操作比较多
- 1)提高构建索引时对写的性能的影响
- 2)最终所有索引都是为了提高读的性能的
- ④注意:本地索引不局限于是否对列构建索引,优先走本地索引实现数据查询
16.Hbase读写流程
- (1)写流程
- ①Step1:先连接ZK,获取meta表的所在Regionserver的地址
- ②Step2:读取meta表,获取表的元数据,所有region的信息
- 1)region的名称
- 2)region的起始范围
- 3)region所在的regionserver的地址
- 以上三点可回答meta表的功能是什么:
记录了Hbase中每张表的每个region的信息,即表的元数据
- ③Step3:根据rowkey来判断具体写入哪个region
- ④Step4:向RS进行请求,根据列族判断写入这个region哪个Store中
- ⑤Step5:将数据写入menstore
- 小结:
表名:决定了这条数据要写入哪些region中
Rowkey:决定了这条数据具体写入哪个Region中
列族:决定了写入这个region哪个Store中 - (2)读流程
- ①step1:获取元数据(meta表)
- ②step2:找到对应的Region
- ③step3:读取数据
- 1)先查询memstore
- 2)如果开启了缓存,就读BlockCache
- 3)如果缓存中没有,也读取storefile,从storefile读取完成以后,放入缓存中
- 4)如果没有开启缓存,就读取StoreFile
- (3)MapReduce读取Hbase数据的原理及返回值是什么?
- TableInputFormat
- ①功能一:实现分片读取:一个Region就是一个分片
- ②功能二:实现KV转换:将每个Rowkey的数据转换每个KV
- 1)K:Rowkey字节数组:ImmutableBytesWritable
- 2)V:Rowkey数据内容:Result
- (4)MapReduce写入Hbase的原理和要求是什么?
- TableOutputFormat
要求:要求输出写入Hbase的KV类型,K的类型会被忽略,V的类型强制要求为Put、Delete
- TableOutputFormat
17.什么是BulkLoad,用于什么场景解决什么问题?
- (1)应用:离线大数据量的批量写入
- (2)功能:BulkLoad:直接将数据变成HFILE二进制文件,将文件加载到表中
- (3)实现
- ①方式一:自己写代码
- ②方式二:通过工具来实现
- 1)文件:importTSV + completeBulkload
- 2)DB:Sqoop
18.Hbase优化
- (1)内存分配:根据实际工作需求,调整内存比例分配,提高性能
- (2)压缩机制:Hbase提供了多种压缩机制实现对于大量数据的压缩存储,提高性能
- • 压缩属于列族的属性:基于列族设计压缩
- (3)布隆过滤:Hbase通过布隆过滤器,在写入数据时,建立布隆索引,读取数据时,根据布隆索引加快数据的检索
- ★什么是布隆过滤器?
是列族的一个属性,用于数据查询时对数据的过滤,类似于ORC文件中的布隆索引- 列族属性:BLOOMFILTER => NONE(不开启) | ‘ROW’(行集) | ROWCOL(行列集)
- ★什么是布隆过滤器?
- (4)列族属性:使用常用的列族属性
- ①NAME:表示列族的名称
- ②VERSIONS:最大版本数
表示这个列族中的列最多可以存储几个版本的值 - ③TTL:设置版本的自动过期时间,默认永不过期的,修改单位为秒
- 1)VERSIONS = 5
- 2)MIN_VERSIONS = 2
- 3)一旦到达TTL时间,会自动清理过期的版本,只保留2个版本
- ④MIN_VERSIONS:最小版本数
- ⑤BLOCKCACHE:开启缓存,如果列族开启了缓存,这个列族从HDFS的查询就会放入缓存中
- 1)默认就开启的
- 2)工作中要将不是经常读的列族的缓存关闭
- 3)使用LRU算法淘汰过期的数据
- ⑥IN_MOMERY:最高缓存级别,meta表就是这个级别,一般情况下不建议开启
不会被优先淘汰- 1)BLOCKSIZE:存储文件的块的大小(一般不建议调整)
- 2)块越小,索引越多,查询越快,占用内存越多
- 3)块越大,索引越少,查询相对较慢,占用内存越少
- (5)其他优化
这篇关于分布式NOSQL数据库--Hbase相关概念的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南