【HBase】分布式储存系统

什么是HBase?

    HBase是一个高可靠性、高性能、可伸缩的分布式存储系统:
• 一个构建在HDFS上的分布式NoSQL数据库;
• 基于Google BigTable模型开发的,典型的key/value系统;
• 具有松散的表结构;原生海量数据分布式存储;支持随机查询、范围查询
• 高吞吐,低延迟;
• 列存储,多版本,增量导入,多维删除

HDFS 与 HBase

    Hdfs是一个分布式文件系统,适合储存大文件;不支持单个记录快速查找;适合高延迟的批处理;是对数据的顺序访问。HBase是基于hdfs的,适合大表快速查询,且能够对单个记录实现快熟查询的;在内部使用hash表提供文件形式储存数据,用于快熟查找。 HBase上的数据是以StoreFile(HFile)二进制流的形式存储在HDFS上block块中。HDFS并不知道的hbase存的是什么,它只把存储文件视为二进制文件,也就 是说,hbase的存储数据对于HDFS文件系统是透明的。
可以提炼出hbase具有这些特性:
1.大:一个表可以有数十亿行,上百万列;
2.无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列;
3.面向列:面向列(族)的存储和权限控制,列(族)独立检索;
4.稀疏、多维、排序的map:空(nul) 列并不占用存储空间,表可以设计的非常稀疏:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳:
5.数据类型单- -: Hbase中 的数据都是字符串,没有类型。
6.强一致性读写:HBase不是“最终一致性”数据存储。这让它很适合高速7.计数聚合类任务:自动分片(Automatic sharding): HBase 表通过region 分布在集群中。数据增长时,region会自动分割并重新分布;
8.RegionServer自动故障转移和负载均衡;
9.Hadoop/HDFS集成: HBase 文持开箱即用地支持HDFS作为它的分布式文件系统:
10.MapReduce: HBase 通过MapReduce 支持大并发处理;
11.实时、随机地大数据访问: HBase内 部使用lsM-tellog-structured merge tree)作为数据存储架构,LSM-tree周 期性地合并小文件到较大的文件,以减少硬盘寻址Java客户端API:HBase支持易于使用的JavaAPI进行编程访问;
12.Thrift/REST API: HBase 也支持Thrift和REST作为非Java前端的访问;
13.Block Cache和Bloom Filter:对于大容量查询优化,HBase 支持Block Cache和Bloom Filter
14.快照支持

    根据HBase的特性,可以推测其应用场景:
    首先,确信有足够多数据,如果有上亿或上千亿行数据,HBase 是很好的备选,可在大数据上高并发操作,比如每秒对PB级数据进行上千次操作(如果只有上千或上百万行,则用传统的RDBMS可能是更好的选择)需要对数据进行随机读操作或者随机写操作;
HBase能够为大数据提供实时的读/写操作,但是根据实际情况来看,HBase在实时的数据写入性能上优于查询性能。
    其次,确信可以不依赖所有RDBMS的额外特性(例如,列数据类型、第二索引、事务、高级查询语言等)
    第三,确信有足够的硬件。因为HDFS在小于5个数据节点时,基本上体现不出它的优势。

HBase的数据模型

在HBase中, 数据存储在表中,表具有行(row)和列(column):
在这里插入图片描述
在这里插入图片描述
     在HBase中,列值所在的位置,称为cell(单元格) : cell内的每个值可由rowkey+column family+column key+timestamp联合表示 ; 每个cell可能有多个版本的数据,按时间戳区分。
在这里插入图片描述
    在HBase中,记录以key-value对的形式存储在HFile文件中: HFile是作为二进制文件存储的;来自单个列族的记录可能会被split到多个HFile中,但是单个的HFile不可 能包含来自多个列族的数据 ; 当MemStore中的数据被flush到磁盘中时,就创建HFile文件。在这里插入图片描述
    HBase的核心数据结构就是 map: map 就是 key-value 对集合;HBase中的 map 是按字母顺序严格排序的,也就是说,按照 row key(行键)以 字母顺序排序 ;可将HBase中的表视为Key-Value表 ; Key: 行键+列族+列+时间戳 ;Value: 数据值 ;可以将HBase表看作是一个多维的map。
    命名空间(namespace)是逻辑上的一组表,等同于RDBMS中的数据库;命名空间的操纵有创建、删除和修改 ;有两个专门的预定义命名空间: hbase - 系统命名空间, 用来包含HBase内部表 、default - 没有显式指定命名空间的表会位于这个namespace 。
    表(table) 是多个 row 组成 。
    行(row) ,每一 个row代表着一个数据对象,由一个 row key(行键)和一或多个具有值的 column 组成,
    RowKey(行键)是表中每个数据对象的唯一标识,是Byte array,按字母顺序排序,即 row 也是按 照这个顺序来进行存储的;Rowkey的设计非常重要,一个重要的原则是:相关的 row 要存储在接近的位置 ;与 NoSQL 数据库一样,Row Key 是用来检索记录的主键。
    Column Family(列族):column family 是一些 column 的集合.每个column family有着一系列属性;表中的每一row都有相同的column family;访问控制、磁盘和内存的使用统计都是在列族层面进行的;column family 必须在 table 建立的时候声明。
    Column Qualifier(列限定符): 在column family中加入column qualifier是为了向给定的数据提供索引; column family 中的数据通过 column qualifier 来进行映射; column qualifier 也没有特定的数据类型,以二进制字节来存储; column family 和 column qualifier 组成列(column),由冒号(:)分隔,列(column) 随时可以新建。
     Cell(单元格): Cell 是由{row key,column family:column qualifier, version}元组唯一确定的单元; Cell 中的数据是没有类型的,全部是字节码形式存储。
     版本(Version): 每个value都会有一个 timestamp,作为该value特定版本的标识符; 默认情况下,timestamp 代表数据被写入 RegionServer 的时间; row和column以字节(byte)存储,而version则是一个长整数 ;HBase version维度以降序存储, 因此,当从store file中读取时,最近的 值首先被读取。
    指定存储的版本数量 : 在表创建时指定一个给定列的存储版本的最大数量,或者通过alter命令修改; 在HBase 0.96之前,默认的版本数量是3,但是从0.96起,这个默认值改为了1。 例:修改一个Column Family的版本的最大数量为5 hbase> alter ‘t1’, NAME => ‘f1’, VERSIONS => 5 ; 还可以修改每个column family存储的版本的最小数量。默认是0,意味着这个 特性被禁用。 例:修改一个Column Family的版本的最小数量 hbase> alter ‘t1’, NAME => ‘f1’, MIN_VERSIONS => 2; 从HBase 0.98.2开始,可以指定一个全局的默认最大版本数量,用于所有新 创建的表: 在hbase-site.xml中指定hbase.column.max.version参数值。
    有四个主要的数据模型操作: Get, Put, Scan, Delete。 get: 返回一个指定行的属性 ; put:向表添加新的行(如果key是新的)或者更新已经存在的行(如果 key已经存在); scan:扫描整个表; delete:从表中删除指定的行。
    访问 HBase table 中的行,只有三种方式:通过单个 Row Key 访问 ; 通过 Row Key 的 range 全表扫描 ; Row Key 可以是任意字符串(最大长度是64KB,实际应用中长度一般 为 10 ~ 100bytes),在HBase 内部,Row Key 保存为字节数组。
    查询: 在查询中不指定时间,返回的将是最近的一个时间的版本;如果给出 timestamp,返回的将是早于这个时间的数值。
    更新和删除操作, 更新:将修改后的数据以新版本的形式插入到表中;删除:将欲删除的数据以新版本的形式插入表中,并做删除标记。 在major compaction时被清除; HBase在进行数据存储的时候,新的数据并不会直接覆盖旧的数据, 而是通过追加的形式呈现,并通过时间戳进行区分取值; 可以简单的把HBase理解为一个很大的HashTable,Key-Value形式就是 其存储结构,当使用put操作的时候,如果RowKey不存在就是添加, 反之就是更新。
    Table 在行的方向上分割为多个HRegion,每个HRegion分散在不同 的RegionServer中。每个HRegion由多个Store构成,每个Store由一个memStore和0或多 个StoreFile组成,每个Store保存一个Columns Family。

HBase的架构

    主-从(Master/Slave)架构,由以下类型节点组成: HMaster节点:RegionServer节点、ZooKeeper集群。HMaster和NameNode都支持多个热备份,使用ZooKeeper来做协调 ;ZooKeeper一般由三台机器组成一个集群,内部使用PAXOS算法,可以支持同时少于半数的宕机。
    HMaster: 监控RegionServers ; 处理RegionServers的故障转移 ; 处理元数据的变化 ; 分配regions/解除regions分配; 接口的所有元数据变化 ; 在空闲时间执行重新加载平衡 ; 它将它的位置发布给使用使用ZooKeeper的客户端 ; HMaster Web UI提供所有与HBase集群有关的信息(表,regions,RegionServerst等)。
    HRegionServer: 服务于分配给它的regions(表);处理客户端的读/写请求; 将缓存刷新(flush)到HDFS; 维护WAL预写日志(Write-Ahead logs); 执行compactions ; 负责处理region split(拆分region)。
    **ZooKeeper:**协调者,为HBase集群提供协调服务 ;它存放整个HBase集群的元数据以及集群的状态信息 ; 它存储HMaster的地址,并存储HBase中表的设计模式; 它实时管理着HMaster和HRegionServer的状态,并且会在它们宕机时通知给 HMaster,从而HMaster可以实现HMaster之间的failover,或对宕机的HRegionServer中的HRegion的修复(将它们分配给其他的HRegionServer); ZooKeeper集群本身使用一致性协议(PAXOS协议)保证每个节点状态的一致性。

HBase的优缺点

    HBase的优点: HBase采用强一致性模型,在一个写返回后,保证所有的读都读到相同的 数据(行级别原子性,即,PUT 操作一定是完全成功或者完全失败); 通过HRegion动态Split和Merge实现数据存储自动水平扩展,并使用HDFS提 供的多个数据备份功能,实现高可用性;列可以动态增加,并且列为空就不存储数据,节省存储空间 ; 采用HRegionServer和DataNode运行在相同的服务器上实现数据的本地化, 提升读写性能,并减少网络压力;内建HRegionServer的宕机自动恢复。采用WAL来Replay还未持久化到HDFS 的数据。(容错性,自动故障转移); 可以无缝的和Hadoop/MapReduce集成,有利于数据分析; Hbase 可以提供高并发读写操作的支持; 版权免费 ; 非常灵活的模式设计(或者说没有固定模式的限制);可以跟 Hive 集成,使用类 SQL 查询 ; 客户端接口易于使用。
     HBase的缺点:不能支持条件查询,只支持按照 row key 来查询; 容易产生单点故障(在只使用一个 HMaster 的时候) ; 不支持事务 ;JOIN 不是数据库层支持的,而需要用 MapReduce; 只能在行键上索引和排序; 没有内置的身份和权限认证;WAL的Replay过程可能会很慢; 灾难恢复比较复杂,也会比较慢; Major Compaction会引起IO Storm。
除了上面介绍的基本概念,如何将不同来源的数据导入导出HBase也需要掌握,以及如何在HBase中创建删除更新表等。

发布了39 篇原创文章 · 获赞 42 · 访问量 4853

猜你喜欢

转载自blog.csdn.net/weixin_41774099/article/details/103214707