浅析HBase:为高效的可扩展大规模分布式系统而生
什么是HBase
Apache HBase是运行在Hadoop集群上的数据库。为了实现更好的可扩展性(scalability),HBase放松了对ACID(数据库的原子性,一致性,隔离性和持久性)的要求。因此HBase并不是一个传统的关系型数据库。另外,与关系型数据库不同的是,存储在HBase中的数据也不需要遵守某种严格的集合格式,这使得HBase是用来存储结构不严格的数据的理想工具。
HBase在大数据应用的架构中应用非常广泛。但是基于其与关系型数据库迥异的设计模式,实现这些应用也与基于关系型数据库来实现非常不同。下文将会对比HBase和关系型数据库,并浅析HBase的特性。
首先我们要明白在已经存在关系型数据库的情况下,为什么产生了所谓的NoSQL/HBase这样的费关系型数据库?要解答这个问题,我们需要先了解一下关系型数据库的优势和缺点。
关系型数据库提供了标准的数据持久性模型
SQL语言是事实上的数据操作标准语言
关系型数据库内置了并发数据操作的管理机制
关系型数据库提供全面的数据操作工具
关系型数据库是长期以来数据存储的标准工具,那么我们为什么还在寻找新的数据存储方法呢?原因是现在需要存储的数据越来越多,工业界对数据存储工具可伸展性的要求也越来越高。一种简单直接的扩展方法是垂直扩展,也就是采用更大更高效的服务器来存储。但是这种方法成本很高,且可扩展性存在一个上限(单台服务器的性能是有限的)。
除垂直扩展之外,我们也可以采用水平扩展的方法。也就是用服务器集群来满足要求。用来集群的服务器可以是性能普通的服务器。这样就可以大大降低运营成本。如果我们要采用水平扩展的方法来扩展关系型数据库,关系型数据库中的数据势必要根据row key分布存储,也就意味着某些row key对应的行存储在某一台服务器上,另一些row key对应的行存储在另一台服务器上。然而,要分割一个关系型数据库是非常复杂的,并且关系型数据库不具备自动分布式存储的功能。不仅如此,分布存储关系型数据库,我们将失去总体上的数据库查询功能及事务(transaction)的一致性。总而言之,关系型数据库是为在单台服务器上运行而设计的。
除此之外,关系型数据库中数据库规范化(database normalization)的理念消除了数据的重复存储,使得数据存储更高效。在查询时为了将数据重新组织起来,就需要需要Join操作。这也进一步使得关系型数据库的分布式存储更为困难。
由于HBase在设计上不支持关系和Join这样的概念,需要一起查询的数据就被存在一起。因此也就避免了关系型数据库的一些局限性。下图表现了HBase和关系型数据库在数据存储模型上的不同。
由于HBase将所有需要一起查询到数据存储在一起这一特性,HBase集群就自然能够根据key来组织数据。在水平分割的时候,key值的范围就可以被用来分割数据。每一个服务器存储全部数据的一个子集。同时分布式的数据还可以被同时访问。这大大增强了HBase的可扩展性。HBase实际上是Google Big Table的一个实现。Big Table是Google提出的一个用来存储大规模数据的一个分布式系统。
HBase是基于Column family data store的理念设计的:每一行根据一个row key索引。也就是我们用来查询的主键。同时每一行中有若干column family。每一个column family中有若干相关的column。如下图所示。
HBase中的row key也是HBase分布式存储数据的主要根据。在分布存储数据的时候,根据row key值的范围,每一台服务器存储全部数据的一个子集。HBase提供基于行的原子性操作保证。也就是每一个row key对应的行为一个原子操作的单元。
HBase中的数据根据row key分布。row key类似于关系型数据库中的主键(primary key)。HBase中的数据记录根据row key的值排序。这是HBase数据存储的一个重要原则,也是HBase设计架构的一个重要部分。
HBase中数据表根据row key的值分割为不同的区域,每个区域包含一部分连续的行。这些区域被分配给集群中不同的称为区域服务器的数据结点。可扩展性就是通过将区域分配给集群中的不同服务器实现的。这一操作是自动进行的。也就是HBase如何根据水平扩展设计的。
下图表示了column family是如何映射到存储文件的。不同的Column family被存储在不同的文件中。这些文件可以被分别访问。
数据存储在HBase表格的cell中。cell中包含key和value以及一些其他的信息(如version, type等)。其中key部分包括row key,column family,column qualifier, timestamp。并且对于每一个值,key部分都会与其一同被存储。如下图所示。
从逻辑上来看,row似乎是以表格的形式存储的。但事实上,row是以一些cell的集合的形式存储的。其所对应的每一个cell都存储了其所对应的上述所有key信息。
下图中上半部分是HBase的数据的逻辑布局,下半部分是文件的物理布局。Column family被分别存储于不同的文件中。我们每设置一个值,其对应的cell就会存储所有的key信息(row key, column family, column qualifier, timestamp)。
综上所述,对于HBase中每一个cell的值,其完整的索引应当是Table::Row::Column family::Column::Timestamp –> Value。Hbase的表是稀疏的。如果某一列没有数据,则其不会被存储。表中的cell有其对应的连续改变的version。version默认参考timestamp,但我们也可以自己定制。对于每一个Table::Row::Column family::Column –> Value,数据库中可能存储了多个不同version的值。
Version系统是HBase自动采用的。从CRUD的角度来说,一个put操作既是插入(insert/create),也是更新(Update)操作,每一个数据都会带有其相应的version。Delete操作并不会立即在物理上删除数据,而是会给数据加一个删除标签。这个标签会保证数据不会在查询时被返回。Get操作根据给定的参数返回特定version的数据。默认情况下最新版本的数据将会被返回。保存在HBase中的同一个数据的不同version的数量也可以配置。这个数量是针对同一个column family而言的。默认情况下,HBase会保存3个不同version的数据。当数据不同的version数目超过这个数字时,最早version的数据将会被删除。
浅析HBase:为高效的可扩展大规模分布式系统而生的更多相关文章
- 浅析Thinkphp框架中运用phprpc扩展模式
浅析Thinkphp框架中应用phprpc扩展模式 这次的项目舍弃了原来使用Axis2做web服务端的 方案,改用phprpc实现,其一是服务端的thinkphp已集成有该模式接口,其二是phprpc ...
- 你的ExcelUtil简单、高效、易扩展吗
你的ExcelUtil简单.高效.易扩展吗 Author: Dorae Date: 2018年10月23日12:30:15 转载请注明出处 一.背景 最近接到了和Excel导出相关的需求,但是: 项目 ...
- 专訪阿里陶辉:大规模分布式系统、高性能server设计经验分享
http://www.csdn.net/article/2014-06-27/2820432 摘要:先后就职于在国内知名的互联网公司,眼下在阿里云弹性计算部门做架构设计与核心模块代码的编写,主要负责云 ...
- Pinpoint是一个开源的 APM (Application Performance Management/应用性能管理)工具,用于基于java的大规模分布式系统,基于Google Dapper论文
Pinpoint是一个开源的 APM (Application Performance Management/应用性能管理)工具,用于基于java的大规模分布式系统,基于Google Dapper论文 ...
- 如何扩展大规模Web网站的性能?
Reduce Data广告服务网站如何扩展到每天300K QPS请求?分享经验如下: 1. 为大规模设计,广告服务平台从一开始增长就很惊人,因此,系统开始就为大规模设计,系统为水平和垂直伸缩扩展. 2 ...
- Visual Studio高效实用的扩展工具、插件
说明: 对一个有想法的程序员来说,善于使用一款高效的开发工具是很重要的,今天给大家介绍的是宇宙第一IDE vs用起来很不错的开发工具,假如大家觉得不错也可以尝试的用用,毕竟对于我们这些一天一大半的时间 ...
- HBase海量数据高效入仓解决方案
一.方案背景 现阶段部分业务数据存储在HBase中,这部分数据体量较大,达到数十亿.大数据需要增量同步这部分业务数据到数据仓库中,进行离线分析,目前主要的同步方式是通过HBase的hive映射表来实现 ...
- php 高效日志记录扩展seaslog 的使用
群里交流,听说seaslog不错,此文旨在记录使用. $ wget https://github.com/Neeke/SeasLog/archive/master.zip $ unzip master ...
- Dapper,大规模分布式系统的跟踪系统--转
原文地址:http://bigbully.github.io/Dapper-translation/ 概述 当代的互联网的服务,通常都是用复杂的.大规模分布式集群来实现的.互联网应用构建在不同的软件模 ...
随机推荐
- compare across commits online
https://gist.github.com/nevik/5689882 Examples: https://github.com/octocat/Spoon-Knife/compare/ed122 ...
- Vue-1:鄙人是如何开始学习的
说实话,Vue这个东西早想学习她了.为啥呢?不是因为有多火热多好用多水嫩...而是每次面试都会问我,你会不会Vue...接下来就是突然安静的空气,,,真TM气人.所以鄙人在经历诸事之后决心一定要搞一下 ...
- golang(10)interface应用和复习
原文链接 http://www.limerence2017.com/2019/10/11/golang15/ interface 意义? golang 为什么要创造interface这种机制呢?我个人 ...
- Redis 分库
Redis 可以分库,相当于 MySQL 中的 database.控制数据库总数在 redis配置文件中设置,默认是 16 个.数据库名称是整数索引标识,而不是由一个数据库名称字符串. 选择数据库用 ...
- Linux中编译C文件
C/C++程序编译的过程 预处理,展开头文件,宏定义,条件编译处理等.通过gcc -E source.c -o source.i或者cpp source.c生成. 编译.这里是一个狭义的编译意义,指的 ...
- C基础知识(4):指针--p=&a和*p=a的区别详解
对于*p,[p = &a]和[*p = a]的区别详解 (1) p=&a就是用a的地址对p赋值,&p不改变,变的是p (2) *p=a就是把p所指向的那一内存空间的值赋值为a, ...
- C基础知识(2):变量&常量的定义和声明
变量定义和声明 (1) 使用int,char等类型符定义变量 使用int,char等类型符定义变量时,不管有没有指定初始值,都就已经建立了存储空间(开辟内存).内存寻址由大到小,优先分配内存地址比较大 ...
- 【知乎】github,Empty reply from server?
http://www.zhihu.com/question/26717343 问:用hexo搭了个blog,之前一直正常,最近在deploy的时候无法连接到github了. fatal: unab ...
- Jquery(DOM和选择器)
O(∩_∩)O~~~,今天简单整理了一下最近所学的Jquery知识.下面就总结一下. 首先,对于Jquery我们需要简单了解下: 1.Jquery是开放源代码的JS库, 2.Jquery操作是函数式编 ...
- Linux常用目录名称
目录 用途 / 虚拟目录的根文件,通常不会在这里存储文件 /bin 二进制目录,存放许多用户的GNU工具 /boot 启动目录,存放启动文件 /dev 设备目录,Linux在这里创建设备节点 /etc ...