1.HBase是什么
1)HBase的产生背景?
随着数据规模越来越大,大量业务场景开始考虑数据存储的水平扩展,使得存储服务可以快速执行客户端发来的请求,而目前的关系型数据库更专注一台机器。海量数据量存储成为提升应用性能的瓶颈,单台机器无法负载海量的数据处理,随之而来的出现了很多的分布式存储解决方案,HBase就是其中之一。
HBase--DataBase on Hadoop,基于分布式文件系统上面建立的数据库,HBase是面向列的开源数据库。开源团队根据2008年Google发布了一篇关于Google搜索引擎BigTable的核心思想的论文,实现了基于分布式文件系统的列数据库。随后加入Apache基金会,成为Hadoop生态圈中的顶级项目被大家熟知。
2)大数据项目中为什么选择HBase而不选择传统的数据库呢?
首先,HBase性能非常高。HBase中存储了一套HDFS的索引,通过表名->行健->列族->列限定符->时间版本这一套索引来定位数据的位置。正是因为HBase为每一列数据维护了一套索引规则,对于具体某一具体条数据的查询可以非常快速的通过B+树定位数据存储位置并将其取出。HBase通常以集群部署,数据被分散到多个节点存储,当客户端发起查询请求的时候,集群里面多个节点并行执行查询操作,最后将不同节点的查询结果进行合并返回给客户端。
B+树原理:B+树是一种树数据结构,是一个n叉树,每个节点通常有多个孩子,一棵B+树包含根节点、内部节点和叶子节点。根节点可能是一个叶子节点,也可能是一个包含两个或两个以上孩子节点的节点。B+树查找通过父节点->子节点->...->叶子节点,这样执行查询效率非常高。
第二,HBase运行在高可用环境下。HBase集群中任意一个节点宕机都不会导致集群瘫痪。这取决于两方面原因,第一方面,ZooKeeper解决了HBase中心化问题(有意者出门右转查看大数据Hadoop之Zookeeper认识->第三节集群管理->Leader选举)。第二方面,HBase将数据存放在HDFS上面,HDFS的数据冗余存放在不同节点,一个节点瘫痪可从其他节点取得数据,保证了HBase的高可用。
HBase通常采用集群模式,大量的索引文件被切分为很多块(block)分散存放在不同的节点上面,这些块(block)存放在HDFS上面,由于HDFS的数据冗余机制,当存放块的某一个节点宕机,HBase可以从其他节点取出宕机机器存储的数据,这样可以保证这些数据的高可用性,而且当集群数量越大高可用性越高。
第三,HBase非常适合存储超大数据。HBase默认一个列族可以存放64M或更大的数据。HBase可以通过配置文件对存储的列族大小进行设置。目前HBase的最新版本2.0中可以在~/HBase/conf/HBase-env.sh中进行配置。
HBase将数据以HFile文件形式存储,这些文件在磁盘上面连续存储,由于磁盘的磁头不需要尽心大量的寻址操作,HBase在进行数据写入和数据加载的时候可以很快速将某一列族数据加载到内存中。
第四,HBase是一个无模式的数据库。HBase不同于传统的关系型数据库,使用HBase不需要预先定义表中有多少列,也不需要定义每一列存储的数据类型,HBase在需要的时候可以动态增加列和指定存储数据类型。对于从不同数据源爬取的数据不一致,可以动态的新增列而不需要预先就设计好存储的表结构,以应对数据结构多种多样的情况。
2.建立模式
2.1.HBase模式设计需要考虑以下几个问题
1)这个表应该有多少个列族?
2)列族存放什么数据?
3)每个列族应该有多少列?
4)列名应该是什么?尽管列名不必建表时定义,但是读写数据时需要知道。
5)单元存放什么数据?
6)每个单元存储多少个时间版本?
7)行健结构是什么?应该包括什么信息?
2.2.开始建立模式
HBase不建议建立通用存储模型,推荐针对某些具体问题进行模型建立,因为HBase建立模式的时候可以针对具体的场景进行调整。比如:设计中高表和宽表的选择,宽表就是列族中有多个列,高表就是列族中只有一个列,表表现瘦高的形象。1).高表的读写性能要高于宽表。2).宽表有原子性而高表没有原子性。原因:在很多业务中针对某一个业务宽表只需要维护单张表,而高表却要维护多张表。HBase本身不支持多张表的原子性操作,可以针对不同的应用场景进行选择。
2.3.反规范化设计是HBase世界里的词汇
反规范化是相对于规范化。规范化是关系型数据库中的一个概念,主要是范式,他的目的是为了消除数据副本降低维护和存储成本,在查询一个结果的时候往往会跨越多张表进行查询。反规范化是用存储的消耗换取性能的提升,数据允许存在多个冗余信息,查询一个结果不需要跨多个表,提升了数据查询的性能。这样的情况一般适用于数据量特别大的系统使用。
2.4.RowKey的设计和优化非常重要,会直接影响HBase的性能。
1)散列化设计行健
RowKey是HBase中数据的直接索引,集群中HMaster节点通过RowKey的值来决定数据存储位置通常是按序存储。按序排列很容易导致数据集中存储在集群的某几个节点,导致这几个节点负载很高,机器容易被压垮,所以在行健设计中避免RowKey按序列设计。解决办法是将RowKey通过MD5或者SHA-1进行散列化,散列化的数据会均匀的的存储在集群的所有节点中。
2)读优化的行健
读行健优化,主要是提高读的效率,关联尽量少的表,尽量少的将HFile个数加载到内存中。频繁的IO操作是非常影响性能的,HBase中表是分开存储的,不同的表不可能存储在同一个HFile底层文件中,所以行健和表设计都需要降低IO操作。
2.5.列族的高级配置
1)配置存储数据块(HFile)大小很关键。HFile配置得越大,HBase进行读取数据加载的HFile个数越少,但是块越大对系统存储资源是一种浪费,所以根据实际场景进行块大小配置,通常64M。
2)配置数据缓存,通过将数据缓存到内存中可以减少磁盘IO操作从而提高集群性能。
3)配置文件压缩,HBase为了降低存储空间可以配置对数据压缩,但是压缩操作会占用CPU计算资源。通常集群存储空间足够大和任务紧急程度高,不建议对数据进行压缩。
3.HBase性能调优策略
3.1.是什么影响了集群的性能
每一种支撑系统都会影响HBase的性能。提升HBase集群的性能首先需要对支撑系统进行优化。
集群之间数据交换量非常大,然而我们的交换机是一台老旧的交换机,它会严重拖慢整个集群的计算效率的。
3.2如何优化HBase配置性能
提高HBase性能,达到HBase负载均衡,我们需要反复尝试设置HBase的参数。为提升具体某种应用的性能配置HBase时,不存在拿来就能用的秘诀,但是可以尝试把它们归为下面的某种类别。
1.随机读密集型,指使用环境以读为主,很少有写入。解决办法调整HBase参数提高缓存容量和增大索引范围可以带来更高的性能。
2.顺序读密集型,数据从HBase中按照一定顺序依次读出。此时缓存不会带来太多好处。解决办法调整HBase参数将顺序读的规模限制很小,并且限定在一个特定的行健范围进行读取。
3.写密集型,指使用环境以写入为主,很少有读取。此时缓存不在起作用。写操作总是进入MemStore,然后被刷写生成新的HFile,以后再被合并。解决办法为获得更好写性能,应该调整HBase参数不要太频繁刷写、合并或者拆分,降低磁盘IO的操作。
4.混合型,是以上任意问题的组合,需要不断的尝试调整前面介绍的参数得到一个最优的组合。可以反复尝试各种组合,然后运行性能测试,来观察什么情况下能够得到最佳结果。
小结
HBase作为Hadoop的重要组件,在数据的增删查改方面为我们提供了方案,通过对HBase是什么、模式设计和HBase性能调优的阅读,我们能够清晰的理解HBase的核心内容。针对集群规划和运维方面,有兴趣的可以进一步研究。
欢迎志同道合的朋友给我留言,一起交流、讨论、进步!