DevilKing's blog

冷灯看剑,剑上几分功名?炉香无需计苍生,纵一穿烟逝,万丈云埋,孤阳还照古陵

0%

Flink in kwai practise

原文链接

image-20200921111204220

采用 Flink+Kudu 的方案主要思想是借鉴了 Kylin 的思路,Kylin 可以指定很多维度和指标进行离线的预计算然后将预计算结果存储到 Hbase 中;快手的方案是通过 Flink 实时计算指标,再实时地写到 Kudu 里面。

这块关于统计的降级维度是?

因此快手设计了两层降维计算模型,分为全维度层和剩余维度层,这样既利用了全维度层的聚合结果又简化了 DAG 作业图。

全维度部分,通过bitmap的引入,将相关string转为为long,量级大了之后,再辅以bitmapstate进行拆分

Kudu 里面,其本身具有低延迟随机读写以及快速列扫描等特点,很适合实时交互分析场景;

在存储方式上,首先对维度进行编码,然后按时间+维度组合+维度值组合作为主键,

最终按维度组合、维度值组合、时间进行分区,这样有利于提高查询的效率快速获取到数据。

面临着磁盘 IO 开销70%,其中50%开销来自于 Compaction;在 Checkpoint 期间,磁盘 IO 开销达到了100%,耗时在1~5分钟,甚至会长于 Checkpoint 间隔,业务能明显感觉到反压。

利用hbase来替代rockdb,一则是共享存储部分,同时,可以支持多种campaction策略,

SlimBase

HBase 瘦身,主要从减肥和增瘦两个步骤,在减肥方面:

  • 先对 HBase 进行减裁,去除 client、zookeeper 和 master,仅保留 RegionServer
  • 再对 RegionServer 进行剪裁,去除 ZK Listener、Master Tracker、Rpc、WAL 和 MetaTable
  • 仅保留 RegionServer 中的 Cache、Memstore、Compaction、Fluster 和 Fs

目前用的 Compaction 策略是 SizeTieredCompaction,后期要实现基于 OldestUnexpiredTime 的 FiFOCompaction 策略,目标是做到无磁盘 IO 开销。

FiFOCompaction 是一种基于 TTL 的无 IO 的 Compaction 策略;OldestUnexpiredTime 是指例如设置 OldestUnexpiredTime=t2,表示 t2 时刻前的数据全部过期,可以被 Compaction 清理,基于时间点的 FIFOCompaction 理论上可以做到无磁盘 IO 开销。