第一章  简介

背景:

  GFS:集群存储海量数据,数据在节点间冗余复制,即使一台存储服务器发生故障,也不会影响可用性。

  GFS的缺点:适合存储少许非常大的文件,而不适合存储大量小文件,因为文件的元数据信息存储在主节点的内存中,文件越多主节点压力越大。

  BigTable:RDBMS在大规模处理中有缺点,可以摒弃关系型的特点,采用简单API进行CRUD,再加一个扫描函数。

表,列,单元格:

  基本单位是column

  多column组成row

  若干列组成列族(column family)

  一个row有唯一rowkey

  每个column有多个版本,每一个单元格可以保留若干版本的数据

  行序是按照字典顺序进行排序的,row-10要小于row-2

列族的作用:

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

列族使用注意点:

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

列的时间戳:

每个列的时间戳有以下特性
  • 默认由系统指定,也可以手动指定
  • 可以通过不同的时间戳区分版本

单元格的版本:

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

Hbase的一种应用场景:

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

自动分区:

Hbase中扩展和负载均衡的基本单元成为region
  • region是行键连续排列的存储区间
  • 如果region太大就会动态拆分
  • 如果region太小就会合并以节省空间
  • region相当于传统数据库的分区表
  • 每台服务器上的region最好是10-1000个

region是怎么分区的:

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

存储API:

  系统支持单行事务,进一步实现单行键下存储的数据的 读-修改-写(read-modify-write)序列
  单元格的值可以当计数器用,并且支持原子更新,意味着这个计数器可以在一个操作中实现读写,客户端可以基于此实现一个全局强一致的计数器

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

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

实现:

数据存储在 存储文件(store file)中,称为HFile:
  • HFile中的键值是经过排序的
  • 文件内部是连续的块,块的索引信息存储在尾部
  • HFile被加载到内存中时,索引会优先加载到内存中
  • 每个块默认是64KB
  • 存储文件通常保存在HDFS中

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

  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移到负载轻的服务器中
 

ZooKeeper:

  ZooKeeper是一个可靠的,高可用的,持久化的分布式协调系统。
  主服务器主要负责用ZooKeeper为region服务器分配region。
  每台region服务器在Zookeeper中注册一个自己的临时节点,主服务器可以利用这些节点来跟踪机器故障和网络分区。
  HBase还可以利用ZooKeeper确保只有一个主服务器在运行。
  主服务器提供负载均衡和集群管理,将繁忙的服务器中的region移到负载较轻的服务器中。
  主服务器不为region服务器或者客户端提供任何的数据服务,是个轻量级服务器。
 

HBase特点:

  容量大:HBase可以存储海量数据:数十亿行 X 数百万列 X 数千个版本 = PB级存储
  稀疏性:在传统关系型数据库中,null值是要占存储空间的。而在HBase中,允许表在存储时不存储null值,所以不会占存储空间。

《HBase权威指南》学习笔记的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  3. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  4. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  7. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  8. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

  9. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

  10. ucos实时操作系统学习笔记——任务间通信(消息)

    ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...

随机推荐

  1. 解题:POI 2004 Bridge

    题面 小学数奥见祖宗(相信大多数人小学都看过这个玩意 如果你没看过这个问题,第一反应可能是让跑的最快的来回送火把,然而样例已经hack掉了这种做法,更优的做法是让跑的最快的和第二快的来回送火把.然后事 ...

  2. Work at DP

    转载请注明出处:http://www.cnblogs.com/TSHugh/p/8858805.html Prepared: (无notes的波兰题目的notes见我的波兰题目补全计划)BZOJ #3 ...

  3. 使用log4net将日志文件输出为csv格式

    我们在编写程序时,会在程序运行过程中记录一些日志.log4net作为一款经久耐用的日志组件,值得我们信赖.在中小型公司中,往往没有专业的日志服务器来处理应用程序产生的日志,而格式化不好的日志文件又为上 ...

  4. Windows10实用技巧-固定快捷方式到磁贴菜单方式

    快捷方式固定到磁贴 Win10的开始菜单中的磁贴功能比较不错,可以在不清理桌面上其他软件的情况下直接唤醒需要的应用.  但是比较麻烦的是一些应用或快捷方式并不能直接固定到上面. 后来发现所有Windo ...

  5. 在vue中使用animate.css

    animate.css是一款前端动画库,相似的有velocity-animate 用法: 首先 npm install animate.css --save 然后在vue文件的script中引入: i ...

  6. Gogent相关问题的解决(不断更新)

    1:今天早上打开推特,发现进不去了,google浏览器一直提示404……找不到网址,真心郁闷.后来,查了查,才知道,最近google在北京的主干服务器被xx了,某些省就上不了了…… ……乱七八糟的不说 ...

  7. ACM-ICPC2018 沈阳赛区网络预赛-E-The cake is a lie

    You promised your girlfriend a rounded cake with at least SS strawberries. But something goes wrong, ...

  8. Python学习笔记(三十四)—内置模块(3)base64

    摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431954588 ...

  9. c语言中使用自带的qsort(结构体排序)+ 快排

    c中没有自带的sort函数emm 不过有自带的qsort函数 (其实用法都差不多(只是我经常以为c中有sort 头文件要用 #include <stdlib.h> 一定要重新把指针指向的值 ...

  10. 2008 Round 1A C Numbers (矩阵快速幂)

    题目描述: 请输出(3+√5)^n整数部分最后3位.如果结果不超过2位,请补足前导0. 分析: 我们最容易想到的方法肯定是直接计算这个表达式的值,但是这样的精度是不够的.朴素的算法没有办法得到答案.但 ...