《HBase权威指南》读书笔记1

1.4 HBase结构

1.4.2 HBase 的表、列和单元格

  • 基本单位是column
  • 多column组成row
  • 一个row有唯一rowkey
  • 每个column有多个版本,多个版本存储在单元格(cell)中
  • 行序是按照字典顺序进行排序的,意思是从左到右一次对比每一个键

关于排序:

排列顺序如果跟预期的不一样,需要补键,比如  row-1 永远小于 row-2,无论后面是什么,将始终按照这个顺序排列

思考

这有可能影响到balance策略,假设你根据时间戳来做rowkey,那么会出现最后一个节点,数据不断增加而前面的节点数据不变,这个过程会持续到达到rebalance的阀值,然后触发rebalance过程,在rebalance 的时候系统性能急剧下降。当此次rebalance 完成后,只是保证了暂时的数据平衡,很快最后一个节点又会出现达到rebalance阀值的情况,就会带来一个有规律的间歇性的系统性能下降,十分危险。

列族的作用

若干列组成列族(column family),作用是:

  • 构建数据的语义边界或者局部边界
  • 有助于设置压缩或者指示他们存储在内存中
  • 一个列族的所有列存储在同一个底层存储文件里面,这个文件叫做HFile

列族使用注意点

  • 列族不能修改的太频繁,数量也不能太多,在当前的实现中如果列族大于几十个会出现bug,实际情况可能还小的多
  • 引用列的格式为 family:qualifier , family 就是列族名, qualifier就是列名,比如 log:time 是获取 log这个列族中的time列,列是无限的可以达到几百万

列的时间戳

每个列的时间戳有以下特性

  • 默认由系统指定,也可以手动指定
  • 可以通过不同的时间戳区分版本

单元格的版本

  • 用户可以i指定每个值所能存储的最大版本数
  • 支持谓词删除(predicate deletion)(暂时不知道什么意思):比如只允许用户存储过去一周的值,不过这些值是未解释的字节数组

Hbase的一种应用场景

webtable: 存储从互联网上抓取的网页。行键是反转的url比如org.hbase.www ,有一个用于存储HTML的列叫 contents,还有其他列族,比如 anchor用户存储外向链接和入站链接,还有用于存储元数据的列列族language。 content列族用多版本来存储html,可以查询到旧的html。例如帮助分析页面变化频率就可以把时间戳设置成抓取页面的次数

原子性

行数据的存取是原子性的,目前不支持跨行事务和跨表事务。由于行数据是原子性的,所以可以达到强一致性(表示怀疑)

1.4.3 自动分区

Hbase中扩展和负载均衡的基本单元成为region

  • region是行键连续排列的存储区间
  • 如果region太大就会动态拆分
  • 如果region太小就会合并以节省空间
  • region相当于传统数据库的分区表

region是怎么分区的

  • 一开始是有一个region,当这个region大到一定的值的时候就会从中间键(middle key,region中间的那个行键)处将这个region拆分为大致相等的两个子region。
  • 一个region服务器可以有多个region。
  • Hbase不支持在线的region合并,但是可以离线合并
  • region的拆分非常快,接近于瞬间,因为并没有改变存储的位置
  • 如果一个region server的负载过大会触发region迁移,它会将region迁移到别的region server上

思考

  • 如果是这样来推导那么系统中的region大小会平均分布为大概是  阀值/2 那么大。
  • 高负载情况下是否会出现触发region迁移,但是region迁移又增加负载的恶性循环?

建议

  • 每台服务器的最佳加载数量是 10~1000
  • 每个region最佳大小是 1G~2G (基于现有硬件推算)

1.4.4 存储API

API提供了

  • 建表
  • 删表
  • 增加列族
  • 删除列族
  • 修改表
  • 修改列族元数据(压缩,设置块大小)
  • 行键值的增加,删除,查找

scan API

scan可以

  • 限定返回的列或者返回的版本数
  • 可以设置过滤器

系统支持单行事务,进一步实现单行键下存储的数据的 读-修改-写(read-modify-write)序列

单元格的值可以当计数器用,并且支持原子更新,意味着这个计数器可以在一个操作中实现读写,客户端可以基于此实现一个全局强一致的计数器

协处理器(coprocessor): 可以在服务器的地址空间执行来自客户端的代码。用于实现轻量级的批处理作业,或者使用表达式分析或者汇总数据

通过包装器可以将表转换成MapReduce的输入输出目标

1.4.5 实现

数据存储在 存储文件(store file)中,称为HFile

  • HFile中的键值是经过排序的
  • 文件内部是连续的块,块的索引信息存储在尾部
  • HFile被加载到内存中时,索引会优先加载到内存中
  • 每个块默认是64KB

每次更新数据的时候发生了什么

  1. 数据记录到提交日志(commit log),在HBase中称之为 预写日志(write-ahead log, WAL)(存储在HDFS系统上)
  2. 数据写入内存中的 memstore
  3. 写入的数据超过阀值,数据被写入HFile
  4. 数据移出memstore,丢弃提交日志。采用滚动memstore可以实现不阻塞系统读写,即用空的新memstore获取更新数据,将旧的满的memstore转换成一个文件,由于memstore中的数据本来就排序好了,所以存储的时候不用再次排序

当记录被固化到HFile上之后,删除键值对并不是直接删除,而是做个删除标记delete marker。

查询结果是memstore+HFile的数据。

查询的时候用不到WAL,只有服务器内存中的数据在服务器崩溃前没有写入磁盘,而后进行恢复数据时才会用到WAL。

管家机制

HFile过多的时候有管家机制来处理,合并有两种类型:

minor合并:多个小文件合并成一个大文件,由于是多路归并所以速度快

major压缩合并:将region中一个列族的若干个HFile重写为一个新HFile。合并扫描所有键值对,顺序重写所有数据,重写数据的过程中会略过做了删除标记的数据。断言删除此时生效。

master 负责负载均衡,将繁忙服务器中的region移到负载轻的服务器中

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-01 06:41:11

《HBase权威指南》读书笔记1的相关文章

《android开发艺术探索》读书笔记(五)--动画

接上篇<android开发艺术探索>读书笔记(五)--Drawable No1: 自定义动画:派生一种新动画只需要继承Animation这个抽象类,然后重写它的initialize和applyTransformation方法,在initialize方法中做一些初始化工作,在applyTransformation中进行相应的矩阵变换即可,很多时候需要采用Camera来简化矩阵变换的过程. No2: 属性动画PropertyAnimation 补间动画TweenAnimation 帧动画Frame

《android开发艺术探索》读书笔记(十三)--综合技术

接上篇<android开发艺术探索>读书笔记(十二)--Bitmap的加载和Cache No1: 使用CrashHandler来获取应用的crash信息 No2: 在Android中单个dex文件所能够包含的最大方法数为65536,这包含Android FrameWork.依赖的jar包以及应用本身的代码中的所有方法. No3: 使用multidex来解决方法数越界 apply plugin: 'com.android.application' android { compileSdkVers

《android开发艺术探索》读书笔记(十五)--Android性能优化

接上篇<android开发艺术探索>读书笔记(十四)--JNI和NDK编程 No1: 如果<include>制定了这个id属性,同时被包含的布局文件的根元素也制定了id属性,那么以<include>指定的id属性为准 No2: 绘制优化 1)onDraw中不要创建新的局部对象 2)onDraw方法中不要做耗时的任务 No3: 内存泄露优化 场景一:静态变量导致的内存泄露: 如果静态变量持有了一个Activity,会导致Activity无法及时释放. 解决办法:1使用Ap

&lt;王二的经济学故事&gt;读书笔记

不是简单地用价格把供需弄平衡就完事了,座位分配给谁同样重要 一个成功的社会必须要有成功的人,必须要给成功的人应得的回报 需求曲线向下倾斜,价格越高需求越少 先来的都是那些时间最不值钱的 无论收入分配差距的根源是什么,收入分配差距的拉大,在一个市场经济的环境下,必然会造成富人对穷人的挤出效应,特别是在那些供给相对有限而需求相对刚性的瓶颈部门. 一个国家只能由一个公共财政体系,而需要服务的却是10多亿状况非常不同的老百姓 没有工资自然不用缴收入所得税,而且,自己一家的开销可以做成公司成本,从而降低公

《Android开发艺术探索》读书笔记之Activity的生命周期

两种不同情况下的Activity生命周期 (1)典型情况下的生命周期 指在有用户参与的情况下,Activity所经过的生命周期的改变. (2)异常情况下的生命周期 指Activity被系统回收或者由于当前设备的Configuration发生改变重而导致Activity被销毁传重建. 看看官方文档的Activity生命周期图 注意以下几点: (1)onstart()和onResume()从实际使用过程来说差不多,但是onstart()的时候Activity虽然可见啦但是还在后台,onResume(

《android开发艺术探索》读书笔记(八)--WindowManager

No1: Window是一个抽象类,它的具体实现是PhoneWindow.创建一个Window是很简单的事,只需要通过WindowManager即可完成. WindowManager是外界访问Window的入口,Window的具体实现位于WindowManagerService中,WindwoManager和WindowManagerService的交互时一个IPC过程. Android中所有的视图都是通过Window来呈现的,因此Window实际是View的直接管理者. 单机事件由Window

《艺术的故事》-读书笔记1

1.关于艺术家们画的不够逼真的作品 毫无疑问,现代艺术家们有足够的知识作出更逼真的作品,因此,当我们看到一副画画的不够正确时,首先应该考虑两件事,一件事是艺术家是否无端地更改了他所见的事物 的外形,另一件事是除非已经证明我们的看法正确而画家是错的,否则就不能指责一幅画画的不正确.一幅作品不够正确的地方也许正是了解它的钥匙. 2.关于什么是美?为何美?如何创造美?也许很难回答,但是美学感受却是可以通过对美好事物的不断观赏,分析来提高的. 3.知之为知之,不知为不知,是知也. 注:本文观点为<艺术的

Unix编程艺术读书笔记(一)

 Unix编程艺术读书笔记(一)这本书是一位面试官告诉我的,很感谢他的指点,关于面试的详细过程,我想以后再写,当然我也意识到自己的不足,一方面是面试的技巧,还有一方面就是学习的方法.阅读这本书很享受,加上之前的积累,一些疑惑,还有一些基础的不足,在这本书里找到了归宿. 下面,一起来享受这本书的精华吧 Unix诞生与1969年,那时候我们还在闹文革吧,可一个可以改变21世纪甚至更远的未来的操作系统问世,至少现在的Linux是基于Unix的设计哲学.Unix是唯一一个在不同种类的计算机,众多厂商

Javascript Dom编程艺术(第2版)读书笔记

Javascript Dom编程艺术这本书我看的是第2版的,真心觉得这本书不错,它将DOM编程的一些基本原则,及如何让Javascript代码在浏览器不支持的情况下,或浏览器支持了Javascript但用户禁用它的情况下做到平衡退化,让最基本的操作仍能顺利完成,以及如何让结构与样式分享做到真正的渐近增强叙述得很清楚,也很容易理解接受.我也是看了这本书之后,才对代码优化,结构,行为,样式有了进一步的加深理解. Javascript Dom编程艺术(第2版)读书笔记,布布扣,bubuko.com

Javascript DOM 编程艺术读书笔记16/04/01

愚人节快乐 开始用webstorm了,随着学习深入,代码越来越长,因为不借助ide还真是挺难的 今天发现了一个严重的误区,text和textNode是完全不同的两个概念,之前没有特别注意,写代码很容易跳过createTextNode直接用parentNode.appendChild(text) 单独拎出来晒一晒,以后引以为戒 Javascript DOM 编程艺术读书笔记16/04/01