大数据技术之Hbase简介以及底层原理详解

简介

概述

  1. HBase是有Apache提供的基于Hadoop的分布式,可扩展的非关系型数据库
  2. HBase可以管理很大的数据的表 - billions of rows X millions of columns
  3. HBase是Doug Cutting根据Google的BigTable来实现,所以HBase和BigTable的原理一模一样,只是BigTable是用C语言实现的,HBase是Java语言实现的
  4. 本身是非关系型数据库,底层是利用键值对来存储
  5. 在HBase中也不支持多表关联
  6. HBase中数据类型只支持字符串和数字
  7. 适合存储稀疏数据 - 结构化数据和半结构化数据
  8. 在put的时候表名列族以及行键都一样,再一次put是更新的效果
  9. hbase作为一个数据库提供了完整的增删改查的功能,但是hbase是基于hdfs来进行存储的,hdfs上的数据是允许一次写入多次读取不允许修改允许追加的,hbase如何实现“改”的功能 - 当执行“改”操作的时候,HBase并不是修改原来的数据,而是在HDFS中存储的文件的尾端来追加数据,每一条数据都会自动添加时间戳,这个时间戳就是版本
  10. 通过时间戳,每一次默认返回最新的数据
  11. HBase中的表默认只保留一个版本的数据,也只返回一个版本的数据,如果保留版本,需要建表时需要手动指定

基本概念

  1. Rowkey - 行键

    • 在HBase中没有主键的概念,而是采用行键
    • 行键不属于任意列族
    • 建表的时候不需要指定行键,行键是在添加数据的时候手动指定
    • 默人字典排序
  2. Column Family - 列族/列族

    • 在HBase中,一个表中至少包含一个列族,可以多个列族
    • 理论上来说,列族的数量不限定,但一个表一般不超过三个。
    • 一个列族中可以包含0到多个列 - HBase,列是可以动态增删的,建表的时候不需要指定列。
  3. Cell - 单元

    • 在HBase中,通过行键+列族+列+版本可以确定唯一数据,这个结构成为cell单元
  4. namespace - 名称空间

    • 类似于mysql中的database
    • 默认自带两个名称空间default和hbase
    • 如果没有指定默认使用default

基本指令

命令解释
status查看HBase状态
version查看hbase的版本
whoami查看当前用户
create ‘person’ ,{NAME =>‘basic’},{NAME => ‘info’},{NAME => ‘other’}建表方式
List查看已经建立的表
put ‘person’ ,‘p1’ , ‘basic:name’ ,‘Reason’表示向person表中的basic列族name列添加行键p1的数据Reason
get ‘person’, ‘p1’, ‘basic:name’获取basic 列族name列的值
get ‘person’, ‘p1’, ‘basic’获取basic 列族所有值
get ‘person’ , ‘p1’获取行键p1所有的值
scan ‘person’ ,{COLUMNS => ‘basic:name’}获取basic所有name列的值
scan ‘person’ ,{COLUMNS => ‘basic’}获取basic列族所有列的值
scan ‘person’查看person表中的所有数据
delete ‘person’ ,‘p2’ ,‘other:phone’删除行键p2 other列族的phone字段
deleteall ‘person’ ,‘p2’删除行键p2的所有数据
create ‘student’ , {NAME => ‘basic’ ,VERSIONS =>3} ,{NAME => ‘info’ ,VERSIONS =>5}创建一个student表有basic 和info两个列族,basic保留三个版本,info保留5个版本
get ‘student’,‘s1’ ,{COLUMN =>‘basic:age’,VERSIONS => 4}查询student表列族为basic age字段的4个版本的值,但建表的时候指定三个版本,只能拿到最新的三个版本的值
disable ‘student’先禁用表
drop ‘student’再删除表
describe ‘person’ or desc ‘person’描述person表的信息
enable ‘person’启用person表
exits ‘person’判断person表是否存在
create ‘demo:person’ ,‘basic’ ,‘expand’在指定工作空间demo下创建person
list_namespace_tables ‘demo’查看指定名称空间的表
list_namespace查看所有的名称空间
create namespace ‘demo’创建名称空间demo
disable_all ‘demo:.*’禁用demo空间下所有的表
drop_all ‘demo:.*’删除demo中所有的表
drop_namespace ‘demo’删除工作空间demo

理论

HRegion

  1. 在HBase,会从行键方向上将一个表拆分成一个或者多个HRegion
  2. 每一个HRegion都会交会交由某一个HRegionServer来进行管理
  3. 由于行键是字典排序,所以HRegion之间的范围是不交叉的,也因此客户端在请求的时候会根据行键去访问不同的HRegionServer
  4. HRegion实际上是行键排序(默认是字典排序)后的按规则分割的连续的存储空间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nwoq1mNO-1626053727764)(/Users/yuxiangrui/blog/source/picture/截屏2020-04-27下午5.35.27.png)]

  1. 一张Hbase表,可能有多个HRegion,每个HRegion达到一定大小(默认是10GB)时,进行分裂。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6N3eTgEv-1626053727766)(/Users/yuxiangrui/blog/source/picture/截屏2020-04-27下午5.37.21.png)]

  2. HRegion包含了一个到多个HStore,HStore的数量由列族来决定

  3. HStore中包含一个1个memStore可能包含0个或多个storefile/hfile,hfile会落地到HDFS上进行存储

Zookeeper

  1. 当HBase第一次启动的时候,会在Zookeeper上注册一个持久节点
  2. 当HBase启动时候,HMaster会自动在zookeeper来注册一个/hbase/master节点
  3. Backup HMaster会自动在Zookeeper的/hbase/backup-masters下自动注册临时节点
  4. zookeeper在HBase中的作用注册中心的作用/统一注册

HMaster

  1. HMaster的状态分为:Active(活跃)和Backup(备份)
  2. 在任意一个安装了HBase去启动hmaster,sh hbase-daemon.sh start master
  3. 在HBase中不限制Hmaster 的个数,先开启的HMaster会自动成为active状态,后开启的为backup状态
  4. 当Active HMaster收到请求之后需要将这个请求和Backup HMaster之间进行备份,也因此在实际开发过程中Hamster的个数一般不超过三个1active Hmaster +2 backup hmaster
  5. Active HMaster会定时给Zookeeper发送心跳,同时监控/hbase/backup-masters下的子节点个数变化,如果发现/hbase/backup-masters下的字节点个数增加说明新增了Backup Hmaster;反之说明有节点产生丢失
  6. backup hmaster会定时给zookeeper发送心跳,同时监控/hbase/master节点是否存在,如果不存在意味着Active HMaster丢失
  7. HMaster的作用
    • 管理HRegionServer,主要是HRegion在HRegionServer之间的负载和转移
    • 管理HBase中的表结构(DDL操作),但是HMaster不负责表数据(DML操作)的管理

集群结构角度的读写流程

  1. 在HBase0.96之前
  2. 从HBase0.96开始
    • 去掉了-ROOT- 文件
    • 客户端从zookeeper中获取.meta.文件的位置之后会自动进行缓存,从第二次操作开始,就不需要再去访问zookeeper
    • 客户端从.meta.文件中读取数据之后也会自动进行缓存,但是如果发生了HRegion的分裂转移或者客户端宕机,那么缓存就会失效就需要重新建立缓存

HBase命令组

  1. DDL(Data Definition Language)数据库模式定义语言, 是用于描述数据库中要存储的现实世界实体的语言。
  2. DML(Data Manipulation Language)数据操纵语言,用户通过它可以实现对数据库的基本操作。

HRegionServer

  1. HRegionServer是HBase中的从节点,作用是用于管理HRegion,HRegion中的数据最终会以HFile形式存储到datanode
  2. 官方文档中,一个HRegionServer大概能管理1000个HRegion
  3. 一个HRegionServer由1个WAL(HLog)、1个BlockCache和0到多个HRegion来构成

WAL

  1. WAL - write ahead log 也称 Hlog
    • HRegionServer在收到写操作之后,会先将这个写操作记录到WAL中,然后再将数据更新到对应的memStore中,这样的设计是为了防止数据的丢失
    • WAL是维系在磁盘中,当达到指定条件的时候,WAL就会产生滚动,产生一个新的WAL,原来的WAl会变成OLD_WAL,OLD_WAL会在某一时刻被清除,这样做的目的是为了节省磁盘空间
    • 在HBase0.94版本之前,WAL是串行写;从HBase0.94版本开始,WAL引入了管道机制,所以允许进行并行写
    • 在实际开发过程中,如果能够容忍一定的数据库的数据产生丢失,可以关闭WAL提高写入效率

BlockCache - (数据块)缓存

  • BlockCache是一个读缓存,即会讲读取出来的数据进行缓存
  • BlockCache在进行数据缓存的时候,采取了“局部性”原理 —— “局部性”原理:实际就是一个猜测的过程,根据一定条件猜测来提高命中率
    • 时间局部性:在HBase中,如果一条数据被读取过,那么HBase就会把这条数据放入缓存
    • 空间局部性:在HBase中,如果一条数据被读取过,那么HBase会把与这条数据相邻的数据发入缓存中
  • BlockCache会将数据维系在内存中,BlockCache大小是128M
  • BlockCache在填满之后,采取LRU策略(Least recently used)抛弃最长时间不用的数据

HRegion

  • HRegion由一个到HStore来构成的 ,HStore的数量由列族的数量来决定
  • 每一个HStore中包含一个memStore以及0到多个HFile
    • memStore是一个写缓存,维系在内存中,大小是128M
    • memStore在达到指定条件之后,会产生冲刷,冲刷出一个HFile,HFile最终会落地到HDFS上
    • memStore冲刷条件:
      a) 当memStore满了之后,会冲刷产生一个HFile
      b)当我的WAL达到1G大小的时候,会冲刷产生一个HFile
      c) 当所有的memStore所占用的内存之和占到总内存的35%的时候,就会自动冲刷几个比较大的memstore
    • 第三个条件在实际开发过程中产生的频率最高,这会使HDFS产生大量的小文件

Compaction机制

  1. HBase中提供了Compaction机制,允许将多个HFile合并成一个HFile
  2. 分类:
    • minor compact :初次合并,在合并的时候,会讲相邻的几个小的HFile合并成一个较大的HFile不合并,合并完成之后依然存在多个HFile
    • major compact :主合并,在合并的时候。HFile无论多大,都会参与合并,最终会合并成一个HFile
  3. 在HBase中,如果不指定的情况下,默认使用minor compact
  4. 相对而言,minor compact 的效率更高一些,major compact虽然合并力度更大,但是在实际开发中,每次进行major compact都需要花费5-6个小时,在合并过程中,集群的大量资源(I/O、cpu等)倾斜到合并上,所以此时集群对外服务的效率会大大降低,所以major compact一般放在周末的凌晨进行
  5. 在合并的过程中,舍弃掉被标记为删除数据或者过时的数据,所以删除是在合并的过程中发生的

读写流程

写流程

  1. 当HRegionServer在收到写请求之后,会将写请求记录到到WAl中,会将数据更新到memStore中
  2. 数据在memStore中会进行排序:行键字典排序—>列族字典排序->列字典排序->时间戳倒序
  3. 当memStore达到冲刷条件的时候,会冲刷产生一个新的HFile,这个HFile是有序的 - 所有的HFile之间是局部有序的
  4. 正因为HFile是有序的,所以每一个HFile都把持了各自的起始行键和结束行键
  5. HFile最终会落地到HDFS中以block形式存储
    HFile的v1格式
    • DataBlock:存储数据,可以一个可以多个

      • 包含一个magic和多个key value
        1. magic: 魔数 本质上一个随机数,用于校验的

        2. KeyValue:DataBlock中存储的数据都是以键值对

      • 最小存储单位datablock
    • MetaBlock:存储元数据,一般只出现在.meta.文件中,其他的HFile中的一般没有这一块

    • FileInfo: 文件信息,对当前HFile的描述,例如文件大小信息

    • DataIndex:DataBlock的索引值,记录每一个DataBlock在文件中的起始字节和结束字节位置

    • MetaIndex:MetaBlock的索引值,记录每一个MetaBlock在文件中的起始字节和结束字节位置

    • Trailer:在文件末尾,固定占4个字节大小,其中前2个字节记录DataIndex在文件的起始字节位置,后2个字节记录MetaIndex在文件的起始字节位置

读流程

  1. 当HRegionServer收到请求之后,会首先从blockcahe中读取数据,如果没有读到,会从memstore中读
  2. 如果以上都没有读到,就会从HFile中读,会根据行键范围删选掉不符合范围的Hfile,再利用布隆过滤器筛选出一定没有的,缩小范围。

热门文章

暂无图片
编程学习 ·

C语言二分查找详解

二分查找是一种知名度很高的查找算法,在对有序数列进行查找时效率远高于传统的顺序查找。 下面这张动图对比了二者的效率差距。 二分查找的基本思想就是通过把目标数和当前数列的中间数进行比较,从而确定目标数是在中间数的左边还是右边,将查…
暂无图片
编程学习 ·

GMX 命令分类列表

建模和计算操作命令: 1.1 . 创建拓扑与坐标文件 gmx editconf - 编辑模拟盒子以及写入子组(subgroups) gmx protonate - 结构质子化 gmx x2top - 根据坐标生成原始拓扑文件 gmx solvate - 体系溶剂化 gmx insert-molecules - 将分子插入已有空位 gmx genconf - 增加…
暂无图片
编程学习 ·

一文高效回顾研究生课程《数值分析》重点

数值分析这门课的本质就是用离散的已知点去估计整体,就是由黑盒子产生的结果去估计这个黑盒子。在数学里这个黑盒子就是一个函数嘛,这门课会介绍许多方法去利用离散点最大化地逼近这个函数,甚至它的导数、积分,甚至微分方程的解。…
暂无图片
编程学习 ·

在职阿里5年,一个28岁女软测工程师的心声

简单的先说一下,坐标杭州,14届本科毕业,算上年前在阿里巴巴的面试,一共有面试了有6家公司(因为不想请假,因此只是每个晚上去其他公司面试,所以面试的公司比较少) ​ 编辑切换为居中…
暂无图片
编程学习 ·

字符串左旋c语言

目录 题目: 解题思路: 第一步: 第二步: 第三步: 总代码: 题目: 实现一个函数,可以左旋字符串中的k个字符。 例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符…
暂无图片
编程学习 ·

设计模式--观察者模式笔记

模式的定义与特点 观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式&#xf…
暂无图片
编程学习 ·

睡觉突然身体动不了,什么是睡眠痽痪症

很多朋友可能有这样的体验,睡觉过程中突然意识清醒,身体却动弹不了。这时候感觉非常恐怖,希望旁边有一个人推自己一下。阳光以前也经常会碰到这样的情况,一年有一百多次,那时候很害怕晚上到来,睡觉了就会出…
暂无图片
编程学习 ·

深入理解C++智能指针——浅析MSVC源码

文章目录unique_ptrshared_ptr 与 weak_ptrstd::bad_weak_ptr 异常std::enable_shared_from_thisunique_ptr unique_ptr 是一个只移型别(move-only type,只移型别还有std::mutex等)。 结合一下工厂模式,看看其基本用法&#xff…
暂无图片
编程学习 ·

@TableField(exist = false)

TableField(exist false) //申明此字段不在数据库存在,但代码中需要用到它,通知Mybatis-plus在做写库操作是忽略它。,.
暂无图片
编程学习 ·

Java Web day15

第十二章文件上传和下载 一、如何实现文件上传 要实现Web开发中的文件上传功能,通常需要完成两步操作:一.是在Web页面中添加上传输入项;二是在Servlet中读取上传文件的数据,并保存到本地硬盘中。 需要使用一个Apache组织提供一个…
暂无图片
编程学习 ·

【51nod 2478】【单调栈】【前缀和】小b接水

小b接水题目解题思路Code51nod 2478 小b接水 题目 输入样例 12 0 1 0 2 1 0 1 3 2 1 2 1输出样例 6解题思路 可以发现最后能拦住水的都是向两边递减高度(?) 不管两个高积木之间的的积木是怎样乱七八糟的高度,最后能用来装水的…
暂无图片
编程学习 ·

花了大半天写了一个UVC扩展单元调试工具

基于DIRECTSHOW 实现的,用的是MFC VS2019. 详见:http://www.usbzh.com/article/detail-761.html 获取方法 加QQ群:952873936,然后在群文件\USB调试工具&测试软件\UVCXU-V1.0(UVC扩展单元调试工具-USB中文网官方版).exe USB中文网 USB中文…
暂无图片
编程学习 ·

贪心(一):区间问题、Huffman树

区间问题 例题一:区间选点 给定 N 个闭区间 [ai,bi]请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式 第一行包含整数 N,表示区间数。 接下来 …
暂无图片
编程学习 ·

C语言练习实例——费氏数列

目录 题目 解法 输出结果 题目 Fibonacci为1200年代的欧洲数学家,在他的着作中曾经提到:「若有一只免子每个月生一只小免子,一个月后小免子也开始生产。起初只有一只免子,一个月后就有两只免子,二个月后有三只免子…
暂无图片
编程学习 ·

Android开发(2): Android 资源

个人笔记整理 Android 资源 Android中的资源,一般分为两类: 系统内置资源:Android SDK中所提供的已经定义好的资源,用户可以直接拿来使用。 用户自定义资源:用户自己定义或引入的,只适用于当前应用的资源…
暂无图片
编程学习 ·

零基础如何在短时间内拿到算法offer

​算法工程师是利用算法处理事物的职业 算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。 如果一个算法有缺陷,或不适合于某个问题,执…
暂无图片
编程学习 ·

人工智能:知识图谱实战总结

人工智能python,NLP,知识图谱,机器学习,深度学习人工智能:知识图谱实战前言一、实体建模工具Protegepython,NLP,知识图谱,机器学习,深度学习 人工智能:知识图…
暂无图片
编程学习 ·

【无标题】

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…