一、Hbase介绍、数据模型、体系结构_hbase数据结构_Shyllin的博客-程序员秘密

技术标签: 大数据  hbase  HBase  

HBase介绍

HBase数据模型

逻辑视图来看,HBase中的数据是以表形式进行组织的,和关系型数据库中的表一样,HBase中的表也由行和列构成。

物理视图来看,HBase是一个Map,由键值(Key Value)构成;“sparse,distributed,persistent multidimensional sorted map”(稀疏的、分布式的、持久性的、多维的以及排序的MAP)

逻辑视图

  • table:表,一个表包含多行数据。

  • row:行,一行数据包含一个唯一标识rowkey、多个column以及对应的值。在HBase中,一张表中所有row都按照rowkey的字典序由小到大排序。

  • column:列,与关系型数据库中的列不同,HBase中的column由column family(列簇)以及qualifier(列名)两部分组成,两者中间使用":"相连。column family在表创建的时候需要指定,用户不能随意增减。一个column family下可以设置任意多个qualifier,因此可以理解为HBase中的列可以动态增加,理论上甚至可以扩展到上百万列。

  • timestamp:时间戳,每个cell在写入HBase的时候都会默认分配一个时间戳作为该cell的版本,用户也可以在写入的时候自带时间戳。HBase支持多版本特性,即同一rowkey、column下可以有多个value存在,这些value使用timestamp作为版本号,版本越大,表示数据越新。

  • cell:单元格,由(rowkey、column family、qualifier、type、timestamp,value)组成的结构,其中type表示Put/Delete操作类型,timestamp代表这个cell的版本。KV结构存储,其中rowkey、column family、qualifier、type以及timestamp是K,value字段对应KV结构的V。

    {“rowkey_1”,“Personal_info”,"Name,“put”,“t1”} -> “张三”

    {“rowkey_2”,“Personal_info”,"Mobile,“put”,“t2”} -> “181xxx”

在这里插入图片描述

多维:HBase的key是一个复合数据结构,由多维元素构成,包括rowkey、column family、qualifier、type以及timestamp。

稀疏:column列允许空值,在其他数据库中,对于空值的处理一般都会填充null,而对于HBase,空值不需要任何填充。对于成百万列的表来说,通常都会存在大量的空值,如果使用填充null的策略,会造成大量空间的浪费。

排序:构成HBase的KV在同一个文件中都是有序的,按照KV中的key进行排序:先比较rowkey,rowkey小的排在前面;如果rowkey相同,再比较column,即column family:qualifier,column小的排在前面;如果column还相同,再比较时间戳timestamp,即版本信息,timestamp大的排在前面。

分布式:分而治之

逻辑视图

HBase中的数据是按照列簇存储的,即将数据按照列簇分别存储在不同的目录中。

  • 行式存储

    行式存储:行式存储系统会将一行数据存储在一起,一行数据写完之后再接着写下一行,如MySQL;

    行式存储在获取一行数据时是很高效的,但是如果某个查询只需要读取表中指定列对应的数据,那么行式存储会先取出一行行数据,再在每一行数据中获取目标列。这种处理方式在查找过程中引入了大量无用列信息,从而导致大量内存占用。

在这里插入图片描述

  • 列式存储

    列式存储:列式存储理论上会将一列数据存储在一起,不同列的数据分别集中存储,如Kudu、Parquet on HDFS等系统(文件格式)

    列式存储对于只查找某些列数据的请求非常高效,只需要连续读出所有待查目标列,然后遍历处理即可;但是反过来,列式存储对于获取一行的请求就不那么高效了,需要多次IO读多个列数据,最终合并得到一行数据。另外,因为同一列的数据通常都具有相同的数据类型,因此列式存储具有天然的高压缩特性。

在这里插入图片描述

  • 列簇式存储

    列簇式存储介于行式存储和列式存储之间,通过不同的设计思路在行式存储和列式存储两者之间相互切换。

    一张表只设置一个列簇,这个列簇包含所有用户的列。HBase中一个列簇的数据是存储在一起的,因此这种设计模式就等同于行式存储。

    一张表设置大量列簇,每个列簇下仅有一列,很显然这种设计模式就等同于列式存储。

HBase体系结构

Master-Slave模型,系统中有一个管理集群的Master节点以及大量实际服务用户读写的RegionServer节点。HBase中所有数据最终都存储在HDFS系统中;系统中还有一个ZooKeeper节点,协助Master对集群进行管理。

在这里插入图片描述

  • HBase客户端

    HBase客户端(Client)提供了Shell命令行接口、原生Java API编程接口、Thrift/REST API编程接口以及MapReduce编程接口。HBase客户端支持所有常见的DML操作以及DDL操作,即数据的增删改查和表的日常维护等。其中Thrift/REST API主要用于支持非Java的上层业务需求,MapReduce接口主要用于批量数据导入以及批量数据读取。

  • ZooKeeper在Hbase的作用

    • 实现Master高可用:通常情况下系统中只有一个Master工作,一旦Active Master由于异常宕机,ZooKeeper会检测到该宕机事件,并通过一定机制选举出新的Master,保证系统正常运转。

    • 管理系统核心元数据:比如,管理当前系统中正常工作的RegionServer集合,保存系统元数据表hbase:meta所在的RegionServer地址等。

    • 参与RegionServer宕机恢复:ZooKeeper通过心跳可以感知到RegionServer是否宕机,并在宕机后通知Master进行宕机处理。

    • 实现分布式表锁:HBase中对一张表进行各种管理操作(比如alter操作)需要先加表锁,防止其他用户对同一张表进行管理操作,造成表状态不一致。HBase中的表通常都是分布式存储,ZooKeeper可以通过特定机制实现分布式表锁。

  • Master

    Master主要负责HBase系统的各种管理工作:

    • 处理用户请求,包括建表、修改表、权限操作、切分表、合并数据分片以及Compaction等。

    • 管理集群中所有RegionServer,包括RegionServer中Region的负载均衡、RegionServer的宕机恢复以及Region的迁移等。

    • 清理过期日志以及文件,Master会每隔一段时间检查HDFS中HLog是否过期、HFile是否已经被删除,并在过期之后将其删除。

  • RegionServer
    RegionServer主要用来响应用户请求,由WAL(HLog)、BlockCache以及多个Region构成。

    • WAL(HLog):HLog在HBase中有两个核心作用

      1. 用于实现数据的高可靠性,HBase数据随机写入时,先写入缓存,再异步刷新落盘。为了防止缓存数据丢失,数据写入缓存之前需要首先顺序写入HLog,即使缓存数据丢失,可以通过HLog日志恢复;

      2. 用于实现HBase集群间主从复制,通过回放主集群推送过来的HLog日志实现主从复制。

    • BlockCache:HBase系统中的读缓存。客户端从磁盘读取数据之后通常会将数据缓存到系统内存中,后续访问同一行数据可以直接从内存中获取而不需要访问磁盘。对于带有大量热点读的业务请求来说,缓存机制会带来极大的性能提升。

    • Region:数据表的一个分片,当数据表大小超过一定阈值就会“水平切分”,分裂为两个Region。通常一张表的Region会分布在整个集群的多台RegionServer上,一个RegionServer上会管理多个Region。

      一个Region由一个或者多个Store构成,Store的个数取决于表中列簇(column family)的个数。

      每个Store由一个MemStore和一个或多个HFile组成。MemStore称为写缓存,用户写入数据时首先会写到MemStore,当MemStore写满之后(缓存数据超过阈值,默认128M)系统会异步地将数据flush成一个HFile文件。随着数据不断写入,HFile文件会越来越多,当HFile文件数超过一定阈值之后系统将会执行Compact操作,将这些小文件通过一定策略合并成一个或多个大文件。

  • HDFS

    HBase底层依赖HDFS组件存储实际数据,包括HFile、HLog日志文件等最终都会写入HDFS落盘。

HBase系统特性

HBase的优点

  • 容量巨大:HBase的单表可以支持千亿行、百万列的数据规模,数据容量可以达到TB甚至PB级别。
  • 良好的可扩展性:增加RegionServer节点实现计算层的扩展,增加DataNode实现存储扩展。
  • 稀疏性:HBase支持大量稀疏存储,即允许大量列值为空,并不占用任何存储空间。
  • 高性能:HBase目前主要擅长于OLTP场景,数据写操作性能强劲,对于随机单点读以及小范围的扫描读,其性能也能够得到保证。对于大范围的扫描读可以使用MapReduce提供的API,以便实现更高效的并行扫描。
  • 多版本:HBase支持多版本特性,即一个KV可以同时保留多个版本。
  • 支持过期:HBase支持TTL( Time To Live)过期特性,用户只需要设置过期时间,超过TTL的数据就会被自动清理,不需要用户写程序手动删除。

HBase的缺点

  • HBase本身不支持很复杂的聚合运算(如Join、GroupBy等)。如果业务中需要使用聚合运算,可以在HBase之上架设Phoenix组件或者Spark组件,前者主要应用于小规模聚合的OLTP场景,后者应用于大规模聚合的OLAP场景。
  • HBase本身并没有实现二级索引功能,所以不支持二级索引查找。可以使用Phoenix提供的二级索引功能。
  • HBase原生不支持全局跨行事务,只支持单行事务模型。可以使用Phoenix提供的全局事务模型组件来弥补HBase的这个缺陷。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Shyllin/article/details/124386524

智能推荐

BGU Deep Reinforcement Learning final examination review_爱安敝之的博客-程序员秘密

2022 Bengurion university Deep Reinforcement learning course conclusion.

Spectrum Sharing in Vehicular Networks Based on Multi-Agent Reinforcement Learning--笔记_x_fengmo的博客-程序员秘密

实现高级驾驶服务的需求增加,需要车与车之间传递安全消息,传递信息需要占用频谱资源,频谱资源是有限的,并不是所有波长的信号都可以用来进行信号传输。频谱共享使车与车通信(V2V,vehicle-to-vehicle)共享原来的车与基础设施通信(V2I,vehicle-to-infrastructure)的频谱资源进行通信。从而达到合理的进行资源利用

bzoj2084【POI2010】Antisymmetry manacher_LZJ209的博客-程序员秘密

这是一道马拉车的变异版,我们只需要在统计回文串的时候将判断条件改为右侧加左侧等于1即可,我们还要注意不可以以数字为中心扩张,因为可能会出现左侧是对称而右侧不是的情况。#include<cstdio>#include<cstdlib>#include<iostream>#include<iomanip>#include<cstring>#include<string>#include<ct

一次线上紧急事故的处理复盘_承香墨影的博客-程序员秘密

版权声明:本公众号发布的所有文章,未特殊署名,均属于原创,版权归本公众号所有。转载请参阅公众号的:《转载授权》。一、前言之前有个周末,公司的 App 产品,导致线上的所有版本,都无法从服...

php pdo基础增删改查 postgresql的主键自增设置 time()_安達と島村的博客-程序员秘密

参考https//www.javadrive.jp/postgresql/table/index10.html和https//stackoverflow.com/questions/48446399/sql-auto-increment-pgadmin-4。identity设置成always后无法在insert时设置主键,bydefault可以。

详细解说STL string_工程师123123123的博客-程序员秘密

发布时间:2008-04-03 11:16:18  来源:Blog.ChinaUnix.net  转自:http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailString博主说:这篇文章让人获益颇多。值得所有只接触了c/c++而拒绝使用其他语言的程序员仔细思考。详细解说STL string0

随便推点

疯狂Java学习笔记(68)-----------synchronized_Bruce小鬼的博客-程序员秘密

疯狂Java学习笔记(68)-----------synchronizedJava并发编程:synchronized  Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。     一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前...

python实现斐波那契数列_python斐波那契数列代码_JQW_FY的博客-程序员秘密

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13,特别指出:第0项是0,第1项是第一个1。从第三项开始,每一项都等于前两项之和。Python 实现斐波那契数列代码如下:实现一:  1 def fibonacci(): 2 num = input(&quot;Please input your number\n&quot;) 3 i,a,b= 0,0,...

k8s 查看pod流量_K8s中对pod进行流量限制_weixin_39669701的博客-程序员秘密

最近接到一个需求,对日志上传的pod进行流量限制。# 前期准备k8s一份calico装好# k8s配置由于默认情况下calico并没有启用流量限制的功能,所以需要在calico的配置文件里面启用一下。在每个节点的/etc/cni/net.d/10-calico.conflist 文件中加入bandwidth的支持。这一步最好在安装calico的时候做了,就不用每个节点都配置一遍。期待calico把...

Kibana的安装(mac版)_kibana mac 下载_激流勇进_的博客-程序员秘密

Elastic的官网: http://www.elastic.co/cnKibana的版本要和Elasticsearch的版本一致。不然启动很有可能会报错。右键打开。然后: localhost:5601出现以上界面说明打开成功。

好程序员Java培训分享Java集合的两种排序方法_好程序员IT的博客-程序员秘密

好程序员Java培训分享Java集合的两种排序方法,Java集合的工具类Collections中提供了两种排序的方法,分别是:1.Collections.sort(List list)2.Collections.sort(List list,Comparator c)第一种称为自然排序,参与排序的对象需实现comparable接口,重写其compareTo()方法,方法体中实现对象的比较大小规则,示例如下:实体类:(基本属性,getter/setter方法,有参无参构造方法,toString方法)

RL(Chapter 2): Multi-arm Bandits (多臂读博机)_连理o的博客-程序员秘密

本文为强化学习笔记,主要参考以下内容:David Silver 强化学习课程 以及 知乎上一个很棒的课程总结Reinforcement Learning: An Introduction代码全部来自 GitHub习题答案参考 Github目录An nnn-Armed Bandit ProblemExplore &amp; ExploitAction-Value Methods 动作-价值方法Sample-average method 采样平均方法Greedy Method 贪心方法ε\vare