3.1.1,为什么选用HBases

a)      容量巨大

HBase 的单表可以有百亿行、百万列,数据矩阵横向和纵向两个维度所支持的数据量级

都非常具有弹性。传统的关系型数据库,如 Oracle 和 MySQL 等,如果数据记录在亿级别,

查询和写入的性能都会呈指数级下降,所以更大的数据量级对传统数据库来讲是一种灾难。

而 HBase 对于存储百亿、千亿甚至更多的数据都不存在任何问题。对于高维数据,百万量级的列没有任何问题。

b)     面向列

HBase 是面向列的存储和权限控制,并支持列独立检索。有些读者可能不清楚什么是列

式存储,下面进行简单介绍。列式存储不同于传统的关系型数据库,其数据在表中是按某列

存储的,这样在查询只需要少数几个字段的时候,能大大减少读取的数据量,比如一个字段

的数据聚集存储,那就更容易为这种聚集存储设计更好的压缩和解压算法。下面是传统行式

数据库与列式数据库的不同特性。

传统行式数据库的特性如下:

‰ 数据是按行存储的。

‰ 没有索引的查询使用大量 I/O。

‰ 建立索引和物化视图需要花费大量的时间和资源。

‰ 面对查询需求,数据库必须被大量膨胀才能满足需求。

列式数据库的特性如下:

‰ 数据按列存储,即每一列单独存放。

‰ 数据即索引。

‰ 只访问查询涉及的列,可以大量降低系统 I/O。

‰ 每一列由一个线索来处理,即查询的并发处理性能高。

‰ 数据类型一致,数据特征相似,可以高效压缩。

列式存储不但解决了数据稀疏性问题,最大程度上节省存储开销,而且在查询发生时,仅

检索查询涉及的列,能够大量降低磁盘 I/O。这些特性也支撑 HBase 能够保证一定的读写性能。

c)      稀疏性

在大多数情况下,采用传统行式存储的数据往往是稀疏的,即存在大量为空(NULL)的

列,而这些列都是占用存储空间的,这就造成存储空间的浪费。对于 HBase 来讲,为空的列并不占用存储空间,因此,表可以设计得非常稀疏。

d)     扩展性

HBase 底层文件存储依赖 HDFS,从“基因”上决定了其具备可扩展性。这种遗传的可

扩展性就如同 OOP 中的继承,“父类”HDFS 的扩展性遗传到 HBase 框架中。这是最底层的关键点。同时,HBase 的 Region 和 RegionServer 的概念对应的数据可以分区,分区后数据可以位于不同的机器上,所以在 HBase 核心架构层面也具备可扩展性。HBase 的扩展性是热扩展,在不停止现有服务的前提下,可以随时添加或者减少节点。

e)     高可靠性

HBase 提供 WAL 和 Replication机制。前者保证了数据写入时不会因集群异常而导致

写入数据的丢失;后者保证了在集群出现严重问题时,数据不会发生丢失或者损坏。而且

HBase 底层使用 HDFS,HDFS 本身的副本机制很大程度上保证了 HBase 的高可靠性。同时,

协调服务的 ZooKeeper 组件是经过工业验证的,具备高可用性和高可靠性。

f)       高性能

底层的 LSM 数据结构和 Rowkey 有序排列等架构上的独特设计,使得 HBase 具备非常高的写入性能。Region 切分、主键索引和缓存机制使得 HBase 在海量数据下具备一定的随机读取性能,该性能针对 Rowkey 的查询能够达到毫秒级别。同时,HBase 对于高并发的场景也具备很好的适应能力。该特性也是业界众多公司选取 HBase 作为存储数据库非常重要的一点。

3.1.2,不足之处

1)     低延时访问

HDFS不太适合于那些要求低延时(数十毫秒)访问的应用程序,因为HDFS是设计用于大吞吐量数据的,这是以一定延时为代价的。HDFS是单Master的,所有的对文件的请求都要经过它,当请求多时,肯定会有延时。当前,对于那些有低延时要求的应用程序,HBase是一个更好的选择。现在HBase的版本是0.20,相对于以前的版本,在性能上有了很大的提升,它的口号就是goes real time。

使用缓存或多master设计可以降低client的数据请求压力,以减少延时。还有就是对HDFS系统内部的修改,这就得权衡大吞吐量与低延时了,HDFS不是万能的银弹。

2)     大量小文件

因为Namenode把文件系统的元数据放置在内存中,所以文件系统所能容纳的文件数目是由Namenode的内存大小来决定。一般来说,每一个文件、文件夹和Block需要占据150字节左右的空间,所以,如果你有100万个文件,每一个占据一个Block,你就至少需要300MB内存。当前来说,数百万的文件还是可行的,当扩展到数十亿时,对于当前的硬件水平来说就没法实现了。还有一个问题就是,因为Map task的数量是由splits来决定的,所以用MR处理大量的小文件时,就会产生过多的Maptask,线程管理开销将会增加作业时间。举个例子,处理10000M的文件,若每个split为1M,那就会有10000个Maptasks,会有很大的线程开销;若每个split为100M,则只有100个Maptasks,每个Maptask将会有更多的事情做,而线程的管理开销也将减小很多。

要想让HDFS能处理好小文件,有不少方法:

1、利用SequenceFile、MapFile、Har等方式归档小文件,这个方法的原理就是把小文件归档起来管理,HBase就是基于此的。对于这种方法,如果想找回原来的小文件内容,那就必须得知道与归档文件的映射关系。

2、横向扩展,一个Hadoop集群能管理的小文件有限,那就把几个Hadoop集群拖在一个虚拟服务器后面,形成一个大的Hadoop集群。google也是这么干过的。

3、多Master设计,这个作用显而易见了。正在研发中的GFS II也要改为分布式多Master设计,还支持Master的Failover,而且Block大小改为1M,有意要调优处理小文件啊。

附带个Alibaba DFS的设计,也是多Master设计,它把Metadata的映射存储和管理分开了,由多个Metadata存储节点和一个查询Master节点组成。

3)     多用户写,任意文件修改

目前Hadoop只支持单用户写,不支持并发多用户写。可以使用Append操作在文件的末尾添加数据,但不支持在文件的任意位置进行修改。这些特性可能会在将来的版本中加入,但是这些特性的加入将会降低Hadoop的效率,就拿GFS来说吧,这篇文章里就说了google自己的人都用着Multiple Writers很不爽。

利用Chubby、ZooKeeper之类的分布式协调服务来解决一致性问题。

Why HBase的更多相关文章

  1. Mapreduce的文件和hbase共同输入

    Mapreduce的文件和hbase共同输入 package duogemap;   import java.io.IOException;   import org.apache.hadoop.co ...

  2. Redis/HBase/Tair比较

    KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式    支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...

  3. Hbase的伪分布式安装

    Hbase安装模式介绍 单机模式 1> Hbase不使用HDFS,仅使用本地文件系统 2> ZooKeeper与Hbase运行在同一个JVM中 分布式模式– 伪分布式模式1> 所有进 ...

  4. Spark踩坑记——数据库(Hbase+Mysql)

    [TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...

  5. Spark读写Hbase的二种方式对比

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 一.传统方式 这种方式就是常用的TableInputFormat和TableOutputForm ...

  6. 深入学习HBase架构原理

    HBase定义 HBase 是一个高可靠.高性能.面向列.可伸缩的分布式存储系统,利用Hbase技术可在廉价PC Server上搭建 大规模结构化存储集群. HBase 是Google Bigtabl ...

  7. hbase协处理器编码实例

    Observer协处理器通常在一个特定的事件(诸如Get或Put)之前或之后发生,相当于RDBMS中的触发器.Endpoint协处理器则类似于RDBMS中的存储过程,因为它可以让你在RegionSer ...

  8. hbase集群安装与部署

    1.相关环境 centos7 hadoop2.6.5 zookeeper3.4.9 jdk1.8 hbase1.2.4 本篇文章仅涉及hbase集群的搭建,关于hadoop与zookeeper的相关部 ...

  9. 从零自学Hadoop(22):HBase协处理器

    阅读目录 序 介绍 Observer操作 示例下载 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,Sour ...

  10. Hbase安装和错误

    集群规划情况: djt1 active Hmaster djt2 standby Hmaster djt3 HRegionServer 搭建步骤: 第一步:配置conf/regionservers d ...

随机推荐

  1. Hadoop 解除 NameNode is in safe mode

    运行Hadoop程序时,有时候会报以下错误: org.apache.hadoop.dfs.SafeModeException: Cannot delete /user/hadoop/input. Na ...

  2. PAT——1043. 输出PATest

    给定一个长度不超过10000的.仅由英文字母构成的字符串.请将字符重新调整顺序,按“PATestPATest....”这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种字符已 ...

  3. C 标准库 中 操作 字符串 的 代码

    1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度 ...

  4. LeetCode36.有效的数独 JavaScript

    判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔的 ...

  5. 如何使用tomcat,使用域名直接访问javaweb项目首页

    准备工作: 1:一台虚拟机 2:配置好jdk,将tomcat上传到服务器并解压 3:将项目上传到tomcat的webaap目录下 4:配置tomcat的conf目录下的server.xml文件 确保8 ...

  6. iOS 数据安全、数据加密传输

    近期接到一个新需求:APP企业版需要接入热更新功能. 热更新需要下发补丁脚本, 脚本下发过程中需要保证脚本传输安全,且需要避免中间人攻击. 需要用到数据加密传输方面的知识,以下是我设计的加密解密流程: ...

  7. iOS:图片相关(18-02-12更)

    1.图片显示相关 1).图片聊天背景拉伸不失真 2).捏合.双击.下拉缩放 3).Banner.相册 4).动画 2.图片操作相关 1).获取.下载图片(分享.传图片用) 2).保存UIImage到本 ...

  8. oracle10g学习笔记

    1.简介 1.1.sql:Structured Query Language 结构化查询语言 1.2.windows在目录路径中使用反斜线\,unix和linux使用正斜线/ 1.3.Number(a ...

  9. 14JavaScript条件语句

    条件语句用于基于不同的条件来执行不同的动作. 1.条件语句 通常在写代码时,您总是需要为不同的决定来执行不同的动作.您可以在代码中使用条件语句来完成该任务. 在 JavaScript 中,我们可使用以 ...

  10. ps基本认识

    近来中意ui方面学习,从视频中总结了些许notses,希望能够帮到共同喜欢(❤ ω ❤)的友友 ·基础了解 位图:由像素组成的图片,把位图无限放大以后看到很多小方格,一个方格代表一个像素 矢量图:放大 ...