暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

HBase实践|HBase On S3最佳实践系列篇

HBase技术社区 2020-08-04
1874

Big Data on S3最佳实践-系列篇之(2)

               本文是Big Data on S3最佳实践系列篇的第二篇,今天要跟大家分享的是EMR HBase on S3的最佳实践。本篇文章主要包括以下内容:


  • HBase简介及架构

  • HBase on S3架构

  • HBase 数据读写流程

  • HBase on S3最佳实践


# HBase简介及架构 #






HBase是一个分布式的,高性能,支持实时读写的开源NoSQL数据库,是Google早期论文BigTable的开源版实现方案。其他有关HBase的功能在此不再赘述。通过下面的架构图对HBase有个简单了解:

§主节点-HMaster
HBase也是一个Master-Slave架构,主节点负责管理从节点,并进行Region的分配,同时借助Zookeeper进行多个主节点管理及状态管理:
  • 为从节点分配Region
  • 管理Slave节点的负载均衡
  • 发现失效的从节点并重新分配失效节点之上的Region
  • 管理用户对表的元数据操作,比如create table, delete table等


§从节点-RegionServer
从节点RegionServer是真正负责处理数据请求的节点,RegionServer承载HBase Table的Region,接受客户端的读写请求:
  • 处理客户端的IO请求
  • WAL Log管理
  • Region管理
  • Storefile管理
Hbase也是一种数据库,跟关系数据库一样。为了保证数据写入的安全性,写入数据同样分日志文件(WAL)和数据文件(Storefile)。日志文件用来记录数据操作的过程,在机器失效的情况下通过重放日志文件恢复数据,一台RegionServer上的所有表的写操作共享日志文件,为了保证写入数据的持久性,WAL会保存在分布式文件系统(HDFS)上。数据文件是真正用来存储用户的数据,不同的表的数据通过Region的划分放在不同的数据文件之上。数据文件同样保存在分布式文件系统之上,但是可以根据情况选择存储在HDFS或对象存储S3之上。


§Region
HBase为了支持分布式计算,将一张大表拆分成若干个Region,每个Region会保存一个表里面某段连续的数据,每个Region只能由一个RegionServer进行管理。因此一张表的数据会分布在不同的机器上进行管理。一个Region由多个store组成,一个store对应一个CF(列族)。
写入Region的数据通过Memstore进行缓存,当内存不足或满足一定条件后Flush到分布式文件存储生成Storefile。当Storefile文件的数量增长到一定阈值后,系统会进行合并(minor、 major compaction),在合并过程中会进行版本合并和删除工作形成更大的Storefile。有关数据读写的详细过程会在后面的篇幅介绍。

# HBase on S3架构 #






原始的HBase的数据是放在HDFS存储。但是随着数据量的增长,HDFS存储HBase数据面临同样的挑战:

  • 机器维护及容灾恢复:升级维护HBase集群困难,且HDFS NameNode重启时间与存储的数据量成正比,一个数据中心的宕机会影响在线业务的数据访问。

  • 成本:因为Hadoop集群存储计算偶合在一起,为了存储数据需要为空闲的计算资源支付成本。

  • 资源竞争:Hadoop集群的批处理负载会影响HBase数据的写入,查询的性能。

而数据放在S3上则很好的解决上述的问题。因此很多用户也把HBase的数据从HDFS迁移到S3, 尤其是支持历史数据查询功能的使用场景。美国金融监管局(FINRA)通过把HBase迁移到S3上,成本降低60%。

HBase on S3的实现方案有两种:

  • AWS EMR HBase: AWS EMR针对HBase组件做了优化,用户在在创建EMR集群过程中选择数据存储在S3之上。

  • 自建HBase如果用户选择通过EC2自建HBase集群,可以利用开源社区的HBase Object Store Semantics(HBOSS)项目,把自建的HBase集群的数据存储在S3之上。


AWS EMR HBase


下图是AWS EMR HBase on S3的架构。跟其他EMR集群一样,从节点分Core Node和Task Node。Core节点与Task节点的区别就是Core节点有HDFS的DataNode,可以存放HDFS文件。EMR HBase on S3的主要有以下几个特点:
  • WAL文件写入HDFS: 因为HDFS有数据写入低延迟的特点,且数据量相对较小,因此WAL文件依旧写入HDFS
  • Storefile写入S3:用户的HBase数据通过EMRFS存储在S3保证数据的持久性
  • Core节点及Task节点都有Region Server服务:因为数据写入S3,没有要数据本地性的特点,因此Core节点及Task节点都可以启动Region Server服务与S3进行交互读写数据
  • 通过内存及本地磁盘缓存数据:为了提升读数据的性能,HBase利用Block Cache(堆内内存)及Bucket Cache(堆外内存及SSD磁盘)缓存数据。

自建HBase

下图是Cloudera Data Platform的HBase on S3架构。架构与EMR HBase on S3类似,数据文件Storefile存放在S3,而日志文件WAL存放在HDFS。区别就是通过HBOSS封装Region Server与S3的通信以保证S3文件操作的原子性。

通过HBase on S3的架构,我们可以看出HBase on S3的优势:
  • 存储计算分离:数据存储在S3上,当HBase集群不需要时,可以随时将HBase集群关闭。可以创建多个集群数据指向同样的S3数据实现高可用方案。

  • 成本:S3与HDFS的成本对比前文已经介绍。如果HBase的数据量比较大,通过S3存储数据降低存储成本。

  • 灵活的架构:可以将在线服务与批处理服务分离,单独进行版本升级及维护,降低耦合性。


# HBase数据读写流程 #






了解HBase的数据读写流程会进一步帮助我们了解HBase底层的原理及在使用过程中应该注意的事项。下面就分别介绍一下HBase的数据写入及数据读取的流程。


HBase数据写入

HBase数据写入主要有3个阶段。在第一阶段,客户端发起的数据写请求通过HMaster转发到Region Server, Region Server接到写请求先把操作记录在日志文件中,即写入WAL日志。
WAL数据写入完成后,进入第二个阶段,即用户的数据写入内存Memstore。
第三阶段,随着Memstore的数据积累,Memstore的数据会Flush到分布式文件系统。
随着Flush到文件系统的文件个数的增长,Region Server会启动Compaction线程对Storefile进行合并以提升数据读取的性能。
Compaction分类两种分别是Minor Compaction和Major Compaction。Minor Compaction是将一个Region下一个Column Family的几个Storefile合并成一个相对较大的HFile,而Major Compaction是将一个Region下一个Column Family的所有Hfile合并成一个大的文件,且对启动生命周期管理及删除的数据进行清理。Compaction对HBase的性能影响非常关键,因为篇幅原因在此不再展开叙述。

HBase数据读取

HBase数据读取也分3个步骤。第一步,Region Server会在Block Cache/Bucket Cache查找数据,如果Cache有需要读取的的数据,则直接从Cache返回,避免磁盘的IO操作,提高读取性能。

第二步,查询Memorestore中的数据。正如上文数据写入过程描述的,新写入的数据会在Memstore中。如果数据在Flush到文件系统之前就被读取,此时需要从Memstore获取数据。
第三步,如果Cache及Memstore都没有用户查询的数据,需要从分布式文件存储中进行文件的读取。

因此可以看到Cache的配置管理对HBase的读取性能影响非常关键。HBase为了更好的利用Cache提升读取性能,将Cache分Block Cache及Bucket Cache。L1缓存即Block Cache是放在Region Server JVM的堆内内存进行管理(通hfile.block.cache.size参数调整大小),L2缓存即Bucket Cache可以放在堆外内存或者SSD硬盘上。可以通过hbase.bucketcache.ioengine,hbase.bucketcache.size等参数进行优化。


# HBase on S3最佳实践 #






HBase on S3的最佳实践分两类,第一类是HBase的通用实践暨不论存储是用HDFS还是S3都适用的实践。第二类是HBase on S3的特有实践,暨针对存储是S3时的最佳方案。

HBase通用实践

HBase on S3跟 HBase on HDFS的功能总体比较类似,因此HBase的通用最佳实践在HBase on S3同样适用。比如:

  • HBase机型选择

  • 每台机器存放Region的个数

  • Region Server Heap Size调整及JVM GC优化

  • HBase Schema设计

  • Rowkey设计避免热点数据

  • 根据数据读写比例配置Memstore及Cache大小

  • 优化Compaction
  • 配置L1及L2缓存
  • 调整RPC线程
因为篇幅的原因,在此不再针对上述的优化建议进行展开。如果读者想进一步了解相关优化建议,可以关注“凌云建数”微信公众号并留言,小编会根据大家的反馈决定是否在后续增开相关文章以做详细介绍。

HBase on S3实践

前文的HBase的数据写入流程描述了HBase数据写入过程涉及两个重要的过程需要Region Server与S3进行交互,分别是Memstore的Flush生成Storefile存储到S3及HFile的Compaction。


1. 实践1: Memstore Flush

我们先通过HBase的源代码大概了解一下HBase Memstore Flush的流程。Region的Flush入口从HRegion类的flushcache方法开始,期间为了防止正在写入的文件进行读取操作,会将Memstore的数据在分布式文件系统(HDFS或者S3)生成一个临时文件,比如:

    s3://s3bucket/hbase/data/{namespace}/{table}/497b5cf3f2660e058191bbd9f51f8388/.tmp/c57f1d7d0f0f4c4d9aa7681fb45c5208

    在临时文件写入成功后,会调用HRegionFileSystem类的rename方法将临时文件重新命名到分布式文件系统的最终目录下, 比如:

      s3://s3bucket/hbase/data/{namespace}/{table} 497b5cf3f2660e058191bbd9f51f8388/{cf}/c57f1d7d0f0f4c4d9aa7681fb45c5208

      在上一篇文章介绍S3的特性中已经提到S3的rename底层实现并非原子性,而是一个Copy + Delete的操作。因此Memstore的flush的耗时要长,而且因为非原子性的rename会导致文件的不一致因而导致HBase Region Server的重启。小编在HBase的社区提交了一个JIRA用来优化HBase Memstore Flush的流程,具体信息可以参考:

      https://issues.apache.org/jira/browse/HBASE-23730


      为了更好的使用HBase on S3,避免Memstore带来的问题。我们最好需要了解什么时候触发 Memstore Flush。总的来说,主要有以下几种情况会触发 Memstore Flush:

      1. Region中Memstore占用的内存超过阈值:每个Region的Column Family都分配一定的内存给Memstore,如果写入数据的数据量超过此内存,则会触发Flush操作。hbase.hregion.memstore.flush.size参数控制是控制此参数的大小,默认值128MB。可以根据数据写入的频率及单元格的大小适当调整。可以查看Region Server的日志了解Flush文件的大小情况。

      1. 整个RegionServerMemStore占用内存总和大于阈值:整个Region Server的Memstore也有上限,如果一个Region Server上的Region比较多,当所有Memstore的总和超过Region Server Memstore的上限,同样会触发Memstore的flush。Region Server Memstore的值可以通过参数hbase.regionserver.global.memstore.size调整。

      2. WAL数量大于一定阈值:一台Region Server的WAL文件数量如果超过一定值同样会触发Memstore Flush。默认值是32,可以通过参数hbase.regionserver.maxlogs调整。

      3. 数据更新超过一定阈值:如果某个Region更新频率比较高,总更新次数超过一定数量后也会触发Memstore Flush。

      4. 定期自动Flush:为了防止因为Region Server失效,Region会定期的把内存中的数据Flush到磁盘。

      上述5种情况会引起Memstore Flush。因此为了更好的使用HBase on S3的特性,需要根据负载情况做优化。


      2. 实践2: HFile Compaction

      另外一个与S3交互频繁的操作就是HFile Compaction。下图是HFile Compaction的流程,从图中可以看出HFile Compaction同样涉及S3的rename操作。因此HFile Compaction 的优化对HBase on S3的性能及稳定性有非常大的影响。

      3.实践3: 读多写少的HBase on S3
      介于HBase on S3的上述一些特性,HBase on S3更适合读多写少的应用场景。同时,因为数据存放在S3,可以同时创建两个集群同时指向S3的数据,从而实现高可用的HBase集群。架构参考下图:


      # 总结 #






      本文主要介绍HBase及HBase on S3的架构,通过了解HBase的读写流程,阐述HBase on S3的最佳实践及典型应用场景。希望对大家使用HBase on S3有一些指导意义。另外,本文章是《Big Data on S3最佳实践系列篇》的第2篇,如果想了解更多信息,可以参考:
      Big Data on S3最佳实践系列篇之1

      名言分享

      合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。
                                                                          ——《道德经》


      参考

      [1]:Hbase架构:
       http://bigdatariding.blogspot.com/2013/12/hbase-architecture.html
      [2]:FINRA HBase on S3架构:
      https://aws.amazon.com/cn/blogs/big-data/low-latency-access-on-trillions-of-records-finras-architecture-using-apache-hbase-on-amazon-emr-with-amazon-s3/
      [3]: EMR HBase 文档:
       https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hbase-s3.html
      [4]: CDP on HBase:
       https://blog.cloudera.com/how-hbase-in-cdp-can-leverage-amazons-s3/
      [5]: HBase Memstore Flush优化JIRA:
       https://issues.apache.org/jira/browse/HBASE-23730

      欢迎关注“凌云建数”微信公众号,获取更多关于与技术与数据分析相关信息:
                 

      文章转载自HBase技术社区,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论