分布式数据库 HBase

原文地址:http://www.oschina.net/p/hbase/

HBase 概念

HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。

HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据;Google Bigtable利用 Chubby作为协同服务,HBase利用Zookeeper作为对应。

    

上图描述了Hadoop EcoSystem中的各层系统,其中HBase位于结构化存储层,Hadoop HDFS为HBase提供了高可靠性的底层存储支持,Hadoop MapReduce为HBase提供了高性能的计算能力,Zookeeper为HBase提供了稳定服务和failover机制。

此外,Pig和Hive还为HBase提供了高层语言支持,使得在HBase上进行数据统计处理变的非常简单。 Sqoop则为HBase提供了方便的RDBMS数据导入功能,使得传统数据库数据向HBase中迁移变的非常方便。

HBase 访问接口

1.       Native Java API,最常规和高效的访问方式,适合Hadoop MapReduce Job并行批处理HBase表数据

2.       HBase Shell,HBase的命令行工具,最简单的接口,适合HBase管理使用

3.       Thrift Gateway,利用Thrift序列化技术,支持C++,PHP,Python等多种语言,适合其他异构系统在线访问HBase表数据

4.       REST Gateway,支持REST 风格的Http API访问HBase, 解除了语言限制

5.       Pig,可以使用Pig Latin流式编程语言来操作HBase中的数据,和Hive类似,本质最终也是编译成MapReduce Job来处理HBase表数据,适合做数据统计

6.       Hive,当前Hive的Release版本尚没有加入对HBase的支持,但在下一个版本Hive 0.7.0中将会支持HBase,可以使用类似SQL语言来访问HBase

HBase 数据模型

Table & Column Family

Row KeyTimestampColumn Family
URIParser
r1t3url=http://www.taobao.comtitle=天天特价
t2host=taobao.com 
t1  
r2t5url=http://www.alibaba.comcontent=每天…
t4host=alibaba.com 

 

 

 

 

 

 

Ø  Row Key: 行键,Table的主键,Table中的记录按照Row Key排序

Ø  Timestamp: 时间戳,每次数据操作对应的时间戳,可以看作是数据的version number

Ø  Column Family:列簇,Table在水平方向有一个或者多个Column Family组成,一个Column Family中可以由任意多个Column组成,即Column Family支持动态扩展,无需预先定义Column的数量以及类型,所有Column均以二进制格式存储,用户需要自行进行类型转换。

Table & Region

当Table随着记录数不断增加而变大后,会逐渐分裂成多份splits,成为regions,一个region由[startkey,endkey)表示,不同的region会被Master分配给相应的RegionServer进行管理:

     

-ROOT- && .META. Table

HBase中有两张特殊的Table,-ROOT-和.META.

Ø  .META.:记录了用户表的Region信息,.META.可以有多个regoin

Ø  -ROOT-:记录了.META.表的Region信息,-ROOT-只有一个region

Ø  Zookeeper中记录了-ROOT-表的location

    

MapReduce on HBase

在HBase系统上运行批处理运算,最方便和实用的模型依然是MapReduce,如下图:

     

HBase Table和Region的关系,比较类似HDFS File和Block的关系,HBase提供了配套的TableInputFormat和TableOutputFormat API,可以方便的将HBase Table作为Hadoop MapReduce的Source和Sink,对于MapReduce Job应用开发人员来说,基本不需要关注HBase系统自身的细节。

HBase系统架构图

    

Client

HBase Client使用HBase的RPC机制与HMaster和HRegionServer进行通信。对于管理类操作,Client与HMaster进行RPC通信;对于数据读写类操作,Client与HRegionServer进行RPC通信。

Zookeeper

Zookeeper Quorum中除了存储了-ROOT-表的地址和HMaster的地址,HRegionServer也会把自己以Ephemeral方式注册到 Zookeeper 中,使得 HMaster 可以随时感知到各个HRegionServer的健康状态。此外,Zookeeper也避免了HMaster的单点问题。

HMaster 

HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Selection机制保证总有一个Master运行,HMaster在功能上主要负责Table和Region的管理工作:

1.       管理用户对Table的增、删、改、查操作

2.       管理 HRegionServer 的负载均衡,调整 Region 分布

3.       在 Region Split 后,负责新 Region 的分配

4.       在 HRegionServer 停机后,负责失效 HRegionServer 上的Regions迁移

HRegionServer

HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。

    

HRegionServer内部管理了一系列HRegion对象,每个HRegion对应了Table中的一个Region,HRegion中由多 个HStore组成。每个HStore对应了Table中的一个Column Family的存储,可以看出每个Column Family其实就是一个集中的存储单元,因此最好将具备共同IO特性的column放在一个Column Family中,这样最高效。

HStore存储是HBase存储的核心了,其中由两部分组成,一部分是MemStore,一部分是StoreFiles。MemStore是 Sorted Memory Buffer,用户写入的数据首先会放入MemStore,当MemStore满了以后会Flush成一个StoreFile(底层实现是HFile), 当StoreFile文件数量增长到一定阈值,会触发Compact合并操作,将多个StoreFiles合并成一个StoreFile,合并过程中会进 行版本合并和数据删除,因此可以看出HBase其实只有增加数据,所有的更新和删除操作都是在后续的compact过程中进行的,这使得用户的写操作只要 进入内存中就可以立即返回,保证了HBase I/O的高性能。当StoreFiles Compact后,会逐步形成越来越大的StoreFile,当单个StoreFile大小超过一定阈值后,会触发Split操作,同时把当前 Region Split成2个Region,父Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer 上,使得原先1个Region的压力得以分流到2个Region上。下图描述了Compaction和Split的过程:

    

在理解了上述HStore的基本原理后,还必须了解一下HLog的功能,因为上述的HStore在系统正常工作的前提下是没有问题的,但是在分布式 系统环境中,无法避免系统出错或者宕机,因此一旦HRegionServer意外退出,MemStore中的内存数据将会丢失,这就需要引入HLog了。 每个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中(HLog文件格式见后续),HLog文件定期会滚动出新的,并 删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知 到,HMaster首先会处理遗留的 HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应region的目录下,然后再将失效的region重新分配,领取 到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。

HBase存储格式

HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,主要包括上述提出的两种文件类型:

1.       HFile, HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile

2.       HLog File,HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File

HFile

下图是HFile的存储格式:

    

首先HFile文件是不定长的,长度固定的只有其中的两块:Trailer和FileInfo。正如图中所示的,Trailer中有指针指向其他数 据块的起始点。File Info中记录了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等。Data Index和Meta Index块记录了每个Data块和Meta块的起始点。

Data Block是HBase I/O的基本单元,为了提高效率,HRegionServer中有基于LRU的Block Cache机制。每个Data块的大小可以在创建一个Table的时候通过参数指定,大号的Block有利于顺序Scan,小号Block利于随机查询。 每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成, Magic内容就是一些随机数字,目的是防止数据损坏。后面会详细介绍每个KeyValue对的内部构造。

HFile里面的每个KeyValue对就是一个简单的byte数组。但是这个byte数组里面包含了很多项,并且有固定的结构。我们来看看里面的具体结构:

    

开始是两个固定长度的数值,分别表示Key的长度和Value的长度。紧接着是Key,开始是固定长度的数值,表示RowKey的长度,紧接着是 RowKey,然后是固定长度的数值,表示Family的长度,然后是Family,接着是Qualifier,然后是两个固定长度的数值,表示Time Stamp和Key Type(Put/Delete)。Value部分没有这么复杂的结构,就是纯粹的二进制数据了。

HLogFile

    

上图中示意了HLog文件的结构,其实HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是“写入时间”,sequence number的起始值为0,或者是最近一次存入文件系统中sequence number。

HLog Sequece File的Value是HBase的KeyValue对象,即对应HFile中的KeyValue,可参见上文描述。

ZOOM 云视频会议网站:http://www.zoomonline.cn/

 

转载于:https://www.cnblogs.com/gw811/p/4634355.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记(15):Python网络编程并发编程-进程理论

立即学习:https://edu.csdn.net/course/play/24458/296423?utm_sourceblogtoedu 1.进程:正在运行的一个过程或者一个任务; 2.进程与程序的区别:程序是一堆代码,程序运行起来就是进程了,一个程序运行两次,算…

【翻译】Designing Websites for iPhone X

让网站适配 iphone X 英文原文地址:https://webkit.org/blog/7929/...本文原文地址:https://github.com/cnsnake11/... The section below about safe area insets was updated on Oct 31, 2017 to reflect changes in the iOS 11.2 beta. 以下关于safe …

指针作为函数参数引用数组的任意元素

void swap(int *a,int*b) {*a*a^*b;*b*a^*b;*a*a^*b; } swap(data[j],data[j1]); int data[10]{13,55,48,13,62,45,754,0,10};以上是我遇到的问题,我觉得调用这个swap函数是不能这样直接把数组的某个元素直接丢给swap数据 在程序中参加数据处理的量不是指…

使用 Log4Net 记录日志

第一步:下载Log4Net 下载地址:http://logging.apache.org/log4net/download_log4net.cgi 把下载的 log4net-1.2.11-bin-newkey解压后,如下图所示: 双击bin文件夹 双击net文件夹,选择针对.NET FramerWork的不同版本 找…

Xcode常用快捷键

1. 文件CMD N: 新文件CMD SHIFT N: 新项目CMD O: 打开CMD S: 保存CMDOPtS:保存所有文件CMD SHIFT S: 另存为CMD W: 关闭窗口CMD Q :退出XcodeCMD SHIFT W: 关闭文件2. 编辑CMD [: 左缩进CMD ]: 右缩进CMDshiftF:项目中查找CMDG:查找下一个CMDshiftG:查…

学习笔记(16):Python网络编程并发编程-开启子进程的两种方式

立即学习:https://edu.csdn.net/course/play/24458/296424?utm_sourceblogtoedu #方式一:使用python内置模块multiprocessing下的process类 from multiprocessing import Process import time#定义进程函数 def task(name):print(%s is running!%name)t…

ElasticSearch的API python调用

os json datetime datetime django.http HttpResponse reelasticsearch Elasticsearches Elasticsearch([])res8 es.search({:{:{:{::}}}} ) statistic():():hit res8[][]:a (%hit %hit[])a re.split(a);arow a:id row[] row[]idHttpResponse(a)转载于:https://blog.51cto…

HDU 1757 A Simple Math Problem (矩阵快速幂)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1757 在吴神的帮助下才明白如何构造矩阵&#xff0c;还是好弱啊。 此处盗一张图 1 #include <iostream>2 #include <cstdio>3 #include <cstring>4 #include <cmath>5 #include <al…

Spring学习使用标签来标记资源(@Component、@Repository、 @Service和@Controller)和用法(包括如何jsp正在使用)...

首先&#xff0c;在xml其中新增部分标有下划线的文件&#xff0c;容器初始化的时候需要扫描包 注意&#xff1a; a. 包款扫描(下划线部分)一定要加&#xff0c;默认是不扫描整个包。与每一包之间’&#xff0c;’开。如过具有同样的父包&#xff0c;那么我们能够用父包来取…

python 判断字符串时是否是json格式方法

在实际工作中&#xff0c;有时候需要对判断字符串是否为合法的json格式 解决方法使用json.loads,这样更加符合‘Pythonic’写法 代码示例&#xff1a; Python import json def is_json(myjson):try:json_object json.loads(myjson)except ValueError, e:return Falsereturn Tr…

学习笔记(17):Python网络编程并发编程-Process对象的其他属性或方法

立即学习:https://edu.csdn.net/course/play/24458/296427?utm_sourceblogtoedu 1.pid与ppid&#xff1a;pid进程编码&#xff0c;ppid进程的父进程编码&#xff1b;os.getpid()查看正在运行的进程编码&#xff0c;os.getppid()查看正在运行进程的父进程编码 2.僵尸进程&…

用弦截法求一元三次方程的根x^3-5x^2+16x-80=0 ;带注释!

//用弦截法求一元三次方程的根x^3-5x^216x-800 #include<stdio.h>#include<math.h> float f(float x) //定义子函数f(x) x^3-5x^216x-80&#xff0c;当f(x) →0时&#xff0c;则x即为所求的实数根&#xff1b; { float y; y((x-5.0)*x16.0)*x-80.0; …

两个很有用的进程间通信函数popen,pclose

两个很有用的进程间通信函数popen,pclose 今天起的比较晚&#xff0c;然后来了也不想复习&#xff0c;还是看书学习--写代码--写博客有意思&#xff0c;不敢说有多精通&#xff0c;至少每天都在学习新知识&#xff0c;不求立刻完全消化&#xff0c;但求每天有进步。 现在就看看…

c++中指针箭头的用法

1、c中指针用箭头来引用类或者结构体的成员&#xff0c;箭头操作符“->”用来引用指针对象。这是是用于类&#xff0c;或者是结构体的指针变量用的。 如struct Point {int x,y;};Point *ptnew Point;pt->x1; 举例子说明一下&#xff1a;比如&#xff0c;我有一个对象dark…

化零为整WCF(14) - 事务(Transaction)

[索引页][源码下载] 化零为整WCF(14) - 事务(Transaction)作者&#xff1a;webabcd介绍WCF(Windows Communication Foundation) - 事务(Transaction)&#xff1a; 对契约方法使用TransactionFlowAttribute声明&#xff08;设置TransactionFlowOption参数&#xff09;&#x…

有限元分析笔记01-平面应力和平面应变

https://www.zhihu.com/question/30439292 http://blog.sina.cn/dpool/blog/s/blog_c4c804690102vqqs.html plate stress plate strain

MQTT-SN协议乱翻之实现要点

前言 本篇是MQTT-SN 1.2协议最后一篇翻译了&#xff0c;主要涉及实现要点&#xff0c;很简短。 需要支持QoS 值为 -1 QoS虽默认设置有0,1,2三个值&#xff0c;但还有一种情况其值为-1。来自客户端的PUBLISH消息中若QoS为-1的情况下&#xff0c;此刻客户端不会关心和网关有没有建…

oracle-REDO日志文件分析(insert)

1:记录当前scnselect dbms_flashback.get_system_change_number from dual;GET_SYSTEM_CHANGE_NUMBER------------------------11595722:创建表CREATE TABLE team (team_code VARCHAR2(3),team_name VARCHAR2(30),country_code VARCHAR2(3) );INSERT INTO team VALUES (M…

删除修改bond

参考地址&#xff1a;http://www.111cn.net/sys/linux/79301.htm 四、删除bonding设备 如由于最初配置的bonding设备取名为bond0&#xff0c;而后改名为了bond1&#xff0c;造成了两个bonding设备的存在&#xff0c;现在需删除bond0 。先查看下网络设备&#xff1a; # ls /sys/…