浅析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/ 概述 当代的互联网的服务,通常都是用复杂的.大规模分布式集群来实现的.互联网应用构建在不同的软件模 ...
随机推荐
- lockfree buffer test
性能测试(3): 对无锁队列boost::lockfree::queue和moodycamel::ConcurrentQueue做一个性能对比测试 版权声明:本文为博主zieckey原创文章, ...
- web前端知识点反思总结
当别人问你之前的知识,我们便会勾起之前的回忆,然后进行一番痛苦的挣扎后,发现我依然记得你 什么是 DTD ? 文档类型定义 (DTD) 可定义合法的 xml 文档的构建模块 ,他是使用一系列合法的元素 ...
- JAVA向C传递数据
传递数组 数组是个对象,传递对象就是传递地址,修改地址上的值,数组的内容就会改变 //获取数组首地址 int* p = (*env)->GetIntArrayElements(env, arra ...
- flutter vscode创建objc工程
通过vscode创建flutter工程时,默认创建的是swift项目工程,如果想要修改,可以通过vscode设置默认创建语言 1. Open vscode settings. Under User S ...
- 在xcode找不到发布证书
解决方法 1.访问XCode的Preferences>Accounts,在Apple IDs里面找到你的帐号,选中后,在右侧,在Name下面会有一行描述.双击.在弹出窗口里面,有个刷新按钮,点击 ...
- Linux 部署 Django 系统
一:安装uwsgi pip3 install uwsgi 二:进入项目目录下,创建uwsgi.ini配置文件 [uwsgi] # 使用nginx连接时使用功能,上线时才使用socket,指定项目执行的 ...
- yum安装epel源
国内yum源的安装(163,阿里云,epel) 国内yum源的安装(163,阿里云,epel) ----阿里云镜像源 1.备份 mv /etc/yum.repos.d/CentOS-Base.re ...
- C基础知识(4):指针--p=&a和*p=a的区别详解
对于*p,[p = &a]和[*p = a]的区别详解 (1) p=&a就是用a的地址对p赋值,&p不改变,变的是p (2) *p=a就是把p所指向的那一内存空间的值赋值为a, ...
- springboot后端实现条件查询,要配合使用mybatis
package cn.com.dyg.work.sqlgen; import cn.com.dyg.work.common.exception.DefException; import cn.com. ...
- 数据测试003:利用Jmeter推送测试数据(下)
数据测试003:利用Jmeter推送测试数据(中) 今天继续学习用Jmeter推送数据,这次换Oracle数据 1)安装jdbc驱动,对应自己数据库安装的版本,我的是11g的,安装目录是在Jmeter ...