近期接触HBase,看了HBase In Action的英文版。開始认为还行,做了些笔记。可是兴许看下去,越来越感觉到实战这本书比較偏使用上的细节,对于HBase的具体设计涉及得很少。把前三章的一些笔记帖一下。后面几章内容不打算整理了。并非说书内容不好。

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


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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGVsaWNr/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

设置 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触发。所曾经者比較轻量级些。
仅仅有合并的时候,该删除的数据才会真正被删除。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGVsaWNr/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

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记录。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGVsaWNr/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

做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+树的查找。结构例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGVsaWNr/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

第一次和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的保证。

全文完 :)

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

  1. 《APUE》第三章笔记(3)

    文件共享 UNIX系统支持在不同进程中共享打开的文件,首先先用一幅apue的图来介绍一下内核用于I/O文件的数据结构: 如图所见,一个进程都会有一个记录项,记录项中包含有一张打开文件描述符表,每个描述 ...

  2. 《APUE》第三章笔记(2)

    read函数 调用read函数从打开的文件中读数据. #include <unistd.h> ssize_t read(int filedes, void *buf, size_t nby ...

  3. 《APUE》第三章笔记(1)

    以下内容是我看<APUE>第二版第三章的笔记,有错还希望指出来,谢谢. unbuffered I/O,跟buffered I/O相对,buffered I/O就是 ISO C标准下的标准输 ...

  4. 《HALCON数字图像处理》第三章笔记

    目录 第三章 HALCON图像处理基础 HALCON控制语句 HALCON算子 HALCON图像处理入门 HALCON图像读取 HALCON图像显示 图形窗口 图像显示 显示文字 HALCON图像转换 ...

  5. 【转】《APUE》第三章笔记(4)及习题3-2

    原文网址:http://www.cnblogs.com/fusae-blog/p/4256794.html APUE第三章的最后面给出的函数,现在还用不着,所以,先留个名字,待到时候用着了再补上好了. ...

  6. 《APUE》第三章笔记(4)及习题3-2

    APUE第三章的最后面给出的函数,现在还用不着,所以,先留个名字,待到时候用着了再补上好了. dup和dup2函数:用来复制文件描述符的 sync函数,fsync函数和fdatasync函数:大致的功 ...

  7. <构建之法>前三章读后感—软件工程

    本教材不同于其他教材一贯的理知识直接灌溉,而是以对话形式向我们传授知识的,以使我们更好地理解知识点,更加清晰明确. 第一章 第一章的概述中,书本以多种方式,形象生动地向我们阐述了软件工程的内容,也让我 ...

  8. Linux 笔记 - 前三章 CentOS 简介、安装和远程连接

    博客地址:http://www.moonxy.com 一.Unix 和 Linux 的区别 目前主流的 Unix 系统有三种,分别是 IBM-AIX.HP-UX.SUN-Solaris,它们分别运行在 ...

  9. jsp前三章小测试:错题

    /bin:存放各种平台下用于启动和停止Tomcat的脚本文件 /logs:存放Tomcat的日志文件 /webapps:web应用的发布目录 /work:Tomcat把由JSP生成的Servlet存放 ...

随机推荐

  1. [HZOI 2016]我们爱数数

    [HZOI 2016]我们爱数数 题目大意: 一张圆桌,每个位置按顺时针从\(1\)到\(n\)编号.有\(n\)个人,编号从\(1\)到\(n\).如果编号为\(i\)的人坐到了编号为\(i\)的位 ...

  2. php正则给图片提取/替换/添加alt标签的正则代码

    有的时候我们需要对富文本编辑器的内容做一些处理,例如图片的alt标签.百度的富文本编辑器添加的图片就是没有的,那么我们要添加就必须使用正则了,下面一起来看看如何实现吧. $preg = "/ ...

  3. Java并发(八):AbstractQueuedSynchronizer

    先做总结: 1.AbstractQueuedSynchronizer是什么? AbstractQueuedSynchronizer(AQS)这个抽象类,是Java并发包 java.util.concu ...

  4. 【矩阵快速幂优化DP】【校内测试】

    实际上是水水题叻,先把朴素DP方程写出来,发现$dp[i]$实际上是$dp[i-k]-dp[i-1]$的和,而看数据范围,我们实际上是要快速地求得这段的和,突然就意识到是矩阵快速幂叻. 构建矩阵什么的 ...

  5. 【9.15校内测试】【寻找扩展可行域+特判】【Trie树 异或最小生成树】【模拟:)】

    之前都没做出来的同名题简直留下心理阴影啊...其实这道题还是挺好想的QAQ 可以发现,鸟可以走到的点是如下图这样扩展的: 由$(0,0)$向两边扩展,黑色是可以扩展到的点,红色是不能扩展的点,可以推出 ...

  6. Java 请求webServce接口 带参数

    public String getWebServiceByParams(String param){ //获取基金缴付记录 // Post请求的url,与get不同的是不需要带参数 URL postU ...

  7. OpenERP实施记录(9):销售一批电脑

    本文是<OpenERP实施记录>系列文章的一部分. 前述的基础数据配置完成之后,我们就可以开始业务处理了. 1. 业务部门接到沃尔玛客户三台联想笔记本电脑的需求.销售 > Sales ...

  8. python接口自动化25-发xml格式post请求

    前言 post请求相对于get请求多一个body部分,body部分常见的数据类型有以下四种(注意是常见的,并不是只有4种) application/x-www-form-urlencoded appl ...

  9. nsq多播分发和负载均衡实验

    什么是nsq?请参考实时分布式消息平台nsq. 本地如何搭建nsq?请参考本地搭建nsq经验分享. 从NSQ的设计文档中得知,单个nsqd被设计为一次能够处理多个流数据,NSQ中的数据流模型是由str ...

  10. 【GISER&&Painter】Chapter02:WebGL中的模型视图变换

    上一节我们提到了如何在一张画布上画一个简单几何图形,通过创建画布,获取WebGLRendering上下文,创建一个简单的着色器,然后将一些顶点数据绑定到gl的Buffer中,最后通过绑定buffer数 ...