分布式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的数据
      • 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]
  • (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),本质上是对数据进行编码
      缺点:查询的时候也必须对查询条件进行加盐然后再进行查询
  • (5)长度原则:保证业务的情况下,Rowkey越短越好,100字节以内
    • ①原因:rowkey越长,比较性能越差,rowkey在底层的存储是冗余的
    • ②问题:为了满足组合原则,rowkey超过了100字节怎么办?
    • ③解决:实现编码,将一个长的rowkey,编码为8位,16位,32位

11.列族的设计规则是什么?

  • (1)设计目的:提高查询的性能
  • (2)底层实现:store层,不同的列族的数据存储在不同的store中
  • (3)设计规则
    • 个数原则:根据业务场景合理划分列族的个数(一般1~3个)
      注:如果列的个数不多:20列左右,可以不分列族,如果个数超过30列:建议划分2 ~ 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,支持索引实现

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

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 note.04


下一篇:随时笔记