看我72变,阿里HBase数据压缩编码探索

  • 时间:
  • 浏览:1
  • 来源:5分PK10_5分PK10官网

那末在解压缩时,为什么在么在判断和上个KV的键长是是不是一样,值长是是不是一样,写入的时间戳究竟是是原值还是差值呢?那些一定会通过最早写入的2个字节的flag来实现的,

你这俩 字节中的8位bit,含义是:

目前,2017年双11,ZSTD是意味着在线上全面铺开,已累计优化存储超过2.5PB,预计全面推开后,节约存储空间超过15PB。LZ4也是意味着在次要读要求较高业务上线。

下图为某监控类应用zstd压缩算法后,集群整体存储量的下降情况表。数据量由1150+T减少到75T。

通过Indexable Delta EncodingHFile的随机seek性能相对于使用时候翻了一倍,以64K block为例,随机seek性能基本与不做encoding相近.在全cache命中的随机Get场景下,相对于Diff encoding rt下降150%,但存储开销仅仅提高3-5%。Indexable Delta Encoding目前已在线上多个场景应用,经受了双十一的考验。以风控集群为例,双集群双十一高峰期访问量接近,但是意味着上线Indexable Delta Encoding的集群在访问量稍多的情况表下,平均读rt减少10%-15%。

hbase作为这俩 schema free的数据库,离米 传统的关系型数据库更加灵活,用户不需要设计好表的特征,也要能在同一张表内写入不同schema的数据。然而,是意味着缺少数据特征的支持,hbase要能 好多好多 额外的数据特征来标注长度信息,且无法针对不同的数据类型采用不同的压缩法律方式。针对你这俩 问题图片,hbase提出了编码功能,用来降低存储开销。是意味着编码对cpu开销较小,而效果较好,通常cache中也会开启编码功能。

你可曾遇到你这俩 需求,要能了几百qps的冷数据缓存,却是意味着存储水位要浪费几十台服务器?你可曾遇到你这俩 需求,几百G的表,要能 纯cache命中,性能要能满足业务需求?你可曾遇到,几十M的小表,是意味着qps发生问题,要能 不停的split,balance,利用多台服务器来抗热点?

面对繁杂的场景,Ali-HBase团队一个劲 致力于为业务提供更多的选着和更低的成本。本文主要介绍了hbase目前这俩 提高压缩率的主要法律方式:压缩和DataBlockEncoding。

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



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



性能优化和用户体验,老好多好多 我阿里hbase的团队不懈的追求。大家一个劲 在不断充沛当事人的武器库,努力做最好的海量数据在线存储产品。欢迎对hbase实现,使用有任何问题图片的同学联系大家.

开源hbase通常使用的LZO压缩是意味着Snappy压缩。你这俩 种压缩的并肩特点是都追求较高的压缩解压传输速度,并实现合理的压缩率。然而,随着业务的快速增涨,太大的业务是意味着是意味着存储水位问题图片而扩容。hbase针对你这俩 情况表,采用了基于跨集群分区恢复技术的副本数优化、机型升级等优化手段,但依然无法满足存储量的快速膨胀,大家一个劲 致力于寻找压缩更高的压缩法律方式。



从性能深层考虑,hbase通常要能 将Meta信息装载进block cache。是意味着将block大小较小,Meta信息较多,会冒出Meta无法详细放上Cache的情况表, 性能下降。是意味着block大小较大,DIFF Encoding顺序查询的性能会成为随机读的性能瓶颈。针对你这俩 情况表,大家开发了Indexable Delta Encoding,在block内部内部结构也要能通过索引进行快速查询,seek性能有了较大提高。Indexable Delta Encoding原理如图所示:



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

通用压缩是数据库减少存储的重要手段,在hbase中也发生广泛应用。通常数据库都发生数据块的概念,针对每个块做压缩和解压。块越大,压缩率越高,scan throughput增加;块越小,latency越小。作为这俩 Tradeoff,线上hbase通常采用64K块大小,在cache中不做压缩,仅在落盘和读盘时做压缩和解压操作。

通过线上数据验证,DIFF encoding要能减少2-5倍的数据量。



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

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

hbase很早就支持了DataBlockEncoding,也好多好多 我是通过减少hbase keyvalue中重复的次要来压缩数据。 以线上最常见的DIFF算法为例,某kv压缩时候的结果:

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