Hbase in action部分章节阅读笔记

Chapter 2.2.3: Under the hood: the HBase write path

HBase写路径
HBase
使用Put在HBase中记录新行或修改现有行,内部过程是一样的:HBase接收命令并持久化更改,或者如果写失败,则抛出异常。
写操作默认情况下操作两部分:前置写入日志(WAL)(也称为HLog),以及MemStore(图2.1)。HBase在这两个地方记录写操作的默认行为是为了保持数据的持久性。
MemStore
MemStore是一个写缓冲区,HBase在永久写之前在内存中积累数据。当MemStore填满时,它的内容被刷新到磁盘,形成一个HFile。HFile是HBase的底层存储格式。hfile属于列族,一个列族可以有多个hfile。但是一个HFile不能包含多个列族的数据。每个列族有一个MemStore。
WAL
假设托管一个尚未刷新的MemStore的服务器崩溃了,将丢失内存中但尚未持久化的数据。HBase防范通过在写入完成之前写入WAL。每个服务器的一部分HBase集群保持一个WAL来记录发生的变化,在新的WAL条目出现之前,写操作不会被认为是成功地写。这种保证使得HBase像文件系统备份一样持久。HBase宕机时,可以通过重放WAL来恢复尚未从MemStore刷新到HFile的数据。MemStore是内存的write buffer,到一定量会flush到磁盘上成为HFile,如果region server挂了,数据就丢失。而WAL可以用来恢复数据。
在这里插入图片描述

Chapter 2.2.5:Under the hood: the HBase read path

HBase实现了两个目标:快速访问数据,把数据排序和把数据尽可能多地保留在内存中。
LRU缓存
从HBase读数据必须汇总持久化到HFiles和Memstore中的数据。为了快速读取,HBase设置了LRU缓存。该缓存,也称作BlockCache(块缓存),保存在JVM堆中。BlockCache目的是把经常访问的来自HFile的数据缓存在内存中,避免读取磁盘。每一个列簇有一个BlockCache。
从HBase中读取一行需要首先检查MemStore是否有挂起修改。然后检查BlockCache,看看块是否包含这个行最近被访问。最后,访问磁盘上的相关hfile。

Chapter 4.2:De-normalization is the word in HBase land

去规范化
规范化是关系数据库世界中的一种技术,在这种技术中,每种类型的重复信息都被放到自己的表中。这有两个好处:当更新或删除发生时,您不必担心更新给定数据的所有副本的复杂性;通过使用一个副本而不是多个副本,可以减少存储占用。
去规范化是相反的概念。数据被重复存储在多个位置。这使得查询数据更加容易和快速,因为您不再需要JOIN子句。
当用户创建一个twit时,从关系表中获取所有关注者的列表,并将该twit添加到每个关注者的流中。要实现这一点,首先需要能够找到跟随任何给定用户的用户列表。换句话说,要回答“谁跟着我?”这个问题。在当前的表设计中,这个问题可以通过扫描整个表并寻找rowkey的后半部分是您感兴趣的用户的行来回答。

Chapter 4.5:I/O considerations

HBase表的排序特性有利有弊。当查看twit流表时,排序性质能够快速扫描一小组行,以找到应该在用户流中显示的最新twitt。但是,当将一组时间序列数据写入HBase表时,排序会造成损失。时间戳本质上是单调递增的。这不仅限制了单个区域能够处理的吞吐量,而且还面临超载的风险,而集群中的其他机器都处于空闲状态。
在许多用例中,不需要基于单个时间戳访问数据。需要运行一个在一定时间范围内计算聚合的作业,如果它对延迟不敏感,则可以跨多个区域执行并行扫描。
Rowkey设计
使用Hash rowkey有助于数据在regionserver之间均匀分布,一般可以使用MD5获取定长key。比较棘手的一个场景是在时间序列数据中,使用时间戳作为rowkey,始终在表底部插入数据,由于rowkey的有序性存储,表的最后一个region成为热点。而应用又需要根据时间范围进行扫描查询,所以不能简单将时间戳Hash,这时可以考虑“Salting”方法:
在这里插入图片描述
但是读取现在涉及到将扫描分布到所有区域并找到相关的行。因为它们不再存储在一起,一个简短的扫描是无法解决问题的。

Chapter 4.6:From relational to non-relational

从关系型到非关系型
关系数据库建模包括三个主要概念:
实体——这些实体映射到表。
属性——这些属性映射到列。
关系——这些映射到外键关系。
要将属性映射到HBase,必须区分(至少)两种类型:

  • 标识属性
    标识属性是唯一标识实体的一个实例(即一行)的属性。在关系数据库表中,此属性形成表的主键。在HBase中,标识属性是rowkey的一部分。
    一个实体由多个属性标识。这映射到关系数据库系统中的复合键。在HBase中,标识属性组成rowkey。

  • 非标识属性
    非标识属性基本上映射到HBase中的列限定符。这些属性不需要唯一性保证。
    当有一个宽行(几十或数百列)的关系数据库表。可以将行中的所有值序列化为单个二进制blob,并将其存储为单个单元格中的值。
    这占用了更少的磁盘空间,但也有缺点:行中的值现在是不透明的,并且不能使用HBase表所提供的结构。当存储占用(以及磁盘和网络I/O)非常重要,并且访问模式总是涉及读取整行时,这种方法是有很帮助的。

  • 关系
    关系模型使用两种主要的关系:一对多和多对多。关系数据库将前者直接建模为外键,将后者建模为连接表。在HBase中没有这些的直接映射,通常归结为数据的非规范化。
    HBase没有任何内置的连接或约束,您需要在HBase之外编写代码,迭代每个用户,然后为该用户执行独立的HBase查找,以找到他们最近的twits(或为每个追随者反规范化twits副本)。
    HBase的列在设计时不是预定义的。它们可以是任何东西。

  • 嵌套实体

一对多关系在Hbase中被建模为单行,rowkey将对应于父实体。嵌套的值将包含子值,其中每个子实体将一个列限定符放到它们的标识属性存储的位置,其余的非标识属性存储在值中。真正的HBase行定义了父记录;子实体的记录被存储为单个列。
在这里插入图片描述

  • 列族
    关系数据库中没有列族,HBase中列族是作为用于单个行包含一系列不相交的列的一种方式,
    列族建立了一对一的关系模型,其中有两个表具有相同主键,每个表有0或1行,有各自主键值

  • 索引
    关系数据库声明的索引在Hbase中不存在。

  • 版本控制
    如果在关系模式中,存在显式存储时间戳的地方,那么在很多情况下,这些可以包含到存储在HBase单元中的时间戳中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值