第一百零八期:比较容易理解的Hbase架构全解,10分钟学会,建议收藏

依然是Hadoop组件的讲解,今天说到HBase 架构,都是一字一句打出来的,希望各位转发加关注,会一直给大家写优质的内容。

作者:IT技术管理那些事儿

依然是Hadoop组件的讲解,今天说到HBase 架构,都是一字一句打出来的,希望各位转发加关注,会一直给大家写优质的内容。

物理上,Hbase 是由三种类型的 server 组成的的主从式(master-slave)架构:

  • Region Server,负责处理数据的读写请求,客户端请求数据时直接和 Region Server 交互。
  • HBase Master,负责 Region 的分配,DDL(创建,删除 table)等操作。
  • Zookeeper,作为 HDFS 的一部分,负责维护集群状态。

当然底层的存储都是基于 Hadoop HDFS 的:

  • Hadoop DataNode 负责存储 Region Server 所管理的数据。所有的 HBase 数据都存储在 HDFS 文件中。Region Server 和 HDFS DataNode 往往是分布在一起的,这样 Region Server 就能够实现数据本地化(data locality,即将数据放在离需要者尽可能近的地方)。HBase 的数据在写的时候是本地的,但是当 region 被迁移的时候,数据就可能不再满足本地性了,直到完成 compaction,才能又恢复到本地。

Hadoop NameNode 维护了所有 HDFS 物理 data block 的元信息。

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

Regions

HBase 表(Table)根据 rowkey 的范围被水平拆分成若干个 region。每个 region 都包含了这个region 的 start key 和 end key 之间的所有行(row)。Regions 被分配给集群中的某些节点来管理,即 Region Server,由它们来负责处理数据的读写请求。每个 Region Server 大约可以管理 1000 个 regions。

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

HBase Master

也叫 HMaster,负责 Region 的分配,DDL(创建,删除表)等操作:

统筹协调所有 region server:

  • 启动时分配 regions,在故障恢复和负载均衡时重分配 regions
  • 监控集群中所有 Region Server 实例(从 Zookeeper 获取通知信息)

管理员功能:

  • 提供创建,删除和更新 HBase Table 的接口 

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

Zookeeper

HBase 使用 Zookeeper 做分布式管理服务,来维护集群中所有服务的状态。Zookeeper 维护了哪些 servers 是健康可用的,并且在 server 故障时做出通知。Zookeeper 使用一致性协议来保证分布式状态的一致性。注意这需要三台或者五台机器来做一致性协议。

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

这些组件是如何一起工作的

Zookeeper 用来协调分布式系统中集群状态信息的共享。Region Servers 和 在线 HMaster(active HMaster)和 Zookeeper 保持会话(session)。Zookeeper 通过心跳检测来维护所有临时节点(ephemeral nodes)。

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

每个 Region Server 都会创建一个 ephemeral 节点。HMaster 会监控这些节点来发现可用的 Region Servers,同样它也会监控这些节点是否出现故障。

HMaster 们会竞争创建 ephemeral 节点,而 Zookeeper 决定谁是第一个作为在线 HMaster,保证线上只有一个 HMaster。在线 HMaster(active HMaster) 会给 Zookeeper 发送心跳,不在线的待机 HMaster (inactive HMaster) 会监听 active HMaster 可能出现的故障并随时准备上位。

如果有一个 Region Server 或者 HMaster 出现故障或各种原因导致发送心跳失败,它们与 Zookeeper 的 session 就会过期,这个 ephemeral 节点就会被删除下线,监听者们就会收到这个消息。Active HMaster 监听的是 region servers 下线的消息,然后会恢复故障的 region server 以及它所负责的 region 数据。而 Inactive HMaster 关心的则是 active HMaster 下线的消息,然后竞争上线变成 active HMaster。

点评:这一段非常重要,涉及到分布式系统设计中的一些核心概念,包括集群状态、一致性等。可以看到 Zookeeper 是沟通一切的桥梁,所有的参与者都和 Zookeeper 保持心跳会话,并从 Zookeeper 获取它们需要的集群状态信息,来管理其它节点,转换角色,这也是分布式系统设计中很重要的思想,由专门的服务来维护分布式集群状态信息。

第一次读和写操作

有一个特殊的 HBase Catalog 表叫 Meta table(它其实是一张特殊的 HBase 表),包含了集群中所有 regions 的位置信息。Zookeeper 保存了这个 Meta table 的位置。

当 HBase 第一次读或者写操作到来时:

  • 客户端从 Zookeeper 那里获取是哪一台 Region Server 负责管理 Meta table。
  • 客户端会查询那台管理 Meta table 的 Region Server,进而获知是哪一台 Region Server 负责管理本次数据请求所需要的 rowkey。客户端会缓存这个信息,以及 Meta table 的位置信息本身。
  • 然后客户端回去访问那台 Region Server,获取数据。

对于以后的的读请求,客户端可以从缓存中直接获取 Meta table 的位置信息(在哪一台 Region Server 上),以及之前访问过的 rowkey 的位置信息(哪一台 Region Server 上),除非因为 Region 被迁移了导致缓存失效。这时客户端会重复上面的步骤,重新获取相关位置信息并更新缓存。

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

点评:客户端读写数据,实际上分了两步:第一步是定位,从 Meta table 获取 rowkey 属于哪个 Region Server 管理;第二步再去相应的 Region Server 读写数据。这里涉及到了两个 Region Server,要理解它们各自的角色功能。关于 Meta table 下面会详细介绍。

HBase Meta Table

Meta table 是一个特殊的 HBase table,它保存了系统中所有的 region 列表。这张 table 类似一个 b-tree,结构大致如下:

  • Key:table, region start key, region id
  • Value:region server 

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

Region Server 组成

Region Server 运行在 HDFS DataNode 上,由以下组件组成:

  • WAL:Write Ahead Log 是分布式文件系统上的一个文件,用于存储新的还未被持久化存储的数据,它被用来做故障恢复。
  • BlockCache:这是读缓存,在内存中存储了最常访问的数据,是 LRU(Least Recently Used)缓存。
  • MemStore:这是写缓存,在内存中存储了新的还未被持久化到硬盘的数据。当被写入硬盘时,数据会首先被排序。注意每个 Region 的每个 Column Family 都会有一个 MemStore。

HFile 在硬盘上(HDFS)存储 HBase 数据,以有序 KeyValue 的形式。

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

点评:这一段是重中之重,理解 Region Server 的组成对理解 HBase 的架构至关重要,要充分认识 Region Server 的功能,以及每个组件的作用,这些组件的行为和功能在后续的段落中都会一一展开。

HBase 写数据步骤

当客户端发起一个写数据请求(Put 操作),第一步首先是将数据写入到 WAL 中:

  • 新数据会被追加到 WAL 文件尾部。
  • WAL 用来在故障恢复时恢复还未被持久化的数据。 

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

数据被写入 WAL 后,会被加入到 MemStore 即写缓存。然后服务端就可以向客户端返回 ack 表示写数据完成。

点评:注意数据写入时 WAL 和 MemStore 更新的顺序,不能调换,必须先 WAL 再 MemStore。如果反过来,先更新完 MemStore,此时 Region Server 发生 crash,内存中的更新就丢失了,而此时数据还未被持久化到 WAL,就无法恢复了。理论上 WAL 就是 MemStore 中数据的一个镜像,应该保持一致,除非发生系统 crash。另外注意更新 WAL 是在文件尾部追加的方式,这种磁盘操作性能很高,不会太影响请求的整体响应时间。

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

HBase MemStore

MemStore 在内存中缓存 HBase 的数据更新,以有序 KeyValues 的形式,这和 HFile 中的存储形式一样。每个 Column Family 都有一个 MemStore,所有的更新都以 Column Family 为单位进行排序。

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

HBase Region Flush

MemStore 中累积了足够多的的数据后,整个有序数据集就会被写入一个新的 HFile 文件到 HDFS 上。HBase 为每个 Column Family 都创建一个 HFile,里面存储了具体的 Cell,也即 KeyValue 数据。随着时间推移,HFile 会不断产生,因为 KeyValue 会不断地从 MemStore 中被刷写到硬盘上。

注意这也是为什么 HBase 要限制 Column Family 数量的一个原因。每个 Column Family 都有一个 MemStore;如果一个 MemStore 满了,所有的 MemStore 都会被刷写到硬盘。同时它也会记录最后写入的数据的最大序列号(sequence number),这样系统就能知道目前为止哪些数据已经被持久化了。

最大序列号是一个 meta 信息,被存储在每个 HFile 中,来表示持久化进行到哪条数据了,应该从哪里继续。当 region 启动时,这些序列号会被读取,取其中最大的一个,作为基础序列号,后面的新的数据更新就会在该值的基础上递增产生新的序列号。

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

点评:这里有个序列号的概念,每次 HBase 数据更新都会绑定一个新的自增序列号。而每个 HFile 则会存储它所保存的数据的最大序列号,这个元信息非常重要,它相当于一个 commit point,告诉我们在这个序列号之前的数据已经被持久化到硬盘了。它不仅在 region 启动时会被用到,在故障恢复时,也能告诉我们应该从 WAL 的什么位置开始回放数据的历史更新记录。

HBase HFile

数据存储在 HFile 中,以 Key/Value 形式。当 MemStore 累积了足够多的数据后,整个有序数据集就会被写入一个新的 HFile 文件到 HDFS 上。整个过程是一个顺序写的操作,速度非常快,因为它不需要移动磁盘头。(注意 HDFS 不支持随机修改文件操作,但支持 append 操作。)

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

HBase HFile 文件结构

HFile 使用多层索引来查询数据而不必读取整个文件,这种多层索引类似于一个 B+ tree:

  • KeyValues 有序存储。
  • rowkey 指向 index,而 index 则指向了具体的 data block,以 64 KB 为单位。
  • 每个 block 都有它的叶索引。
  • 每个 block 的最后一个 key 都被存储在中间层索引。
  • 索引根节点指向中间层索引。

trailer 指向原信息数据块,它是在数据持久化为 HFile 时被写在 HFile 文件尾部。trailer 还包含例如布隆过滤器和时间范围等信息。布隆过滤器用来跳过那些不包含指定 rowkey 的文件,时间范围信息则是根据时间来过滤,跳过那些不在请求的时间范围之内的文件。

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

HFile 索引

刚才讨论的索引,在 HFile 被打开时会被载入内存,这样数据查询只要一次硬盘查询。

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

HBase Read 合并

我们已经发现,每行(row)的 KeyValue cells 可能位于不同的地方,这些 cell 可能被写入了 HFile,可能是最近刚更新的,还在 MemStore 中,也可能最近刚读过,缓存在 Block Cache 中。所以,当你读一行 row 时,系统怎么将对应的 cells 返回呢?一次 read 操作会将 Block Cache,MemStore 和 HFile 中的 cell 进行合并:

首先 scanner 从 Block Cache 读取 cells。最近读取的 KeyValue 都被缓存在这里,这是 一个 LRU 缓存。

然后 scanner 读取 MemStore,即写缓存,包含了最近更新的数据。

如果 scanner 没有在 BlockCache 和 MemStore 都没找到对应的 cells,则 HBase 会使用 Block Cache 中的索引和布隆过滤器来加载对应的 HFile 到内存,查找到请求的 row cells。

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

之前讨论过,每个 MemStore 可能会有多个 HFile,所以一次 read 请求可能需要多读个文件,这可能会影响性能,这被称为读放大(read amplification)。

点评:从时间轴上看,一个个的 HFile 也是有序的,本质上它们保存了每个 region 的每个 column family 的数据历史更新。所以对于同一个 rowkey 的同一个 cell,它可能也有多个版本的数据分布在不同的 HFile 中,所以可能需要读取多个 HFiles,这样性能开销会比较大,尤其是当不满足 data locality 时这种 read amplification 情况会更加严重。这也是后面会讲到的 compaction 必要的原因。

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

HBase Minor Compaction

HBase 会自动合并一些小的 HFile,重写成少量更大的 HFiles。这个过程被称为 minor compaction。它使用归并排序算法,将小文件合并成大文件,有效减少 HFile 的数量。

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

HBase Major Compaction

Major Compaction 合并重写每个 Column Family 下的所有的 HFiles,成为一个单独的大 HFile,在这个过程中,被删除的和过期的 cell 会被真正从物理上删除,这能提高读的性能。但是因为 major compaction 会重写所有的 HFile,会产生大量的硬盘 I/O 和网络开销。这被称为写放大(Write Amplification)。

Major compaction 可以被设定为自动调度。因为存在 write amplification 的问题,major compaction 一般都安排在周末和半夜。MapR 数据库对此做出了改进,并不需要做 compaction。Major compaction 还能将因为服务器 crash 或者负载均衡导致的数据迁移重新移回到离 Region Server 的地方,这样就能恢复 data locality。

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

HDFS数据备份

所有的读写都发生在 HDFS 的主 DataNode 节点上。HDFS 会自动备份 WAL 和 HFile 的文件 blocks。HBase 依赖于 HDFS 来保证数据完整安全。当数据被写入 HDFS 时,一份会写入本地节点,另外两个备份会被写入其它节点。

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

WAL 和 HFiles 都会持久化到硬盘并备份。那么 HBase 是怎么恢复 MemStore 中还未被持久化到 HFile 的数据呢?下面的章节会讨论这个问题。

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

HBase 故障恢复

当某个 Region Server 发生 crash 时,它所管理的 region 就无法被访问了,直到 crash 被检测到,然后故障恢复完成,这些 region 才能恢复访问。Zookeeper 依靠心跳检测发现节点故障,然后 HMaster 会收到 region server 故障的通知。

当 HMaster 发现某个 region server 故障,HMaster 会将这个 region server 所管理的 regions 分配给其它健康的 region servers。为了恢复故障的 region server 的 MemStore 中还未被持久化到 HFile 的数据,HMaster 会将 WAL 分割成几个文件,将它们保存在新的 region server 上。每个 region server 然后回放各自拿到的 WAL 碎片中的数据,来为它所分配到的新 region 建立 MemStore。

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

WAL 包含了一系列的修改操作,每个修改都表示一个 put 或者 delete 操作。这些修改按照时间顺序依次写入,持久化时它们被依次写入 WAL 文件的尾部。

当数据仍然在 MemStore 还未被持久化到 HFile 怎么办呢?WAL 文件会被回放。操作的方法是读取 WAL 文件,排序并添加所有的修改记录到 MemStore,最后 MemStore 会被刷写到 HFile。

这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

点评:故障恢复是 HBase 可靠性保障的一个重要特性。WAL 在这里扮演了关键角色,在分割 WAL 时,数据会根据 region 分配到对应的新的 region server 上,然后 region server 负责回放这一部分数据到 MemStore 中。

阅读目录(置顶)(长期更新计算机领域知识)

阅读目录(置顶)(长期更新计算机领域知识)

阅读目录(置顶)(长期科技领域知识)

歌谣带你看java面试题

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

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

相关文章

315. Count of Smaller Numbers After Self

文章目录1 题目理解2 暴力解法3 分治法1 题目理解 输入:int[] nums 输出:计数的数组int[] counts 规则:counts[i]表示nums中下标大于i,值小于nums[i]的个数 Example 1: Input: nums [5,2,6,1] Output: [2,1,1,0] Explanation: T…

SQL Server执行计划那些事儿(3)——书签查找

接下来的文章是记录自己曾经的盲点,同时也透漏了自己的发展历程(可能发展也算不上,只能说是瞎混)。当然,一些盲点也在工作和探究过程中慢慢有些眉目,现在也愿意发扬博客园的奉献精神,拿出来和大…

第一百零九期:双十一光棍节调试一个商城必备功能,Java Springboot开源秒杀系统

秒杀系统在电商系统中是非常重要的,不是因为秒杀这个功能重要,而是因为秒杀提现的是一个系统的并发负载能力。例如阿里巴巴或者京东,每年的双十一的峰值,其实就是下一年的常态,双十一各项技术指标,已经作为…

【名额有限】云开发AI拓展能力等你来体验!

这次来了个超厉害的新能力! 人脸智能打马赛克、人脸智能裁剪……各种操作,都能一步到位! 迫不及待想体验,戳链接:https://wj.qq.com/s2/3986990/e0ef/ 还没有搞懂,继续往下看—— 基于云开发+AI人脸检测与分…

第一百一十期:详解SpringBoot应用跨域访问解决方案

说到跨域访问,必须先解释一个名词:同源策略。所谓同源策略就是在浏览器端出于安全考量,向服务端发起请求必须满足:协议相同、Host(ip)相同、端口相同的条件,否则访问将被禁止,该访问也就被称为跨域访问。 …

spring mvc学习(23):eclipse创建Maven项目没有src/main/java并不能新建的问题

eclipse里第一次创建Maven项目时,src/main/java与src/test/java目录都不会出现,这是因为eclipse里的一个默认配置。这两个目录是真实存在的,只是隐藏了。 这时候想要让这两个目录出现,就需要修改以下配置: 右击项目-…

spring mvc学习(24):配置maven环境和创建maven项目(建议收藏,超全超详细)

1本次歌谣就对如何创建一个maven项目做一个详细的讲解,毕竟卡了我三天,久久不能入眠,也搜了网上很多的博客 都没有顺利的解决maven项目的创建。这篇建议大家收藏,总会用到的。不然大家看网上的博客也是一脸懵逼。 2首先工具使用…

Torque2D MIT 实战记录: 塔防进度(1)

前言 Torque2D虽然工具不齐全,而且加入MIT不久,但是有老底在,所以即使是第一版也是非常好用和完善的,这几天准备开发一款塔防类的游戏. :) 熟悉了TorqueScript的用法后,写东西还是很快的. 进度 1. 完成了道具库模块 2. 场景系统 3. 阵营逻辑 4. 攻击系统雏形 截图 效果还不错吧…

第一百一十一期:思考 | 一文说透秒杀系统如何设计

秒杀大家都不陌生。自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀场景已随处可见。简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。从架构视角来看,秒杀系统本质是一个高性能、高一致、高可…

第一百一十二期:96秒100亿!如何抗住双11高并发流量?

今年双 11 全民购物狂欢节进入第十一个年头,1 分 36 秒,交易额冲到 100 亿 !比 2018 年快了近 30 秒,比 2017 年快了近 1 分半!这个速度再次刷新天猫双 11 成交总额破 100 亿的纪录。 作者:邴越 今年双 11 全民购物狂欢节进入第…

第一百一十三期:去伪存真,区块链应用到底能解决什么实际问题?

区块链技术仍然在发展初期,实践应用也停留在试水阶段。就金融等领域而言,区块链究竟意味着什么?今后实践应用的前景何在?在Libra的倒逼下,全球央行数字货币又将如何发展? 作者:第一财经 两周前,区块链成为热词。上…

两种战斗

两种战斗 Written by Allen Lee 战斗分两种,我们一定要把它们分开,就是为了维持生命的战斗,和为了维持自尊的战斗。 如果你无法分清的话,要么你将致使他失去生命。要么你将致使他失去自尊。“你要是现在去帮忙的话,或…

地图图元的闪烁效果制作

实现查找之后如果加上一个闪烁效果会更明显,方法是用个时间控件控制,改变vstyle即可;还可以简单的设置进程休眠时间,改变可视性,利用一个循环,控制闪烁次数。前面一种实现代码如下: 用个时间控件…

790. Domino and Tromino Tiling

文章目录1 题目理解2 动态规划2.1只有一种板2.2 有两种板1 题目理解 We have two types of tiles: a 2x1 domino shape, and an “L” tromino shape. These shapes may be rotated. XX <- domino XX <- “L” tromino X Given N, how many ways are there to tile a …

第一百一十四期:盘点十大最新Web UI测试工具

本文为您盘点目前十大最新Web UI测试工具的各自优缺点&#xff0c;以方便您根据实际情况进行选择。 作者&#xff1a;陈峻 在过去的几年中&#xff0c;业界至少出现了十二种全新的UI测试自动化工具。虽然每一种工具都有各自的侧重点&#xff0c;但是它们普遍将出色的可用性和…

通过Web Services上传和下载图片文件

通过Web Services上传和下载图片文件 随着Internet技术的发展和跨平台需求的日益增加&#xff0c;Web Services的应用越来越广&#xff0c;我们不但需要通过Web Services传递字符串信息&#xff0c;而且需要传递二进制文件信息。下面&#xff0c;我就分别介绍如何通过Web Servi…

第一百一十五期:Web开发必须掌握的三个技术:Token、Cookie、Session

在Web应用中&#xff0c;HTTP请求是无状态的。即&#xff1a;用户第一次发起请求&#xff0c;与服务器建立连接并登录成功后&#xff0c;为了避免每次打开一个页面都需要登录一下&#xff0c;就出现了cookie&#xff0c;Session。 作者&#xff1a;一颗小梪梪 在Web应用中&am…

第一百一十六期:不能错过!你必须知道的3种重要Python技能

学习Pandas是很棒的体验&#xff0c;学习Numpy也很有趣。但是&#xff0c;你是否过早地开始使用程序库了呢&#xff1f;这也许是因为你还没有意识到pure python的魅力。 作者&#xff1a;读芯术 学习Pandas是很棒的体验&#xff0c;学习Numpy也很有趣。但是&#xff0c;你是否…

第一百一十七期:爱上 Go 语言的10个理由

这个月 Go 语言就将迎来它的10岁生日了&#xff0c;于是我们特地列出了10条让你可以开心使用 Go 语言的理由。 作者&#xff1a;4bytes 这个月 Go 语言就将迎来它的10岁生日了&#xff0c;于是我们特地列出了10条让你可以开心使用 Go 语言的理由。 Map 集合/映射默认使用0值 …

第一百一十八期:运行 JavaScript 代码片段的 20 种工具

运行 JavaScript 代码片段的 20 种工具 前端日常开发中&#xff0c;我们使用喜爱的 IDE 调试 JavaScript 代码&#xff0c;比如我喜欢的代码编辑器有两个&#xff0c;Sublime Text 3 和 VS Code&#xff0c;前几年还使用过 Atom&#xff0c;偶尔我们会遇到临时需要快速分享给同…