HBase in Action前三章笔记

最近接触HBase,看了HBase In Action的英文版。开始觉得还行,做了些笔记,但是后续看下去,越来越感觉到实战这本书比较偏使用上的细节,对于HBase的详细设计涉及得非常少。把前三章的一些笔记帖一下,后面几章内容不打算整理了,并不是说书内容不好。

key-value存储,强一致性,多个RegionServer节点对client端是不暴露细节的

使用场景:典型的web-search, capture incremental data, ad. click stream, content serving, info exchange

设置 hbase.root 来改写本来写/tmp的数据路径

HBase shell是jruby写,hbase shell来启动

一些命令:

list
create 'pelick', 'cf'
put 'pelick', 'first', 'cf:msg', 'wefewfwf'
put 'pelick', 'sec', 'cf:num', 12234
get 'pelick', 'first' 默认返回version最新的数据,实际上put的时候会有带新的版本号
scan 'pelick'
describe 'pelick'

一些对应的API类和简单使用

HTableInterface usersTable = new HTable("users");

Configuration myConf = HBaseConfiguration.create();
HTableInterface usersTable = new HTable(myConf, "users");

HTablePool pool = new HTablePool();
HTableInterface usersTable = pool.getTable("users");
... // work with the table
usersTable.close();

Get, Put, Delete, Scan, Increment

Put p = new Put(Bytes.toBytes(" TheRealMT"));
p.add(Bytes.toBytes("info"),
Bytes.toBytes("name"),
Bytes.toBytes("Mark Twain"));

Put的时候,成功执行需要两个保证,write-ahead log(WAL,即HLog)和MemStore

这两部分保证了data durability,可以选择不要WAL,就不保证数据不丢了,

Put p = new Put();
p.setWriteToWAL(false);

原因如下:

MemStore是内存的write buffer,到一定量会flush到磁盘上成为HFile,如果region server挂了,数据就丢失。而WAL可以用来恢复数据。

一个column family可以有多个HFile,但是一个HFile不能有多个column family的数据。每个column family对应一个MemStore。

每台HBase机器都保存一份WAL,而这份WAL的durable取决于下面的文件系统,HDFS保证了这点。

一台HBase机器的WAL被所有的表、列簇共享。

Get的时候可以控制获得数据内容,通过addColumn()和addFamily()

Get g = new Get(Bytes.toBytes("TheRealMT"));
g.addColumn(
Bytes.toBytes("info"),
Bytes.toBytes("password"));
Result r = usersTable.get(g);

读数据的时候,有一个LRU cache来缓存经常访问的数据,即BlockCache,用来缓存HFile内容,提升读性能。

每个column family有自己的BlockCache。

HFile本质上是由Block组成的,index定位的。默认block大小是64K,可调整来影响顺序/随机读性能。block是读的最小单位。

Delete也相似,

Delete d = new Delete(Bytes.toBytes("TheRealMT"));
d.deleteColumns(
Bytes.toBytes("info"),
Bytes.toBytes("email"));
usersTable.delete(d);

对Delete来说,数据并没有及时删除,是做了标记,不能被scan和get到。实际上,在compaction的时候会删除。

compaction分为minor和major两种。前者是合并HFile,比较常发生,对于合并的HFile大小和数目的设定会影响写性能。合并比较吃IO的。

后者是把给定的region的一个列簇的所有HFile合并为一个HFile,开销大,要手动shell触发。所以前者比较轻量级些。

只有合并的时候,该删除的数据才会真正被删除。

HBase除了是schema-less的,也是版本化的。对同一个列,可以写多次,每次会带版本,是个long值,默认依赖时间戳。所以机器的时间应该要设置为同步。默认保留三份版本,如果多了,会把之前的旧版本替掉。

Table,Row,Column Family,Column qualifier,Cell,Version,这些组成了HBase数据构成。

Row:row key是唯一的,byte[]。列簇影响物理数据分布。Column qualifier的话各个row可以设置为不一样。

cell是rowkey+cf+cq组成的一条唯一记录,理解为一行数据,也是byte[]

在访问上述这些元素的时候,是通过协调输入的rowkey, column family, column qualifier, version四个维度来找的

可以用4D的查找方式来理解一个普通的二维表,下图解释很清楚

所以呢,我们可以把查找理解为key是一个map(可以是四维里的前几个组成的查询条件),value为一个map或多个maps

HBase数据模型是半结构化的,即列数可以不同,域值长度也可以不同

从逻辑模型的角度看,HBase提供的是无限制的,持久的,嵌套不同版本的结构。可以把整个结构理解为java里的这样一个Map:

Map<RowKey, Map<ColumnFamily, Map<ColumnQualifier,Map<Version, Data>>>>

且里面是降序排列的

从物理模型的角度看,一个列簇有多个HFile,本身是二进制文件,里面不包含null记录。

做Table Scan的时候,可以传filter,具体API不列举。

在设置rowkey的时候,尽量让rowkey长度一致,比如hash一次。rowkey的设计影响重大,要尽量高效。

hbase.client.scanner.caching可以设置每次RPC返回的row个数,cache在client端,默认是1,比较影响性能。

HBase的原子操作,即Incremental Column Value(ICV),

long ret = usersTable.incrementColumnValue(
  Bytes.toBytes("TheRealMT"),
  Bytes.toBytes("info"),
  Bytes.toBytes("tweet_count"),
1L);

类似java的AtomicLong.addAndGet()

HBase的region存在于region server上,与HDFS的datanode共存。由matser进程来分布region。

hbase.hregion.max.filesize影响一个region的分裂

client读写数据的时候,主要靠-ROOT-和.META.来做类似B+树的查找。结构如下:

第一次和zk通信,得到-ROOT-在哪里。然后向某RS问,得到.META.在哪里。然后向某RS2问,得到目标RS在哪里。最后向目标RS问,数据的具体位置。

这两表在client端会缓存。

HBase和MR的交互:可以把HBase当MR的数据源和写入目标,HBase还可以参与map-side join。

reduce-side join需要把所有数据shuffle到reduce端并且sort,开销大,那么map端的join可以减小IO和网络开销。

小表可以直接放内存进行map-side join,此时把这步直接变成读HBase,就节省了内存。具体例子不举了。

本质上,把HBase当作一个外部的巨大的hash table。

MR要注意是幂等的,对于有map里有状态的操纵,要注意避免影响,比如HBase的increment命令

部署要注意,HBase部署的datanode上尽量不要起MR的进程了,会影响性能。

最后说说HBase的可用性和可靠性。

可用性指系统处理失败的能力。RegionServer是具备可用性的,一台挂了,另一个可以代替它工作(数据在HDFS上保证,信息可以从master获取)。要达到高可用,还可以做一些防御性部署,比如考虑多master的机架分布。

可靠性是一个数据库系统的名词,指数据durability和性能保证的结合。

那么HDFS作为HBase的支撑,带来了什么呢?

所有region servers是HDFS文件系统上的同一套namespace,保证了可用性。

RS和datanode共同部署,减少网络IO开销。

可靠性方面,HDFS保证数据的备份和不丢失。HBase本身的写语义具备durability的保证。

全文完 :)

时间: 2024-10-15 14:24:32

HBase in Action前三章笔记的相关文章

Android群英传笔记——第三章:Android控件架构与自定义控件讲解

Android群英传笔记--第三章:Android控件架构与自定义控件讲解 真的很久没有更新博客了,三四天了吧,搬家干嘛的,心累,事件又很紧,抽时间把第三章大致的看完了,当然,我还是有一点View的基础的,可以先看下我之前写的几篇基础的View博客 Android绘图机制(一)--自定义View的基础属性和方法 Android绘图机制(二)--自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解 Android绘图机制(三)--自定义View的三种实现方式以及实战

python学习笔记第三章:最初的步骤

今天从笔记的标题来看,你可能会很困惑,什么"最初的步骤"?这个标题是我引用了<python简明教程>中第三章的标题,给大家解释下就会都明白了. "最初的步骤"主要讲的就是 你刚才学习.练习python所用到的一些编辑器和执行python代码的方式. 一.使用带提示符的编辑器 "带提示符的编辑器" 也就是linux系统使用的终端,Windows系统中使用的命令提示符. 在linux终端shell提示符下输入python,启动pthon解

Java初级笔记-第三章

第三章 程序设计基础 3.1 流程图 3.1.1 什么是流程图: 流程图是通过箭头(流程线)相互连接的几何图形来表达程序运行的方法. 流程图是算法的一种图形化描述,比较直观的表达了一件事务的处理过程.相对于代码来讲容易理解. 3.1.2 流程图的组成: 画流程图的方法是:从左到右.从上到下.根据问题的需要,确定解决问题的先后处理顺序以及前提条件,将流程线将各图形符号连接起来,直观的表达自己的逻辑思想或问题的处理方法,最终达到预期的结果. 注意事项: 一个流程图只能有一个开始框,开始框作为处理问题

MYSQL必知必会读书笔记第三章之显示数据库_Mysql

MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理. show column from tablename: 对每一个字段返回一行,行中包含字段名,数据类型.是否允许NULL.键信息.默认值以及其他信息. describe 语句: MySQL支持使用describ作为show columns from 的一种快捷方式.describ tablename 所支持的其他的show语句: show s

【PMP】Head First PMP 学习笔记 第三章 过程框架

第三章 过程框架 项目中完成的所有工作都由过程构成. 项目中的完成的所有工作都有一个模式(pattern).先计划,再去做.工作时,总是对项目与原先的计划进行比较.如果开始偏离计划,就要由你做出矫正,让一切重新走上正轨.过程框架--过程租和知识领域--正式这一切顺利完成的关键. 分阶段管理 分阶段,项目的每个阶段(phase)都会经过5个过程租,从启动到收尾,项目的多个阶段就会存在各种关联关系 顺序关系(sequenital relationship).多个阶段相继发生并不存在重叠,每个阶段在前

网页排版CSS教学第三章 CSS的应用补充

css|网页 第三章 CSS的应用补充 挑 选 者 特 性 的 应 用 在讲挑选者的特性之前,要提一下的是CSS继承的特性.所谓的继承的特性是指被包在内部的标签将拥有外部标签的样式性质.继承的特性最典型的应用通常发挥在预设整份网页的样式,而要指定为其它样式的部份再依要设定在个别元素里即可.这项特性可以提供网页设计者更理想的发挥空间. 接下来就要讲挑选者特性的应用!其实这部份应该算是声明的一种方式,但是在您看过第二章的基本的声明与应用後,到这边再讲挑选者您会比较有概念点.在CSS应用或设计的时候,

《.net编程先锋C#》第三章 第一个C#应用程序(转)

编程|程序 第三章 第一个C#应用程序 3.0 选择一个编辑器尽管我是一个顽固的Notepad狂,但这次我不建议用它编辑源码.原因是你正在与真正的编程语言打交道,使用Notepad编辑源码编译时可能产生大量的错误信息行(C++程序员知道我在说什么.)你有几种选择.可以重新配置你信任的老式Visual C++ 6.0,使它能够和C#源文件一起工作.第二种选择是使用新的Visual Studio 7.第三,你可以用任何第三方程序编辑器,最好要支持行数.色彩编码.工具集成和良好的搜索功能.CodeWr

&amp;gt; 前言(补充) 和第三章 第一个C#程序(rainbow 翻译)(来自重粒子空间)

程序 <<展现C#>> 前言(补充) 和第三章 第一个C#程序(rainbow 翻译)   出处:http://www.informit.com/matter/ser0000001/chapter1/ch03.shtml 正文: 前言0.1  提要    欢迎阅读<展现 C#>(Presenting C#).这本书是你提高企业编程语言的一条捷径.这种企业编程语言带有下一代编程语言服务运行时(NGWS Runtime):C#(发音"C sharp").

C语言学习教程第三章-C语言程序设计初步(8)

转移语句 程序中的语句通常总是按顺序方向, 或按语句功能所定义的方向执行的.如果需要改变程序的正常流向, 可以使用本小节介绍的转移语句.在C语言中提供了4种转移语句:goto,break, continue和return.其中的return语句只能出现在被调函数中, 用于返回主调函数,我们将在函数一章中具体介绍. 本小节介绍前三种转移语句. 1.goto语句 goto语句也称为无条件转移语句,其一般格式如下: goto 语句标号: 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标