摘要: 本文主要介绍了hbase对数据压缩,编码的支持,以及云hbase在社区基础上对数据压缩率和访问速度上了进行的改进。

前言

你可曾遇到这种需求,只有几百qps的冷数据缓存,却因为存储水位要浪费几十台服务器?你可曾遇到这种需求,几百G的表,必须纯cache命中,性能才能满足业务需求?你可曾遇到,几十M的小表,由于qps过高,必须不停的split,balance,利用多台服务器来抗热点? 
面对繁杂的场景,Ali-HBase团队一直致力于为业务提供更多的选择和更低的成本。本文主要介绍了hbase目前两种提高压缩率的主要方法:压缩和DataBlockEncoding。

无损压缩:更小,更快,更省资源

通用压缩作为数据库解决存储的重要手段,通常数据库都存在数据块的概念,针对每个块做压缩和解压。块越大,压缩率越高,scan throughput增加;块越小,随机读IO压力较小,读latency越小。作为一种Tradeoff,线上hbase通常采用64K块大小,在cache中不做压缩,仅在落盘和读盘时做压缩和解压操作。

开源hbase通常使用的LZO压缩或者Snappy压缩。这两种压缩的共同特点是都追求较高的压缩解压速度,并实现合理的数据压缩率。然而,随着业务的快速增涨,越来越多的业务因为因为存储水位问题而扩容。hbase针对这一情况,采用了基于跨集群分区恢复技术的副本数优化、机型升级等方法,但依然无法满足存储量的快速膨胀,因此我们一直致力于寻找压缩更高的压缩方式。

新压缩(zstd、lz4)上线

Zstandard(缩写为Zstd)是一种新的无损压缩算法,旨在提供快速压缩,并实现高压缩比。它既不像LZMA和ZPAQ那样追求尽可能高的压缩比,也不像LZ4那样追求极致的压缩速度。这种算法的压缩速度超过200MB/s, 解压速度超过400MB/s(实验室数据),基本可以满足目前hbase对吞吐量的需求。经验证,Zstd的数据压缩率相对于Lzo基本可以提高25%-30%,对于存储型业务,这就意味着三分之一到四分之一的的成本减少。

而在另一种情况下,部分表存储量较小,但qps大,对rt要求极高。针对这种场景,我们引入了lz4压缩,其解压速度在部分场景下可以达到lzo的两倍以上。一旦读操作落盘需要解压缩,lz4解压的rt和cpu开销都明显小于lzo压缩。

我们先通过一张图片直观的展示各种压缩算法的性能: 

以线上几种典型数据场景为例,看看几种压缩的实际压缩率和单核解压速度(以下数据均来自于实际应用)

业务类型 无压缩表大小 LZO(压缩率/解压速度MB/s) ZSTD(压缩率/解压速度MB/s) LZ4(压缩率/解压速度MB/s)
监控类 419.75T 5.82/372 13.09/256 5.19/463.8
日志类 77.26T 4.11/333 6.0/287 4.16/ 496.1
风控类 147.83T 4.29/297.7 5.93/270 4.19/441.38
消费类 108.04T 5.93/316.8 10.51/288.3 5.55/520.3

目前,2017年双11,ZSTD已经在线上全面铺开,已累计优化存储数PB。LZ4也已经在部分读要求较高业务上线。 
下图为某监控类应用zstd压缩算法后,集群整体存储量的下降情况。数据量由100+T减少到75T。

编码技术:针对结构化数据的即查即解压

hbase作为一种schema free的数据库,相当于传统的关系型数据库更加灵活,用户无需设计好表的结构,也可以在同一张表内写入不同schema的数据。然而,由于缺少数据结构的支持,hbase需要很多额外的数据结构来标注长度信息,且无法针对不同的数据类型采用不同的压缩方式。针对这一问题,hbase提出了编码功能,用来降低存储开销。由于编码对cpu开销较小,且效果较好,通常cache中也会开启编码功能。

旧DIFF Encoding介绍

hbase很早就支持了DataBlockEncoding,也就是是通过减少hbase keyvalue中重复的部分来压缩数据。 以线上最常见的DIFF算法为例,某kv压缩之后的结果:

  • 一个字节的flag(这个flag的作用后面解释)
  • 如果和上个KV的键长不一样,则写入1~5个字节的长度
  • 如果和上个KV的值长不一样,则写入1~5个字节的长度
  • 记录和上个KV键相同的前缀长度,1~5个字节
  • 非前缀部分的row key
  • 如果是第一条KV,写入列族名
  • 非前缀部分的的列名
  • 写入1~8字节的timestamp或者与上个KV的timestamp的差(是原值还是写与上个KV的差,取决于哪个字节更小)
  • 如果和上个KV的type不一样,则写入1字节的type(Put,Delete)
  • Value内容

那么在解压缩时,怎么判断和上个KV的键长是否一样,值长是否一样,写入的时间戳究竟是是原值还是差值呢?这些都是通过最早写入的1个字节的flag来实现的, 
这个字节中的8位bit,含义是:

  • 第0位,如果为1,键长与上个kv相等
  • 第1位,如果为1,值长与上个kv相等
  • 第2位,如果为1,type与上个kv一样
  • 第3位,如果为1,则写入的timestamp是差值,否则为原值
  • 第456位,这3位组合起来的值(能表示0~7),表示写入的时间戳的长度
  • 第7位,如果为1,表示写入的timestamp差值为负数,取了绝对值。

DIFF 编码之后,对某个文件的seek包含以下两步:

  1. 通过index key找到对应的datablock
  2. 从第一个完整KV开始,顺序查找,不断decode下一个kv,直到找到目标kv为止。

DIFF encoding对小kv场景使用效果较好,可以减少2-5倍的数据量。

新Indexable Delta Encoding上线

从性能角度考虑,hbase通常需要将Meta信息装载进block cache。如果将block大小较小,Meta信息较多,会出现Meta无法完全装入Cache的情况, 性能下降。如果block大小较大,DIFF Encoding顺序查询的性能会成为随机读的性能瓶颈。针对这一情况,我们开发了Indexable Delta Encoding,在block内部也可以通过索引进行快速查询,seek性能有了较大提高。Indexable Delta Encoding原理如图所示:

在通过BlockIndex找到对应的数据块后,我们从数据块末尾找到每个完整KV的offset,并利用二分查找快速定位到符合查询条件的完整kv,再顺序decode每一个Diff kv,直到找到目标kv位置。

通过Indexable Delta Encoding, HFile的随机seek性能相对于使用之前翻了一倍,以64K block为例,在全cache命中的随机Get场景下,相对于Diff encoding rt下降50%,但存储开销仅仅提高3-5%。Indexable Delta Encoding目前已在线上多个场景应用,经受了双十一的考验,整体平均读rt减少10%-15%。

云端使用

阿里HBase目前已经在阿里云提供商业化服务,任何有需求的用户都可以在阿里云端使用深入改进的、一站式的HBase服务。云HBase版本与自建HBase相比在运维、可靠性、性能、稳定性、安全、成本等方面均有很多的改进,更多内容欢迎大家关注 https://www.aliyun.com/product/hbase

转自:https://yq.aliyun.com/articles/277084


交流

如果大家对HBase有兴趣,致力于使用HBase解决实际的问题,欢迎加入Hbase技术社区群交流:

微信HBase技术社区群,假如微信群加不了,可以加秘书微信: SH_425 ,然后邀请您。

​  钉钉HBase技术社区群

转载于:https://www.cnblogs.com/hbase-community/p/8915498.html

HBase数据压缩编码探索相关推荐

  1. BigData NoSQL —— ApsaraDB HBase数据存储与分析平台概览

    一.引言 时间到了2019年,数据库也发展到了一个新的拐点,有三个明显的趋势: 越来越多的数据库会做云原生(CloudNative),会不断利用新的硬件及云本身的优势打造CloudNative数据库, ...

  2. hive删除hbase数据_Hive进阶:Hive通过外部表操作Hbase数据

    概述: HBase: 查询效率比较高,常为实时业务提供服务,但是其查询方式比较单一,只能通过row方式get单条数据,或者通过scan加过滤器的方式扫描数据表获取数据. Hive: hive用来存储结 ...

  3. 一个purge参数引发的惨案——从线上hbase数据被删事故说起

    一个purge参数引发的惨案--从线上hbase数据被删事故说起 在写这篇blog前,我的心情久久不能平静,虽然明白运维工作如履薄冰,但没有料到这么一个细小的疏漏会带来如此严重的灾难.这是一起其他公司 ...

  4. HBase 数据导入功能实现方式解释

    https://www.ibm.com/developerworks/cn/opensource/os-cn-data-import/index.html 预备知识:启动 HBase 清单 1. 修改 ...

  5. hbase的备份恢复1,Expor过程,Import过程,统计hbase表行数;hbase备份恢复方式2:使用hdfs备份hbase数据,基于hbase数据进行恢复

    25.28 hbase数据备份和恢复 以下过程针对线上没有启动新旧集群的情况,所以使用hbase export / import的方式进行数据的备份和迁移 25.28.1 Export过程 首先,先进 ...

  6. 【原创】大叔经验分享(25)hive通过外部表读写hbase数据

    在hive中创建外部表: CREATE EXTERNAL TABLE hive_hbase_table( key string, name string, desc string ) STORED B ...

  7. HBase数据存储格式

    好的数据结构,对于检索数据,插入数据的效率就会非常高. 常见的数据结构 B+树 根节点和枝节点很简单,分别记录每个叶子节点的最小值,并用一个指针指向叶子节点.  叶子节点里每个键值都指向真正的数据块, ...

  8. HBase数据备份及恢复(导入导出)的常用方法

    一.说明 随着HBase在重要的商业系统中应用的大量增加,许多企业需要通过对它们的HBase集群建立健壮的备份和故障恢复机制来保证它们的企业(数据)资产.备份Hbase时的难点是其待备份的数据集可能非 ...

  9. python提取hbase数据_详解python操作hbase数据的方法介绍

    配置 thrift python使用的包 thrift 个人使用的python 编译器是pycharm community edition. 在工程中设置中,找到project interpreter ...

最新文章

  1. 小心!你的脸正在成为色情片主角……
  2. 电子科技大学技术交流报道
  3. windows系统下Python环境的搭建及Selenium的安装
  4. 二叉树的层序遍历和二叉树的线索化
  5. 浏览器同源策略及Cookie的作用域
  6. 链接器怎样使用静态库来解决符号引用
  7. FastAPI ------框架基础
  8. HTML5怎样创建画布?
  9. mysql 生明变量_在 MySQL 的 SQL 文件中,定义变量与使用变量
  10. sdn体系的三个平面_软件定义网络基础---SDN控制平面
  11. 计算机操作系统》第06章在线测试,《计算机操作系统》第01章在线测试
  12. mysql 删除 like_MySQL 定时删除数据
  13. 【蓝桥杯单片机】超声波模块(测距原理,驱动方式)
  14. Command line is too long. Shorten command line for Application---微服务升级_SpringCloud Alibaba工作笔记0067
  15. django - settings.py
  16. 在RStudio中调用python包
  17. linux7输入法切换,centos7如何切换输入法
  18. 浅谈LCD液晶屏和LED屏,它们有什么不同之处
  19. SolveigMM Video Splitter绿色中文版
  20. 海王小姐姐教你微信如何三步实现多开,win7 win 8 win10都可用

热门文章

  1. phpstrom中让volt高亮显示
  2. 烂泥:SQL Server 2005数据库备份与恢复
  3. ubuntu10.0.4使用再生龙还原后在启动时不能正常启动
  4. Openstack 小知识点
  5. IT生存环境压力让人抑郁 .
  6. 谈谈学习AS3的过程
  7. [原]走过2007,我的2008
  8. JAVA SE学习day_12:集合的排序、队列、栈结构
  9. 分享Kali Linux 2017年第29周镜像文件
  10. AppleWatch开发教程之Watch应用对象新增内容介绍以及编写运行代码