4. HBase必知必会之理论基础篇

news2025/4/9 9:41:39

HBase必知必会理论基础篇

    • 1.1 HBase简介
    • 1.2 HBase 数据模型
    • 1.3 HBase整体架构
    • 1.4 HBase 读写流程
      • 1.4.1 客户端读取流程
      • 1.4.2 客户端写入流程
    • 1.5 HBase 客户端常用的方法
      • 1.5.1 scan查询
      • 1.5.2 get查询
      • 1.5.3 put查询
      • 1.5.4 delete 查询
      • 1.5.5 append 查询
      • 1.5.6 increment查询
    • 1.6 HBase 过滤器以及协处理器
      • 1.6.1 过滤器
      • 1.6.2 协处理器
    • 1.7 表设计原则

1.1 HBase简介

  • HBase是一个开源的非关系型分布式数据库(NoSQL),它参考了谷歌的BigTable建模,实现的编程语言为 Java。
  • 它是Apache软件基金会的Hadoop项目的一部分,运行于HDFS文件系统之上,为 Hadoop 提供类似于BigTable 规模的服务,可以存储海量稀疏的数据,并具备一定的容错性、高可靠性及伸缩性。

主要应用场景是实时随机读写超大规模的数据

hbase特点

  • 面向列存储,表结构比较灵活,支持多版本。
  • 数据强一致
  • 可扩展性高。
  • 实时的读/写操作
  • 支持单行事务(单row的事务,默认会加行锁)
  • 只支持rowkey、rowkey范围查询
  • 故障转移

与传统关系数据库相比优点:

1.多版本数据:可以查询存储变动的历史数据
2.数据灵活度:mysql有多少列是固定的,增加null的列会浪费存储空间,hbase为null的column不会被存储,节省空间提 高性能
3.超大数据量
4.自动分区:数据自动切分数据,使得数据存储自动具有水平可扩展性
5.良好扩容

与传统关系数据库相比缺点:

1.不能灵活根据条件查询
2.没有强大关系,事务等

1.2 HBase 数据模型

专业术语解释
Table有多行组成的hbase表
RawHBase中的行里面包含一个key和一个或者多个包含值的列。行按照行的key字母顺序存储在表格中。因为 这个原因,行的key的设计就显得非常重要。数据的存储目标是相近的数据存储到一起。
ColumnHBase中的列包含用:分隔开的列族和列的限定符。
Column Family因为性能的原因,列族物理上包含一组列和它们的值。每一个列族拥有一系列的存储属性,例如值是否缓存在内存中,数据是否要压缩或者他的行key是否要加密等等。表格中的每一行拥有相同的列族,尽管一个给定的行可能没有存储任何数据在一个给定的列族中
Column Qualifier列的限定符是列族中数据的索引。例如给定了一个列族content,那么限定符可能是content:html,也可以是content:pdf。列族在创建表格时是确定的了,但是列的限定符是动态地并且行与行之间的差别也可能是非常大的。
Cell单元是由行、列族、列限定符、值和代表值版本的时间戳组成的。
Timestamp时间戳是写在值旁边的一个用于区分值的版本的数据。默认情况下,时间戳表示的是当数据写入时RegionSever的时间点,但你也可以在写入数据时指定一个不同的时间戳
结果排序针对查询结果排序:Row->ColumnFamily->Column qualifier-> timestamp(时间倒序,时间最新最先返回)

1.3 HBase整体架构

在这里插入图片描述

1.4 HBase 读写流程

1.4.1 客户端读取流程

  1. 客户端首先根据配置信息连接zookeeper集群,读取zookeeper节点上的meta表的位置信息
  2. client向meta表的region所在的regionserver发起访问,读取meta表的数据,获取hbase集群 上所有表的元数据(当meta信息变化,客户端根据缓存meta信息请求发生异常,会重新加载一份 新的元数据到本地)
  3. 根据meta表元数据(查询region数,region分布以及region的startkey,stopkey),找到要查 询rowkey数据所在的region分布
  4. client向regionserver发起读请求访问
  5. regionserver接到读请求访问,会先扫描memstore写缓存数据,再扫描blockcache读缓存, 若果没有找到数据再去读取storefile中的数据(优先查询本地副本文件)
  6. regionserver将查询到的结果返回给client

1.4.2 客户端写入流程

  1. put/delete操作,客户端根据meta信息找到对应的regionserver,然后提交请求。
  2. 服务器接受到请求,反序列为对应对象,执行操作检查:region是否只读,memstore大小是否
    超过blockingMemstoreSize,检查完成执行如下操作
    在这里插入图片描述

HBase - 数据写入流程解析

1.5 HBase 客户端常用的方法

1.5.1 scan查询

Scan scan= new Scan();
scan.setStartRow(Bytes.toBytes("4"));
scan.setStopRow(Bytes.toBytes("4~"));
scan.setTimeRange(1510735857892L, 1511403550619L);
scan.setCaching(1);//设置一次rpc请求批量读取的Results数量
scan.setBatch(5);//设置返回数据的最大行数
scan.setMaxVersions();//查询列的全部版本
scan.setReversed(true);//默认false,正向查找,若为true则逆向扫描
scan.setCacheBlocks(true);//默认true,查询结果可以缓存到服务器内存
scan.setSmall(false); //64kb以内小范围scan设置为true效果更好,默认false
scan.setFilter(new RowFilter(CompareOp.EQUAL,new BinaryPrefixComparator("4".getBytes())));//设置过滤器
ResultScanner resultScan=table.getScanner(scan);
  • hbase scan客户端服务端流程

1.5.2 get查询

Get get=new Get(Bytes.toBytes("1fb7fe0047771222975dfb94fdede2fc"));
get.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("20171115#5000491#100081"));
get.setMaxVersions();
get.setFilter(new ColumnPrefixFilter(Bytes.toBytes("20171115")));
get.setMaxResultsPerColumnFamily(1);//设置每行每个列簇返回的最大条数
get.setTimeRange(1510735857899L,1511403550618L);
Result result=table.get(get);
// 支持Get的批量list执行
List<Get> gets=new ArrayList<Get>();
gets.add(new Get(Bytes.toBytes("1fb7fe0047771222975dfb94fdede2fc")));
gets.add(new Get(Bytes.toBytes("44e29606bcc7332abc8b4ffe3a7c70a6")));
Result[] results=table.get(gets);

1.5.3 put查询

Put put=new Put(Bytes.toBytes("4cdf47795d51dae263b2dd3bca9381b8"));
put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("20181208#5000491#100084"),System.currentTimeMillis(), Bytes.toBytes("1"));
put.setTTL(10000L);//设置result的过期时间
put.setWriteToWAL(true);//控制写入是否写hlog日志
table.put(put);

// 支持批量put
table.puts(puts)

1.5.4 delete 查询

Delete delete=new Delete(Bytes.toBytes("1fb7fe0047771222975dfb94fdede2fc"));
delete.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("20171116#5000491#100081"), 1511403550618L);
delete.addColumns(Bytes.toBytes("cf"), Bytes.toBytes("20171123#5000491#100084"), 1511403550618L);
delete.setWriteToWAL(true);
table.delete(delete);

支持批量delete
table.delete(deletes);

1.5.5 append 查询

table=HbaseClient.getInstance().getHtable("ApplyLoan_Detail");
Append append=new Append(Bytes.toBytes("1fb7fe0047771222975dfb94fdede2fc"));//value值中追加内容
append.add(Bytes.toBytes("cf"), Bytes.toBytes("20171115#5000491#100081"), Bytes.toBytes("9"));
append.setTTL(10000L);//针对当前result设置失效时间
append.setWriteToWAL(true);
table.append(append);

1.5.6 increment查询

Increment increment=new Increment(Bytes.toBytes("4cdf47795d51dae263b2dd3bca9381b5"));
increment.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("incr"), 10);
increment.setTTL(10000L);
increment.setTimeRange(1510735857892L, 1546070521593L);
increment.setWriteToWAL(true);

1.6 HBase 过滤器以及协处理器

1.6.1 过滤器

  • RowFilter,FamliyFilter,QualifierFilter,ValueFilter :行键过滤器,列簇过滤器,列过滤器,值过滤器
  • TimestampsFilter:时间过滤器
  • SingleColumnValueFilter:单列值过滤器,用一列的值决定这一行的数据是否被过滤,支持一些正则,比

较之类的比较器操作,可与下面四个比较器一起使用:

  • RegexStringComparator:支持正则表达式的值比较

  • SubstringComparator : 用于监测一个子串是否存在于值中,并且不区分大小写

  • BinaryPrefixComparator : 前缀二进制比较器。与二进制比较器不同的是,只比较前缀是否相同。

  • BinaryComparator : 二进制比较器,用于按字典顺序比较 Byte 数据值

  • SingleColumnValueExcludeFilter :单列值排除器

  • PrefixFilter:前缀过滤器,针对行键,筛选出具有特定前缀的行键的数据

  • ColumnPrefixFilter:列前缀过滤器

  • PageFilter:分页过滤器,用在region上,只能保证当前region返回相应的数量,也可以理解为每次数据量=region数量
    *pageNum

  • KeyOnlyFilter:这个过滤器唯一的功能就是只返回每行的行键,值全部为空,这对于只关注于行键的应用场景来说非常合
    适,这样忽略掉其值就可以减少传递到客户端的数据量,能起到一定的优化作用

  • FilterList:多个filter过滤器可以通过进行控制,FilterList.Operator.MUST_PASS_ALL 或者

  • FilterList.Operator.MUST_PASS_ONE控制满足条件

具体处理器详见官网:https://hbase.apache.org/1.2/book.html#thrift.filter_language

1.6.2 协处理器

  • 协处理器

HBase作为列式数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执行求和、计数、排序等操作。
协处理器是HBase让用户的部分逻辑在数据存放端即HBase服务端进行计算的机制,它允许用户在HBase服务端运行自己
的代码。通过协处理器可以比较容易的实现能够轻易建立二次索引、复杂过滤器以及访问控制等。

协处理器分成两种类型:一个是观察者(Observer),类似于关系数据库的触发器。另一个是终端(Endpoint),动态的
终端有点像存储过程。

  • observer

    • 实现自定义observer,根据要监听事件的不同,实现以下不同的observer。
    • RegionObserver:观察客户端更新数据操作:Get、Put、Delete等。一般通过继承BaseRegionObserver实现。
    • RegionServerObserver:监听regionserver的启动、停止、region合并、split。一般通过继承
    • BaseMasterAndRegionObserver实现。
    • MasterOvserver:监听表创建、修改、分配region操作。一般通过继承BaseMasterAndRegionObserver实现。
    • WalObserver: 监听WAL日志的写入。一般通过继承BaseWALObserver实现。
  • Endpoint

Endpoint是动态RPC插件的接口,它的实现代码被安装在服务器端,从而能够通过HBase RPC唤醒。客户端类库提供
了非常方便的方法来调用这些动态接口,它们可以在任意时候调用一个终端。一般可用于计数、求和等聚合方法。

  • 自定义Endpoint
    1.编写接口定义proto文件
    2.编译proto文件,生成java代码
    3.继承CoprocessorService 、自定义service,实现自定义逻辑
  • 官方文档:https://hbase.apache.org/1.2/book.html#_coprocessor_overview
  • 中文样例:https://www.cnblogs.com/frankdeng/p/9310340.html
  • 使用示例:http://blog.csdn.net/carl810224/article/details/52224441

1.7 表设计原则

表模式经验原则:

  • region 大小在10-50G之间

  • cell 不大于10MB,如果是mob不让大小超过50MB,否则就考虑将单元数据放到hdfs,将数据的存储指针存到hbase中

  • 每个表的列簇最好在1-3之间,尽可能保持1个最好(原因:数据不均,major造成不必要的io,scan数据量较小的 columnFamily效率会低)

  • 对于一个有1个或2个列族的表来说,region数在50到100左右是一个很好的数字。记住一个region是一个列族的一个连 续分段

  • 列簇尽可能短(每个value都会存储对应的列簇)

  • 如果仅有1个列族忙着写,则只有那个列族在占用越来越多的内存。在分配资源时要注意写模式

  • 保证对写和查询不引起热点数据问题,对rowkey进行hash

  • 尽量减少rowkey和column的大小,rowkey最大长度64kb

  • 倒序时间戳:数据处理找最近时间版本,可设计key如下:key+(Long.MAX_VALUE-timestamp)

  • 预分区:建表提前创建预分区,避免自动split,提升性能

  • 版本:对列簇可单独设置版本,默认1个版本,不建议最大版本设置很大(成百或者更多),除非历史数据特别重要 最小版本数缺省值是0,表示该特性禁用

  • TTL:针对无用版本进行删除操作,作用在列簇上,客户端也可以设置单元格TTL,但是一个单元TTLs不能延长一个单元 的有效生命周期到超出了一个列的级别TTL设置。禁用:设置hbase.store.delete.expired.storefile为false可以禁用这个功
    能,设置最小版本数为0以外的值也可以禁用此功能

  • 压缩算法:对于对查询速度要求比较高的,可使用snappy。对应离线数据,追求高压缩率的可使用lzo。

  • bloomfilter:用于提高随机读(Get)的性能,对于顺序读(Scan)而言,bloomfilter没有什么作用.bloomfilter主要用
    于过滤要查询storefile文件。

  • blocksize:请求以Get请求为主,可以考虑将块大小设置较小;如果以Scan请求为主,可以将块大小调大;

  • 每个regionserver上面最好20-200个5-20Gb的region,100个region效果最好

  • 英文版:https://hbase.apache.org/1.2/book.html#table_schema_rules_of_thumb
  • 中文对应:https://www.cnblogs.com/sunspeedzy/p/7501825.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1001163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SB树,看这一篇就够了

算法拾遗三十九SB树及跳表 SB树SB树四种违规类型总结 SB树Code 跳表 SB树 SB树是基于搜索二叉树来的&#xff0c;也有左旋和右旋的操作&#xff0c;只是不同于AVL树&#xff0c;它也有它自己的一套平衡性方法。 任何以叔叔节点为头的子树的节点个数不小于自己任何一个侄子树的…

【PAT】攀拓(PAT)- 程序设计(甲级)2023年夏季考试自测

个人学习记录&#xff0c;代码难免不尽人意。 今天又斥资巨款买了PAT甲级2023年夏季的考试真题做了做&#xff0c;得分 95&#xff0c;还买了时光机&#xff0c;在当时排名42名。总的来说还是比较满意的&#xff01;有些地方当时做的时候卡住了但是后面回过头来重新想的时候还是…

小程序环境搭建

第一种&#xff1a;微信开发者工具 1. 微信公众平台注册小程序 注册类型选择‘个人’即可&#xff0c;‘企业’需要公司相关信息&#xff08;企业信用代码、法人信息等&#xff09; 注册成功后&#xff0c;在‘开发’-‘开发管理’-‘开发设置’中找到AppID 并纪录。 2. …

关于前端就业前景的一点看法

一、前言 最近&#xff0c;很多人在知乎上鼓吹前端未来会没掉的概念。在此我想说这个说法并不真实&#xff0c;而是一种极端的观点。 事实上&#xff0c;前端开发在当今的互联网行业中扮演着至关重要的角色&#xff0c;它是构建 Web 应用程序所必需的一部分&#xff0c;能够实现…

高速电路设计-----第二章

本章主要讲解的是电阻、电容、电感的选型。 一、电阻&#xff1a;关键还是限流。 1、通常在电源滤波时除了LC外&#xff0c;还会串接一个R。目的是为了降低信号的Q值&#xff0c;防止信号失真。常用于失真电源滤波。 2、选型的电阻的封装太小&#xff0c;电路的电流超过电阻能…

让你不再惧怕内存优化

原文链接 让你不再惧怕内存优化 之前曾经写过一篇关于如何做性能优化的文章&#xff0c;现在针对内存这一专项再做精细化的讨论。对于安卓应用开发来说&#xff0c;内存究竟会遇到什么样的问题&#xff0c;有什么方法可以用来测试和分析&#xff0c;以及有什么样的策略可以去实…

【LeetCode-中等题】904. 水果成篮

文章目录 题目方法一&#xff1a;滑动窗口方法二&#xff1a; 题目 题目的意思就是&#xff1a;找至多包含两种元素的最长子串&#xff0c;返回其长度 方法一&#xff1a;滑动窗口 class Solution { // 滑动窗口 找至多包含两种元素的最长子串&#xff0c;返回其长度public …

红队打靶:ConnectTheDots打靶思路详解(vulnhub)

目录 写在开头 第一步&#xff1a;主机发现和端口扫描 第二步&#xff1a;FTP和NFS渗透&#xff08;失败&#xff09; 第三步&#xff1a;web渗透 第四步&#xff1a;jsfuck解码 第五步&#xff1a;再次FTP渗透与莫尔斯电码解码 第六步&#xff1a;vim读取断电swp文件…

数据科学家必备的20个Python库

公众号&#xff1a;尤而小屋作者&#xff1a;Peter编辑&#xff1a;Peter 大家好&#xff0c;我是Peter~ 小屋里面一直在输出关于数据科学领域的文章&#xff0c;绝大部分都是基于Python&#xff0c;少量的MySQL&#xff08;MySQL存储数据用&#xff09;。本文重点给大家介绍P…

保姆级教程 --redis启动命令

1、在redis目录 打开命令 windowr 输入cmd 2、输入 redis-server.exe redis.windows.conf 启动redis命令&#xff0c;看是否成功 3、可能会启动失败&#xff0c;报28 Nov 09:30:50.919 # Creating Server TCP listening socket 127.0.0.1:6379: bind: No error 4、报错后&am…

获取该虚拟机的所有权失败,主机上的某个应用程序正在使用该虚拟机

点击“openstack-controller”虚机 打开出现如下错误&#xff0c;点击“获取所有权” 点击“取消” 这时候不要删除虚拟机&#xff0c;这种错误一般是由于虚拟机没有正常关闭引起的。 找到openstack-controller的虚拟磁盘文件及配置文件存放的位置&#xff0c;删除openstack-…

【系统设计系列】缓存

系统设计系列初衷 System Design Primer&#xff1a; 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版&#xff1a; https://github.com/donnemart…

电子信息工程专业课复习知识点总结:(三)数电

绪论 第一章 数字逻辑概论 1.数字集成电路相比模拟电路的优点&#xff1f; ①稳定i性高&#xff0c;抗干扰能力强 ②数字电路只用0和1进行逻辑运算&#xff0c;所以比较容易设计电路。 ③便于集成&#xff0c;体积小、成本低 ④可编程性强&#xff0c;可以使用加密技术提高保…

SQL6 查找学校是北大的学生信息

描述 题目&#xff1a;现在运营想要筛选出所有北京大学的学生进行用户调研&#xff0c;请你从用户信息表中取出满足条件的数据&#xff0c;结果返回设备id和学校。 示例&#xff1a;user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male…

Spring Boot将声明日志步骤抽离出来做一个复用类

上文Spring Boot日志基础使用 设置日志级别中我们写了个比较基本的日志操作 但也随之产生了一个问题 我们这行代码 能不能不写&#xff1f; 具体说 我们不希望每个需要日志的类都声明一个在这 看着太不美观了 我们最简单方法当然是继承 我们找个目录创建一个类 叫 BaseClass…

星际争霸之小霸王之小蜜蜂(十二)--猫有九条命

系列文章目录 星际争霸之小霸王之小蜜蜂&#xff08;十一&#xff09;--杀杀杀 星际争霸之小霸王之小蜜蜂&#xff08;十&#xff09;--鼠道 星际争霸之小霸王之小蜜蜂&#xff08;九&#xff09;--狂鼠之灾 星际争霸之小霸王之小蜜蜂&#xff08;八&#xff09;--蓝皮鼠和大…

力扣刷题61-旋转链表

题目来源&#xff1a; 力扣61-旋转链表 题目描述&#xff1a; 思路&#xff1a;双指针 因为它倒得永远是倒数k个 class Solution {public ListNode rotateRight(ListNode head, int k) {ListNode slowhead,fasthead,lenhead;int l0;//1 求长度while(len!null){l;lenlen.next…

【JAVA-Day05】深入理解Java数据类型和取值范围

深入理解Java数据类型和取值范围 深入理解Java数据类型和取值范围摘要一、Java的数据类型1.1 存储单位1.2 Java基本数据类型 二、Java的取值范围2.1 变量定义2.2 取值范围验证 三、总结 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb;…

孙哥Spring源码第21集

第21集 refresh-invokeBeanFactoryPostProcessor-下半部分BeanFactoryPostPrcessor处理 【视频来源于&#xff1a;B站up主孙帅suns Spring源码视频】【微信号&#xff1a;suns45】 1、注解处理添加的的BeanDefinitionRegistryFactoryProcessor在哪个地方&#xff1f; 在第一…

【Flutter】引入网络图片时,提示:Failed host lookup: ‘[图片host]‘

在使用 NetworkImage 组件加载外部图片时&#xff0c;提示 Failed host lookup: [图片host] 错误。 排查方向 1、清理缓存 解决方案&#xff1a; 尝试flutter clean清空缓存后重新安装依赖flutter pub get重新构建项目flutter create . 走完上述三个步骤后&#xff0c;再次…