第4章 分布式数据库HBase

4.1 概述

4.1.1 关于BigTable

BigTable是谷歌开发的 为解决典型的互联网搜索问题的 分布式存储系统

互联网搜索服务一般分为两步:首先,爬虫持续不断的抓取新页面,每页一行存储到BigTable里,MR运行在整张表上,生成索引;然后,用户发起网络搜索请求时,应用索引在BigTbale里得到网页,然后把搜索结果提交到用户。

4.1.2 HBase简介

1. HBase是高可靠、高性能、面向列、可伸缩的分布式数据库,BigTable的开源实现,用于存储非结构化或半结构化的数据。可处理10亿行几百万列的数据表。

2. HBase与Hadoop生态中其它组件的关系

1)HDFS为HBase提供底层的文件系统支持;

2)MR为HBase提供海量数据处理的计算引擎;

3)Zookeeper为HBase提供协同服务管理;

4)Pig/Hive为HBase提供高层语言支持;

3. 已有HDFS和MR,为什么需要HBase?

HBase更有效地解决实时处理和随机访问问题。HDFS和MR则更适用于离线高延迟批量处理。

4.1.3 HBase与传统数据库对比

1)数据类型:HBase仅支持一种类型,即未经解释的字符串;

2)数据操作:HBase通常只采用单表的主键查询,而不涉及多个表的复杂连接;

3)存储模式:HBase基于列(族)存储;

4)数据索引:HBase只有一个索引-行键;

5)数据维护:HBase不会删除旧数据,而是会存储多个版本(带时间戳)

6)可伸缩性:HBase很好的支持横向扩展,即通过加机器解决问题。

4.2 HBase访问接口

1)Java API是最常规和高效的方式;

2)HBase Shell是最常用的管理操作;

3)Thrift Gateway通过序列化技术扩展了支持的语言,如python等;☆

4)REST Gateway支持了HTTP API访问;

5)Pig和Hive是数仓工具。

上述工具均应系统学习。

4.3 HBase数据模型

4.3.1~4.3.3 HBase简介数据模型

1. 概述:HBase是一个稀疏、多维度、排序的映射表,索引是行键、列族、列限定符、时间戳。

2. 相关概念

1)表:表仍然由行和列组成,其中列分为若干个列族。

2)行:每个行有一个独一无二的行键进行标识;可以通过单个行键、行键区间、全表扫描等方式进行访问;行键被保存为字节数据,且存储时是排过序的。

3)列族:设计表时就被写死的,通常几十个。

4)列限定符:也就是列,每个列族都有若干个列,而且不用事先定义。

5)单元格:通过行键、列族、列限定符就可以锁定到一个单元格了。

6)时间戳:每个单元格都保存着同一份数据的多个版本,通过时间戳进行标记,时间戳默认desc排序。

3. 数据坐标角度

通过行键、列族、列限定符、时间戳就能索引出独一无二的数据来了,因此也称之为数据的四维坐标。

4. 键值角度

把四维坐标看成一个整体,当作键,索引出的数据叫做值,那么HBase就可以看作键值数据库了。

4.3.4~4.3.5 概念视图与物理视图

概念视图

概念视图是稀疏的,因为很多[行键,列族,列限定符,时间戳]索引都没有值

但物理视图是紧凑的,因为HBase是基于列存储,每个列族单独存放,有值的才会存放,没有值的,连NULL都没有。

4.3.6 深入理解面向列的存储

1. 面向行存储

数据是一行一行被存储的,以学生信息系统为例,每一行包含了一个学生的全部信息,比如学号、姓名、性别、年龄、专业、班级、手机、邮箱、等等。

增删改:若新来了一个学生,则在该数据库新增加一行;若某个学生退学了,则把改行删除;若某个学生的某个信息(如手机号)发生了改动,则对该信息做对应修改。

查:若想把所有学生的年龄取出来,看一下年龄分布,则注意:此时需要逐行扫描,对每一行,都要扫描学号、姓名、年龄、、、最终找到年龄。

2. 面向列存储

把全部的数据分成若干个列(族),比如联系方式是一个列族(里面包括手机号、邮箱等列限定符),该列族对所有的学生的联系方式进行存储,基本信息是一个列族(里面包括年龄、性别等),该列族存储所有学生的所有基本信息。

增删改:对应的信息不做删除,而是会添加,并用时间戳进行标记。

查:若此时想取出年龄,则不再需要遍历所有学生的所有信息,仅把对应列族的列取出来即可。

注意:尽管是面向列存储,但归根结底每一行是一个学生,这就是行键的作用。

3. 两者的区别

若数据库会频繁进行修改,则适用于行式数据库。若数据库一经存储便不再修改(数仓),但需要做很多查询、分析等,则适用于列式数据库。

(更多的从HBase的物理视图去理解列式数据库)

4.4 HBase的实现原理

4.4.1 HBase的功能组件

1)库函数:负责连接到每个客户端。

2)一个Master服务器:① 负责管理和维护HBase表的分区信息;② 负责维护Region服务器列表;③ 负责不同的Region服务器的负载均衡。

3)若干个Region服务器:存储和维护分配给自己的Region,处理来自客户端的读写请求。

4.4.2 表和Region

1)一个HBase库可以有很多表,每个表的行是排过序的,排序的依据是行键的值的字典序。

2)一个表的行数可能非常之大,无法存储到单台服务器上,因此会根据行键的值进行分区,每个行区间构成一个分区,称为Region。

3)分区机制:① 每个表最初只包含一个region,随着数据不断插入,当行数达到设定的阈值时,会自动等分成两个region;② 不同的region被master分配到不同的region服务器上,一个region服务器可以存储很多个region,但同一个region不会被拆分到多个region服务器上。

4.4.3 Region定位

1. 由下及上

1).META表:维护RegionID和Region服务器的映射关系。

2)-ROOT-表:因为Region数量庞大,所以.META表本身也被拆分成了若干个Region。-ROOT-表记录.META表的Region信息。-ROOT-表只有一个Region。

3)Zookeeper文件:记录了-ROOT-表的位置信息。

2. 由上及下

客户端通过Zookeeper文件找到-ROOT-表的存储位置,然后通过-ROOT-表找到.META表的位置,然后通过.META表找到所需的Region在哪个Region服务器上,然后到该Region服务器读取数据。

4.5 HBase运行机制

4.5.1 HBase的系统架构

HBase系统架构如下图

HBase不直接跟硬件打交道,而是架构在HDFS文件系统之上的。主要由客户端、Zookeeper、Master、Region服务器(核心)四个部分构成。分别简述如下。

1. 客户端

如上图所示,客户端会访问Zookeeper获取文件的存储位置、并进行一些缓存、访问Region服务器读取数据等。

2. Zookeeper服务器

1)把-ROOT文件保存到内存中,供客户端进行三级寻址;

2)在Region服务器集群中选出一个master;

3)监控所有的Region服务器,并实时通知给master。

3. Master

管理着表和Region,包括以下方面:

1)管理客户端对表的增删改查操作,负责不同Region服务器的负载均衡;

2)在Region发生分裂或合并时负责调整;

3)对故障失效的Region服务器上的Region进行迁移。

注意:Master不参与客户端访问HBase服务器上数据的过程。(?)

4. Region服务器

是HBase的核心模块,存储着数据,并响应用户的读写请求。HBase本身不进行数据复制、维护副本等,由HDFS支持。HBase也可以不使用HDFS。

4.5.2 Region服务器的工作原理

如上图所示:① Region集群包括若干个Region服务器,② 一个Region服务器有若干个Region和一个HLog文件,③ 每个Region有若干个Store(一个Store即是一个列族),④ 每个Store有若干个StoreFile(在磁盘中)和一个MemStore(在内存中),⑤ StoreFile对应于HDFS中的HFile。

1. 读写数据

1)写数据:相应的Region服务器先把数据写到MemStore和HLog里;

2)读数据:Region服务器先去MemStore找,如果不在缓存中,再去磁盘的StoreFile里找。

2. 缓存刷新

1)MemStore:系统周期性调用Region.flushcache()把MemStore内容写到StoreFile里,并把相应操作记录到HLog里。

2)HLog:Region服务器每次启动时会检查HLog,确认最后一次Region.flushcache()后是否有新的写入记录,如果有,则写到MemStore中,再刷到StoreFile中。最后删除旧的HLog文件。

3. StoreFile合并

在磁盘中的StoreFile数量达到一个阈值时,系统调用Store.compact()把多个StoreFile合并成一个大文件,以减少查询时间。

4.5.3 Store的工作原理

1)MemStore是排序的内存缓冲区;

2)周期性刷到StoreFile中;

3)StoreFile合并;

4)当单个StoreFile文件大小超过一定阈值(只可能出现在某次合并后)时,重新分裂成两个StoreFile。注意:此时原有的Region分裂成两个,父Region下线,两个新的子Region被Master分配到相应的Region服务器上。

4.5.4 HLog的工作原理

1)预写入:MemStore中的数据对应的日志已被写入磁盘后,才会刷到StoreFile里。

2)Region服务器故障处理:① Zookeeper监测到,并通知给Master,② Matser找到该服务器上的HLog文件,把记录的数据根据所属的Region对象进行拆分,③ 把拆分后的HLog分发到可用的Region服务器上,Region服务器根据HLog完成数据恢复操作

3)为什么一个Region服务器不同的Region共用一个HLog:减少磁盘寻址次数,提高对表的写操作性能。

4.6 HBase应用

4.6.1 性能优化方法

1)行键:行键按字典序存储,把行键设置成时间戳等,可把时间相近得数据存储的也相近

2)InMemory:设置为True,把表放到缓存中

3)Max Version:最大版本数不用设置太高,若只需最新的设置为1就行了

4)Time To Live:设置数据的存储生命周期,到期自动清空

4.6.2 性能监视

自带的Master-status:以Web方式显示监控集群状态

Open TSDB:略

Ambari:创建、管理、监视Hadoop集群

4.6.3 在HBase上构建SQL引擎

目的:易用、减少编码量。

方案:1)Hive、2)Phoenix等

4.6.4 HBase的二级索引

4.7 HBase编程实践

4.7.1 HBase Shell

注意HBase终究是数据库,所以HBase Shell的大部分命令都是类似于MySQL语言的操作,包括建表、列出表信息、插数、查数、浏览表、修改列、统计行数、删除数据、删除表、等等。除此之外还有少量的关闭HBase集群、检查集群状态的命令

4.7.2 HBase的Java API

略,回头细学。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335