• HBase读数据流程:

前置关键词描述:

  • Block Cache :读缓存,缓存上一次读的数据,整个ReginServer只有一个
  • MemStore :写缓存,缓存上一次写的数据,每个Store有一个
  • WAL: 预写入日志

读取数据流程:

  • 1.请求zk 查询meta表的地址
  • 2.根据meta表的地址查询rowkey属于哪个reginserver的哪个regin,元数据缓存到MetaCache
  • 3.先去BlockCache 和MemStore查找,找不到才去storeFile找,如果在storeFile 查询到,就缓存到BlockCache里

HBase写数据流程:

写数据流程:

  • 1.请求zk 查询meta表的地址
  • 2.根据meta表的地址查询rowkey属于哪个reginserver的哪个regin,元数据缓存到MetaCache
  • 3.先写WAL,再写MemStore,写入MemStore就返回了,
  • 如果MemStore内存不够,会flush storeFile文件,然后合并多个storeFile

注: Hbase的写流程比读流程效率高,因为写流程只需要写入内存,读流程先读内存,如果读不到,还需要读磁盘文件。

HBase的flush(刷写) 机制:

刷写条件:

  • 1.MemStore大小达到128M
  • 2.时间超过1小时
  • 3.Reginserver的所有Memstore大小达到reginserver占用的堆内存大小的40%

 注: 上述条件默认每10s检查一次

为防止检查之前达到刷写条件,会触发阻塞机制.

阻塞机制触发条件:

  • Memstore达到512M
  • Reginserver的所有Memstore大小达到堆内存的0.95*0.4

避免阻塞机制的解决方案:

如果出现这种情况,可以增大memstore大小,增大reginserver的堆内存大小。

Compact合并机制:

minor compact 小合并:   

文件被选中条件:

  • 1. 待合并文件数量大于3
  • 2.待合并文件数量 小于10
  • 3.文件大小小于128M的文件一定会加入
  • 4.排除特别大的文件

合并触发条件:

  • 1.menstore flush
  • 2.定期检查,默认10s

Major compact:

  • 合并所有的HFile,默认7天执行一次,生产中默认关闭
  • 手动:major_compact 表名

  注意:真正的删除是在这一步进行

Region 拆分机制:

IncreasingToUpperBoundRegionSplitPolicy:

0.94版本~2.0版本默认切分策略:

切分策略稍微有点复杂,总体看和ConstantSizeRegionSplitPolicy思路相同,一个region大小大于设
置阈值就会触发切分。但是这个阈值并不像ConstantSizeRegionSplitPolicy是一个固定的值,而是会
在一定条件下不断调整,调整规则和region所属表在当前regionserver上的region个数有关系.
region split的计算公式是:
regioncount^3 * 128M * 2,当region达到该size的时候进行split
例如:
第一次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了

SteppingSplitPolicy:

  2.0版本默认切分策略,其它版本参考百度:

这种切分策略的切分阈值又发生了变化,相比 IncreasingToUpperBoundRegionSplitPolicy 简单了
一些,依然和待分裂region所属表在当前regionserver上的region个数有关系,如果region个数等于
1,
切分阈值为flush size(128M) * 2,否则为MaxRegionFileSize(10GB)。这种切分策略对于大集群中的大表、小表会
比 IncreasingToUpperBoundRegionSplitPolicy 更加友好,小表不会再产生大量的小region,而是
适可而止。

Hbase 预分区:

  为了负载均衡,提高读写效率,否则刚开始读写都在一个机器上进行。

  通常解决负载均衡问题,还有以下解决方案:

  • 给row key 加前缀
  • 对row key 进行hash
  • 反转

Region 合并:

  Region的合并不是为了性能,而是出于维护的目的。

通过Merge类冷合并Region:

  • 需要先关闭hbase集群
  • 需求:需要把student表中的2个region数据进行合并:

    student,,1593244870695.10c2df60e567e73523a633f20866b4b5.

    student,1000,1593244870695.0a4c3ff30a98f79ff6c1e4cc927b3d0d.

这里通过org.apache.hadoop.hbase.util.Merge类来实现,不需要进入hbase shell,直接执行(需要 先关闭hbase集群):

hbase org.apache.hadoop.hbase.util.Merge student \
student,,1595256696737.fc3eff4765709e66a8524d3c3ab42d59. \
student,aaa,1595256696737.1d53d6c1ce0c1bed269b16b6514131d0.

通过online_merge热合并Region:

  • 不需要关闭hbase集群,在线进行合并。
与冷合并不同的是,online_merge的传参是Region的hash值,而Region的hash值就是Region名称的最
后那段在两个.之间的字符串部分。
需求:需要把lagou_s表中的2个region数据进行合并:
student,,1587392159085.9ca8689901008946793b8d5fa5898e06. \
student,aaa,1587392159085.601d5741608cedb677634f8f7257e000.
需要进入hbase shell:
merge_region
'c8bc666507d9e45523aebaffa88ffdd6','02a9dfdf6ff42ae9f0524a3d8f4c7777'

RowKey 设计:

  • RowKey长度原则

    • rowkey是一个二进制码流,可以是任意字符串,最大长度64kb,实际应用中一般为10-100bytes, 以byte[]形式保存,一般设计成定长。
    • 建议越短越好,不要超过16个字节  设计过长会降低memstore内存的利用率和HFile存储数据的效率。
  • RowKey散列原则
    • 建议将rowkey的高位作为散列字段,这样将提高数据均衡分布在每个RegionServer,以实现负载均 衡的几率。
  • RowKey唯一原则
    • 必须在设计上保证其唯一性
  • RowKey排序原则
    • HBase的Rowkey是按照ASCII有序设计的,我们在设计Rowkey时要充分利用这点

scan使用的时候注意:setStartRow,setEndRow 限定范围, 范围越小,性能越高。

海量列式非关系数据库HBase 原理深入的更多相关文章

  1. 海量列式非关系数据库HBase 架构,shell与API

    HBase的特点: 海量存储: 底层基于HDFS存储海量数据 列式存储:HBase表的数据是基于列族进行存储的,一个列族包含若干列 极易扩展:底层依赖HDFS,当磁盘空间不足的时候,只需要动态增加Da ...

  2. 列式存储hbase系统架构学习

    一.Hbase简介 HBase是一个开源的非关系型分布式数据库(NoSQL),它参考了谷歌的BigTable建模,实现的编程语言为 Java.它是Apache软件基金会的Hadoop项目的一部分,运行 ...

  3. 【HBase】与关系型数据库区别、行式/列式存储

    [HBase]与关系型数据库区别 1.本质区别 mysql:关系型数据库,行式存储,ACID,SQL,只能存储结构化数据 事务的原子性(Atomicity):是指一个事务要么全部执行,要么不执行,也就 ...

  4. HBase 是列式存储数据库吗

    在介绍 HBase 是不是列式存储数据库之前,我们先来了解一下什么是行式数据库和列式数据库. 行式数据库和列式数据库 在维基百科里面,对行式数据库和列式数据库的定义为:列式数据库是以列相关存储架构进行 ...

  5. Hbase与Oracle比较(列式数据库与行式数据库)

    Hbase与Oracle比较(列式数据库与行式数据库) 1 主要区别 Hbase适合大量插入同时又有读的情况 Hbase的瓶颈是硬盘传输速度,Oracle的瓶颈是硬盘寻道时间.   Hbase本质上只 ...

  6. Hadoop HBase概念学习系列之HBase里的列式数据库(十七)

    列式数据库,从数据存储方式上有别于行式数据库,所有数据按列存取. 行式数据库在做一些列分析时,必须将所有列的信息全部读取出来 而列式数据库由于其是按列存取,因此只需在特定列做I/O即可完成查询与分析, ...

  7. 列式数据库~clickhouse 底层存储原理

    简介:今天介绍列式数据库的一些基本原理 一  数据目录 Data目录 数据存储目录,数据按照part分成多个文件夹,每个文件夹下存储相应数据和对应的元信息文件 Metadata 表定义语句,存储所有表 ...

  8. 图解大数据 | 海量数据库查询-Hive与HBase详解

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/84 本文地址:http://www.showmeai.tech/article-det ...

  9. Parquet与ORC:高性能列式存储格式(收藏)

    背景 随着大数据时代的到来,越来越多的数据流向了Hadoop生态圈,同时对于能够快速的从TB甚至PB级别的数据中获取有价值的数据对于一个产品和公司来说更加重要,在Hadoop生态圈的快速发展过程中,涌 ...

随机推荐

  1. 编程熊讲解LeetCode算法《二叉树》

    大家好,我是编程熊. 往期我们一起学习了<线性表>相关知识. 本期我们一起学习二叉树,二叉树的问题,大多以递归为基础,根据题目的要求,在递归过程中记录关键信息,进而解决问题. 如果还未学习 ...

  2. Linux虚拟机配置SSH免密登录

    本环境为CentOS 7(点击镜像下载iso文件),无图界面. 启动SSH服务 在/usr/sbin/有一个文件为sshd,然后输入绝对路径/usr/sbin/sshd即可开启ssh服务. 然后输入命 ...

  3. 关于Algorithm in Nutshell源代码

    获取源码包 "Algorithm in Nutshell"的源码包ADK-1.0.zip在这本书主页上"Download Example Code"页面的Rel ...

  4. 卓越的教练是如何训练高手的?(谈谈memmove)

    编者按:我们知道,优秀的运动员除了自身的天赋和努力之外,出色的教练必不可少.一个成功的企业除了拥有出类拔萃的员工之外,同样需要一位出色的教练,那就是企业的CEO.由此可见,如果我们要想成为一位优秀的程 ...

  5. Golang语言系列-01-Go语言简介和变量

    Go语言简介 Go(又称Golang)是Google开发的一种静态强类型.编译型.并发型,并具有垃圾回收功能的编程语言. 罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pi ...

  6. Vue系列-03-vue-cli自动化工具

    使用Vue-CLI创建项目 安装vue-cli脚手架 Mac安装vue-cli脚手架 lichengguo@lichengguodeMacBook-Pro ~ % sudo npm install - ...

  7. noip34

    因为改不动T3而来水博客的屑 昨晚没睡好,大致看了一遍题面后,选择了死亡231,然后就死的很惨. T1 一开始大致看题面的时候,就略了一眼,加上没读全题,啥思路也没有,最后四十分钟滚回来看了看,发现就 ...

  8. shell脚本基本使用教程

    sh脚本的固定第一行 #!/bin/bash 变量 #!/bin/bash var1=1 var2=2 var3=$[var1+var2] echo "$var3" 传达参数 sh ...

  9. Centos7上yum安装mongodb(安装epel中的版本可能会比较老)

    yum install epel-release 搜索mongodb-server 安装mongodb yum install mongodb-server.x86_64 配置mongodb vim ...

  10. TypeScript 入门指南 【大白话】

    前言 聊聊为何要学习TypeScript? 从开发角度来讲, TypeScript 作为强类型语言,对属性有类型约束.在日常开发中少了减少了不必要的因参数类型造成的BUG,当你在使用同事封装好的函数时 ...