热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HBaseCompactionOffload功能的实现与应用

文|牛豫林小米云平台工程师,ApacheHBaseCommitter导读本文介绍了

文|牛豫林
小米云平台工程师,Apache HBase Committer
导读

本文介绍了HBase Compaction Offload功能的设计与实现,以及在小米的应用。HBase Compaction操作会造成读写服务响应毛刺,我们通过引入CompactionServer组件,将Compaction任务剥离到CompactionServer上执行,避免与RegionServer产生资源竞争,优化读写毛刺。同时Compaction Offload功能加强存储计算分离,CompactionServer可以独立于RegionServer进行扩缩容,便于云原生容器化部署。

背景

HBase是基于LSM-Tree架构的分布式数据库,对于数据写入不会原地更新,而是在内存(Memtable)中创建更新键的新值,然后定期将内存中的数据刷新为只读的存储文件(HFile),读取数据就需要遍历多个文件找到该键所对应的正确值。随着存储文件不断增加,读性能会因为需要读取的文件数增多而下降(如图.1所示)。HBase会执行Compaction操作将多个文件合并,使文件个数基本稳定,进而使读取IO的次数趋于稳定,将延迟控制在一定范围内(图.2)。在现有HBase架构中,Compaction操作在RegionServer上执行,合并文件会带来很大的带宽以及IO压力,同时也会消耗CPU和内存资源,造成读取响应延迟增大,出现毛刺。

图.1 读取延时随数据写入时间增加而不断增加

图.2 开启Compaction情况下读取延迟随写入时间变化

1、
Compaction 现有逻辑

目前Compaction相关逻辑都是在RegionServer中执行的,如图.3所示。

图.3 Compaction执行流程

Compaction的执行流程可以分解为多个子流程:

1、触发条件:Flush、Open Region、CompactionCheckerChore、Admin操作

2、执行Compaction

  • 据Compaction策略选择要合并的文件

  • 选择合适的线程池,执行Compact

3、完成Compaction

  • 将Compact产生的新文件从tmp目录移动到Region相应目录,并加载新文件

  • 将参与Compact的输入文件标记为Compacted

  • CompactedHFilesDischarger线程定期扫描并删除Compacted文件

Compaction Offload功能将步骤2中的部分从RegionServer中移出,在CompactionServer上执行。

2、
Compaction Offload 功能实现

整体架构变化

引入新的组件CompactionServer(以下简写为CS),将Compaction任务从RegionServer中剥离出来。新的HBase架构包含组件为:Master、RegionServer、CompactionServer。同时为了管理CS,在Master中增加CompactionServer Manager(以下简写为CS Manager)模块,如图.4 所示。

图.4 HBase新整体架构

CompactionServer可以代替RegionServer执行Compaction操作,它使用HDFS Client与HDFS进行交互,从HDFS中读取需要执行Compaction文件的内容,并将Compaction产生的新文件写入HDFS。CompactionServer是无状态的,易于扩展。CS Manager管理CS并维护Region到CS的映射,使每个CS执行某些Regoin的Compaction操作,这类似于Master将Region分配给RegionServer提供读写服务。

在实现CS和CS Manager的过程中,我们复用了RegionServer和RegionServerManager的代码,例如从HDFS中Scan Storefile以及对这些文件执行Compaction并写回HDFS,同时对于Compaction的核心—Compaction策略,我们将其视为黑盒,保持原先的执行逻辑,不做修改。

新的架构可以带来如下好处:

1、CompactionServer可以部署在独立机器上,不与RegionServer产生资源竞争,优化读写毛刺。

2、加强存储计算资源分离,将RegionServer计算任务进一步分离到多个Server上,CS可以独立于RegionServer进行扩缩容,便于容器化部署。

3、有了中心化的CS Manager, Master可以对Compaction任务进行整体限速。


Compaction逻辑的变化

图.5 CompactionOffload模块交互图

增加CompactionServer后,执行Compaction时各模块功能发生变化:

1、RegionServer

  • 需要执行Compaction时,发送Request Compaction请求到Master,请求中携带Region、Family等信息(图.5中①)。

  • 接受CS的CompactionComplete请求(图.5中③),然后进行原先的逻辑(Compaction现有逻辑中3)。

2、Master

  • 新增类CompactionServerManager,用来管理CS以及转发Compaction请求。

  • 接受RegionServer的Request Compaction请求,并转发给相应CS,这里同一个Region的请求会转发到同一个CS(图.5中②)。

  • 响应CS的心跳请求,返回对CS的限速信息(图.5中⑤)。

  • 页面展示CS列表以及Compaction Task汇总信息。

3、CompactionServer

  • 接受Master转发来的Request Compaction请求,执行选择文件和Compact逻辑(Compaction现有逻辑中2)。

  • 发送CompleteCompaction请求给相应的Regionserver,请求参数包括参与执行Compaction的文件列表和Compaction生成文件列表(图.5中③)。

  • 给Master发送心跳并汇报Compaction Task信息(图.5中④)。

  • 获取Master的汇报答复,其中包含限速信息,对Compaction任务进行限速调整。


Compaction Offload功能开关

集群级别:在HBase Shell中执行enable_compaction_offload/disable_compaction_offload命令开启或关闭整集群Compaction Offload功能。

表级别:创建/修改表时设置表的COMPACTION_OFFLOAD_ENABLED的属性为true或false。

只有集群和表级别开关同时开启,才会执行Compaction Offload逻辑。


Compaction Offload功能Failover

1、Master宕机
RegionServer请求Master失败,会回退到原先的本地执行Compaction方式。

对于已经在CS执行完毕的Compaction任务,会直接请求RegionServer(图.5中③),不会受到Master不可用的影响。

2、CompactionServer宕机
CS宕机后,CS Manager会将请求发送到其他可用的CS,若全部CS都不可用,RegionServer会回退到本地执行Compaction的方式。

3、RegionServer宕机或Region移动
在CS执行完Compaction并请求RegionServer时(图.5中③),若发生RegionServer宕机或Region移动,我们会等待Region重新Online,从Master中获取Region最新所在RegionServer,然后重试Compaction Complete请求。


Compaction Offload功能兼容性

1、FavoredNodes/Locality
若某个Region开启了FavoredNodes特性,CompactionOffload功能会进行兼容,在文件写回HDFS时使用FavoredNodes特性,保证Compaction生成的文件副本在指定DataNode列表上。

若未开启FavoredNodes特性,会将发送RequestCompaction请求的RegionServer地址设置为HStore的FavoredNodes,在写回HDFS时写入RegionServer所在机器的DataNode,保证Locality。若RegionServer所在机器未部署DataNode,则会随机选择DataNode进行写入。

2、MOB
CompactionServer在执行Compaction时会创建HStore对象,复用Compaction逻辑。若RequestCompaction请求中Family是开启MOB特性的,我们会创建HMobStore,从而兼容MOB Compaction。

3、RegionCoprocessor
HBase用户通过定制Coprocessor可以在Compaction操作过程中执行自定义逻辑,Compaction Offload功能需要兼容Coprocessor保证Compaction的语义正确。我们引入RegionCoprocessorService接口,使Region可以在CompactionServer上打开时挂载Compaction相关的Coprocessor。

3、
Compaction Offload 功能应用

YCSB测试

RegionServer:Num = 2、 MaxHeap = 25g、MaxDirectMem = 25g、HDD

CompactionServer:Num = 1、MaxHeap = 25g、HDD5M Records and Operations 

Wordload A

Wordload B

YCSB测试表明,开启Compaction Offload对吞吐和P99延迟有10%左右提升。


上线效果

小米推送集群:60个RegionServer节点,单节点128G内存、10T SSD。单机读/写QPS均值:40k/2.5k;单机读/写QPS峰值:90k/10k。

我们在该集群上线Compaction Offload功能,将5个RegionServer服务器替换为部署CS,每个服务器部署4个CS。上线时间为7月18日,我们分别截取了服务端和客户端对访问延时的监控如图6、7、8所示。发现开启Compaction Offload功能可以显著降低P99延时,但是对于平均延迟和P999优化效果不明显。

图.6 HBase服务侧监控:请求排队时间(P99)

图.7 HBase服务侧监控:请求处理时间(P99)

图.8 业务侧监控:Get请求HBase集群耗时(P99)

4、
未来规划

Compaction Offload功能同步到社区

目前Compaction Offload功能在小米内部分支开发完毕,正在同步到社区,参考HBASE-25714。

支持异构Compaction Offload功能

目前Compaction Offload功能只能在CS上执行,后续可以考虑将Compaction提交到YARN上执行,获得更高的资源利用率。由于Minor Compaction对实时性有较高要求,可以使用Spark Streaming或者Flink计算框架对Compaction任务进行处理。

CompactionServer支持BlockCache

图.2 Compaction任务造成读写毛刺不仅仅是因为其与RegionServer产生资源竞争,另一个原因是Compaction结束时替换文件造成RegionServer BlockCache失效,这时需要重新从HDFS读取文件并加载到BlockCache,Compaction Offload功能目前只能解决Compaction任务与RegionServer资源竞争的问题。我们计划在CS中引入BlockCache,在Compaction执行过程中缓存需要的HFile Block,当Compaction任务结束替换文件后,RegionServer可以从CS的BlockCache中读取相应Block,减轻读文件造成的延时毛刺。

参考 
  • https://issues.apache.org/jira/browse/HBASE-25714

  • http://www.vldb.org/pvldb/vol8/p850-ahmad.pdf

  • https://hbase.apache.org/book.html

  • 《HBase原理与实践》

喜欢此内容的人还喜欢
【Doris全面解析】Doris SQL 原理解析
米家插件平台的技术实践之路
日志异常检测初步实践与探索
基于chaosblade的故障注入平台实践







推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • ZooKeeper 学习
    前言相信大家对ZooKeeper应该不算陌生。但是你真的了解ZooKeeper是个什么东西吗?如果别人面试官让你给他讲讲ZooKeeper是个什么东西, ... [详细]
  • 我们在之前的文章中已经初步介绍了Cloudera。hadoop基础----hadoop实战(零)-----hadoop的平台版本选择从版本选择这篇文章中我们了解到除了hadoop官方版本外很多 ... [详细]
  • Hbase1.2.0cdh5.16.2使用PREFIX_TREE编码导致集群压缩队列异常
    Hbase1.X版本中PREFIX_TREE作为BlockEncoding存在bug,会造成RegionServer节点compactionqueue持续升高,甚至影响fl ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  • Tomcat安装与配置教程及常见问题解决方法
    本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
  • SparkOnYarn在YARN上启动Spark应用有两种模式。在cluster模式下,Spark驱动器(driver)在YARNApp ... [详细]
  • 文件txt-数据库mysql-纯内存数据库SAP-HANA-内存数据库redis-分布式数据库hbase一、数据存储选型要点容量成本访问速度 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • Java开发实战讲解!字节跳动三场技术面+HR面
    二、回顾整理阿里面试题基本就这样了,还有一些零星的问题想不起来了,答案也整理出来了。自我介绍JVM如何加载一个类的过程,双亲委派模型中有 ... [详细]
  • HBase系列之hbase2.2.3安装
    1.下载地址hbase-2.2.3下载地址2.解压安装1)解压tarzxvfhbase-2.2.3-bin.tar.gz2)环境变量配置vim ... [详细]
  • Python异常处理python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误。你可以使用该功能来调试python程序。异常处理:本站Python教程会 ... [详细]
author-avatar
nzl
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有