HBase总结

2023-10-27

一、HBase简介

  HBase是面向列的分布式存储系统(NoSQL数据库),是对Google论文BigTable的实现,具有数据存储量大、高性能、高扩展等特点。(BigTable是对HBase最形象的解释,大宽表,支持百万级列、亿万级数据,动态列)

二、系统原理

2.1 数据模型

  HBase数据模型可以分为逻辑结构和物理结构。逻辑结构上,HBase的表由多行记录组成,每行由多个列簇组成,每个列簇由多个列组成;物理结构上,每张表按照RowKey被水平拆分成多个Region,每个Region按照Column Family被垂直拆分成多个Store(面向列存储的原因),每个单元格的数据由多个版本,按照KV存储,如下图所示:

  • RowKey:唯一表示一行记录;
  • Column Qualifier:创建表时只需要指定RowKey和Column Family,列是动态的,按需指定
  • Cell:<RowKey, Column Family, Column Qualifier>唯一确定的单元,每个单元格有多个版本,并且可以设置过期时间TTL;
  • TimeStamp:用于标识数据的不同版本,每条数据写入时可以指定数据版本,如果不指定默认使用系统当前时间;
  • Region:每个Region由多个Store组成,每个Store对应一个列簇;

在这里插入图片描述

2.2 系统架构

  HBase的架构为主从架构,HMaster为管理节点,负责元信息和集群管理;HRegionServer为数据节点,负责数据的管理,数据最终存储在HDFS上,如下图所示:
在这里插入图片描述
HMaster职责:

  1. HRegionServer节点管理(监控、Region分配和负载均衡等);
  2. 表元信息管理(DML相关),实际数据仍存储在HRegionServer;

HRegionServer职责:

  1. Region管理(拆分、压缩);
  2. 客户端数据读写请求处理(DDL相关);

Zookeeper职责:

  1. HMaster高可用(集群选主);
  2. 集群监控:HRegionServer的监控,上下线信息通报给HMaster;
  3. 元信息管理:Region路由信息、表元信息,以及集群配置信息等;

2.3 数据读写流程

1. Region寻址

  1. Client首先请求ZK,获取HBase的Meta表所在的HRegionServer;
  2. Client连接HRegionServer,获取Meta表信息,确定RowKey所属的Region,以及Region所在的HRegionServer;

2. 写流程

  1. 通过Region寻址,Client连接至对应的HRegionServer;
  2. 先将写命令写入HLog日志,然后将更新写入MemStore内存,写入成功后返回ACK到Client;
  3. 如果MemStore的大小超过设定阈值,刷盘到StoreFile;

在这里插入图片描述

3. 读流程

  1. 通过Region寻址,Client连接至对应的HRegionServer;
  2. 先从BlockCache(HRegionServer全局缓存,LRU算法)中查找数据,如果存在则返回;
  3. 如果不存在,则从RowKey所属的Region中的MemStore和StoreFile查找;

2.4 拆分与合并

1. Region拆分

  • 拆分原因: 单个Region的数据越来越多,会导致数据读取RT升高;
  • 拆分时机: Region中某个Store的数据量(所有StoreFile之和)超过设定阈值时触发拆分;
  • 拆分过程: 一个Region被拆分成两个,如果有负载均衡的需要,某个Region会被移到其他HRegionServer;
    在这里插入图片描述

2. StoreFile合并

  • 合并原因: StoreFile过多会导致数据读取RT升高;
  • 合并方式: 合并分为Minor Compaction和Major Compaction。Minor Compaction会将临近的若干个小文件合并成一个大文件,会清理过期数据,但是不会清理已删除数据;Major Compaction将Store下所有的文件合并成一个大文件,并且会清理和已删除数据。

2.5 批量导入

  基本原理:跳过HRegionServer,直接将数据转换成HFile格式,然后存储HBase对应的路径即可,如下图所示。
  使用场景:大批量数据的快速导入,绕开HRegionServer,避免写WAL、分裂合并等过程,性能是批量接口的几倍。
在这里插入图片描述

三、LSM树

  LSM树的核心思想内存加磁盘顺序写,将写性能达到最优。具体做法是将数据存储分为内存和磁盘两部分,数据的修改只需要更改内存中的数据即可,内存中使用有序数据结构称为Memtable,当内存中的数据达到设定阈值后,再批量顺序写到磁盘文件称为SSTable,后台周期性的对SSTable进行合并和数据压缩,为了防止内存数据丢失,更新内存Memtable前需要先写入WAL日志;(所有的写都是追加写入,只有当SSTable合并时,才会对数据整理)

读性能优化

1. 使用布隆过滤器快速判断数据是否存在;
2. 利用SSTable的有序性,文件的最大最小值知道,所有的SSTable在内存中创建稀疏索引,方便判断key存在于哪个SSTable;

三大索引结构

1. 哈希表。增删改查复杂度都是O(1),但是不适合范围查找,常用于内存KV存储,典型应用有Redis、Memcache;
2. B+树。增删改查复杂度为O(lgn),支持范围查找、顺序查找,存在随机写的问题,常见于MySQL等传统型关系数据库;
3. LSM树。通过内存和磁盘顺序写,写性能最优,读性能依赖于内存命中率,常见于HBase等NoSQL数据库中;

四、其它

1. 对比

对比关系型数据库: HBase能够支持海量数据的存储,并且容易扩展,但是不支持事务,二级索引,以及复杂查询;
对比Hive: 虽然都是基于HDFS,HBase是存储系统,提供低延迟的读写,用于在线业务;Hive是分析系统,用于大数据的离线分析;

2. 应用场景

  HBase作为分布式数据库,适用于海量数据存储(至少亿级别的数据量)场景(没有事务、复杂SQL等需求)。

3. RowKey设计原则

  • 长度原则:长度越短越好,建议不超过16Byte,数量大时极大的节约内存和磁盘空间;
  • 唯一原则:唯一标识一条数据;
  • 散列原则:确保数据能够均匀的分部到各RegionServer上;

参考

  1. 入门HBase的正确姿势
  2. 表及RowKey设计指南
  3. LSM Tree
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HBase总结 的相关文章

  • mongodb count 与 find with count [重复]

    这个问题在这里已经有答案了 我正在对 mongo 版本 2 4 和 3 2 集合中的文档进行计数 馆藏非常大 有3821085篇文档 我需要统计所有文件并附上参考资料 id 我尝试了两种不同的查询 db SampleCollection f
  • DynamoDB 如何同时支持 Key-Value 和 Document 数据库属性

    根据 DynamoDB 的文档 它支持 NoSQL 的键值和面向文档的属性 即使其他 NoSQL 数据库仅属于一种类型 键值 文档 图形或面向列 它还说 Amazon DynamoDB 基于 Dynamo 的原则构建 3 是 AWS 基础设
  • 如何在 Elasticsearch 中或在 Lucene 级别进行联接

    在 Elasticsearch 中执行相当于 SQL 连接的最佳方法是什么 我有一个包含两个大表的 SQL 设置 Persons 和 Items 一个人可以拥有many项目 人员和项目行都可以更改 即更新 我必须运行根据人和物品的各个方面进
  • 嵌套文档上的 Azure DocumentDB ARRAY_CONTAINS

    似乎是ARRAY CONTAINS嵌套文档上的函数永远不会匹配任何文档 例如 尝试使用 Azure DocumentDB 进行以下简单查询查询游乐场 https www documentdb com sql demo Sandbox SEL
  • 低 TTL 和分级压缩,我是否应该减少 gc_grace_seconds 以提高读取性能而不影响删除复制?

    低 TTL 和分级压缩 我应该减少 gc grace seconds 以提高读取性能吗 设想 Cassandra 表缓存外部数据库值 读取性能需要良好 小于 100 毫秒 TTL 4 小时 行级 每 6 小时功能性全表刷新 删除然后延迟加载
  • 如何在文档数据库(NoSQL)中设计基本模式?

    我有一个问题如何验证文档中的基本 JSON 字段 我的意思是假设一个字段是否需要 我的意思是基本上字段验证 我知道文档数据库是无模式的 NOSQL 但在 Mongodb 中 有一个选项 这就是我问的原因 例如 在 Mongodb 中 我们有
  • 寻找一个轻量级的java兼容内存键值存储[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Berkeley DB 可能是最好的选择 但由于许可问题我无法使用它 还有其他选择吗 你可以试试榛卡斯
  • neo4j:单向/双向关系?

    所以我研究了 neo4j 我可能会在即将到来的项目中使用它 因为它的数据模型可能非常适合我的项目 我查看了文档 但我仍然需要这个问题的答案 我可以将关系设置为单向吗 看来 Neo4j 的人很喜欢电影 所以我们继续吧 如果我有这样的图表 Ac
  • 是否有一个 nosql 存储也允许存储实体之间的关系?

    我正在寻找 nosql 键值存储 它还提供存储 维护存储实体之间的关系 我知道 Google App Engine 的数据存储允许实体之间拥有和不拥有的关系 任何流行的 nosql 商店都提供类似的东西吗 尽管它们中的大多数都是无模式的 但
  • dynamoDB 如何存储数据?

    由于Dynamodb以键值对的形式存储数据 其中键是主键的类型 值是与其关联的数据 我想知道dynamo db是否真正理解值 json 我所说的值是指json与键关联的对象 RDBMS 中的一行 dynamo db 是否理解有一些属性以及它
  • 使用 Django 会话存储登录用户

    我正在创建一个以 REST 为中心的应用程序 它将针对大多数特定于域的模型使用某种 NoSQL 数据存储 对于我打算围绕 REST 数据框架构建的主站点 我仍然希望对用户 计费信息和域数据模型范围之外的其他元数据使用传统的关系数据库 有人告
  • 如何在Cassandra中搜索不相等的二级索引?

    我需要能够仅使用 对二级索引执行搜索 据我所知 Cassandra 至少需要一个等式索引子句 因为它会迭代该等式索引的所有结果 是否有任何技巧可以仅使用 执行操作 至少在概念上 这是一个坏主意吗 另外 有人知道 Cassandra 是否有计
  • 使用 NoSQL 文档存储数据库有哪些实际用例?

    在过去的几天里 我一直在阅读文档并观看特定于 Mongo DB 的截屏视频 我不知道像这样的解决方案何时会比典型的 pg 或 mysql 环境更好 具体来说 我的问题是在什么情况下 有用例就很好 你会选择 nosql 路线 Thanks 许
  • Cassandra 集群 - 特定节点 - 特定表高丢弃突变

    我在生产中的压缩策略是 LZ4 压缩 但我将其修改为 Deflate 对于压缩更改 我们必须使用 nodetool Upgradesstables 强制升级所有 sstable 上的压缩策略 但是 一旦在集群中的所有 5 个节点上完成了 U
  • redis - 使用哈希

    我正在使用 redis 为我的 Web 应用程序实现社交流和通知系统 我是 redis 的新手 我对哈希值及其效率有一些疑问 我读过这篇很棒的文章Instagram 帖子 http instagram engineering tumblr
  • 使用 Cassandra 进行单元版本控制

    我的应用程序使用 AbstractFactory 作为 DAO 层 因此一旦实现了 HBase DAO 系列 创建 Cassandra DAO 系列并从多个角度查看差异对我来说将是非常好的 不管怎样 试图做到这一点 我看到 Cassandr
  • 当我们有多对多关系时,如何在 firebase 中获取数据

    我读了这个问题Firebase 中的多对多关系 https stackoverflow com questions 41527058 many to many relationship in firebase 这里描述了如何在 fireba
  • AWS DynamoDB 写后读一致性 - 理论上它是如何工作的?

    大多数nosql解决方案仅使用最终一致性 并且考虑到DynamoDB将数据复制到三个数据中心 如何保持写后读一致性 解决此类问题的通用方法是什么 我认为这很有趣 因为即使在 MySQL 复制中 数据也是异步复制的 我将详细告诉您 Dynam
  • 如何同步nosql db(ravendb)中的更改

    我已经开始在 RavenDB 的示例上学习 NoSQL 我从一个最简单的模型开始 假设我们有由用户创建的主题 public class Topic public string Id get protected set public stri
  • 关于 Cassandra 与 MySQL 的一些建议

    几天前我在这里问了一个问题 得到了一些非常好的答案 我正在考虑做一个带有个人资料 个人简介等的facebook风格的网站 并询问我是否应该使用mysql 答案是使用Cassandra 因为好多了 我只是问这是每个人都会建议的 只是我对mys

随机推荐

  • 如何获取小程序全局里面的app.js的方法

    app js的内容 app js App 以下是小程序主体生命周期函数 生命周期函数指的是在某一时刻会自动执行的函数 在小程序启动的时候 自动执行的函数 onLaunch options console log onLaunch optio
  • Python 进程、线程、协程

    进程和线程 在爬虫开发中 进程和线程的概念非常重要的 提高爬虫的工作效率 打造分布式爬虫 都离不开进程和线程的身影 本节将从多进程 多线程 协程三个方面 帮组大家回顾 Python 语言中进程和线程的常用操作 以便在接下来的爬虫开发中灵活运
  • 弱监督目标检测与半监督目标检测

    一 监督学习分类 根据数据集的标注情况 分为 监督学习 弱监督学习 弱半监督学习和半监督学习 监督学习 数据集为带实例级标注的标签 包含坐标和类别信息 弱监督学习 数据集仅带有数据类别的标签 不包含坐标信息 弱半监督学习 数据集中包含少量实
  • Lyapunov稳定性理论

    系统稳定性一般有系统状态的稳定性和关于平衡点的稳定性两种定义形式 对线性系统而言 系统状态稳定性和平衡点稳定性是完全等价的 但是对于非线性系统而言 二者具有完全不同的含义 所谓平衡点稳定性是指系统在受到外扰动作用下 轻微偏离平衡点后 是否具
  • 爬虫浅析及实例操作

    一 什么是爬虫呢 网络爬虫 又被称为网页支柱 网络机器人 是一种按照一定的规则 自动的抓取万维网信息的程序 可以理解为模拟客户端发送网络请求 接受请求对应的响应 二 爬虫有哪些分类 根据使用场景 网络爬虫可分为 通用爬虫 General P
  • Python爬取数据分析

    一 python爬虫使用的模块 1 import requests 2 from bs4 import BeautifulSoup 3 pandas 数据分析高级接口模块 二 爬取数据在第一个请求中时 使用BeautifulSoup imp
  • ThreeJS中的相机

    在ThreeJS中一共有三个关于相机的JS文件 Camera js OrthographicCamera js PerspectiveCamera js 分别是普通的相机 正交 正投影的相机 第三人称相机 首先是普通的相机 Camera j
  • 【如何应对学习Java中遇到的框架乱七八糟的问题?】

    关于您对Java学习的困惑 如果您感觉学习过程中遇到了难题 不要担心 这是正常的学习过程 以下是一些建议来帮助您处理 继续深入学习 Java是一个非常庞大的编程语言 学习过程中可能存在一定的困难 但是请坚持下去 找到适合您的学习资源 包括书
  • Java基础-学习笔记(二)

    2015年最后一天 Java基础 学习笔记 一 中简要介绍了一下Java 从本节开始将较详细记录Java的知识点 1 JDK的目录结构 src zip 核心API所有类的源文件 include 编写JNDI等程序需要的C语言头文件 bin
  • Linux多进程:alarm函数设置定时器

    unsigned int alarm unsigned int seconds 功能 设置定时器 倒计时结束后给当前进程发送SIGALARM信号 seconds 倒计时秒数 为0则定时器无效 取消一个定时器 通过alarm 0 SIGALA
  • python 获取时间(各种格式)

    前置条件 import datetime import time 1 输出格式 年 月 日 时 分 秒 毫秒 curr time datetime datetime now 输出 2 输出格式 年 月 日 时 分 秒 curr time d
  • 嵌入式(数据库开发)

    1 数据库 1 数据库的安装 sudo dpkg i deb 本地 sudo apt get install sqlite3 2 数据库命令 1 系统命令 都以 开头 exit quit table 查看表 schema 查看表的结构 2
  • Springboot整合mybatisPlus开发

    一 MyBatis Plus简介 MyBatis Plus 简称 MP 是一个MyBatis的增强工具 在 MyBatis 的基础上只做增强不做改变 为简化开发 提高效率而生 官网文档地址 https mybatis plus guide
  • 网站搭建 (第19天) 标签功能

    一 前言 在逛开源中国社区的时候 发现每一篇博客下面都有一行文章的标签 大概就是文章中的代码类型以及使用到的模块之类的 如下图 我的开源中国社区地址是 https my oschina net zhenfei 用了一段时间后废弃了 转到了博
  • 计算机核心配件是什么,计算机的核心是什么

    计算机的核心 电脑核心是中央处理器 简称CPU 是一块超大规模的集成电路 是一台计算机的运算核心 Core 和控制核心 Control Unit 功能主要是解释计算机指令以及处理计算机软件中的数据 电脑核心是中央处理器 简称 CPU 是一块
  • Canvas拖动图形效果实现

    前言 最近对于canvas产生了一些兴趣 我天生是对这种视觉的东西感到好奇的 因此投入了一些时间来玩一玩 仿照网上的一个案例实现了一个基于canvas的图形拖动效果 我主要是借鉴了他们的思想 代码部分是自己独立实现的 也因此走了一些canv
  • 【剑指offer】数据结构——链表

    目录 数据结构 链表 直接解 剑指offer 06 从尾到头打印链表 牛客 力扣 剑指offer 24 反转链表 剑指offer 25 合并两个排序的链表 剑指offer 35 复杂链表的复制 剑指offer 52 两个链表的第一个公共结点
  • 情绪因子

    全A情绪指数 市场对大事件的情绪反应 全A情绪指数 在目前已有的情绪指数库上构建出一种能反映市场整体情绪的指标 本文展示了在其构建过程中发现的一些潜在价值以及全A情绪指数是否能对一些重要社会性事件做出反应的研究 一 构建过程 数据样本 雪球
  • 射频百科:什么是相位噪声?及其含义

    前言 在测试信号源 比如 DDS 直接式数字频率合成器 或者PLL 锁相环 时 相位噪声是一个非常关键的参数 一 相位噪声的含义 随着电子技术的发展 器件的噪声系数越来越低 放大器的动态范围也越来越大 增益也大有提高 使得电路系统的灵敏度和
  • HBase总结

    文章目录 一 HBase简介 二 系统原理 2 1 数据模型 2 2 系统架构 2 3 数据读写流程 1 Region寻址 2 写流程 3 读流程 2 4 拆分与合并 1 Region拆分 2 StoreFile合并 2 5 批量导入 三