为了解决消费端上面的 task manager 流量不均衡的情况。我们引入了一个 slot group 的概念。我们会事先对 topic partition 的流量进行一个预估,预估完了之后,会通过人工计算的方式把几个低流量的 topic 组合成同一个 group 里面。同一个 group 的 topic 会被放在同一个 slot 里面,然后去进行调度,这样就能够很好的去把 task manager 上面的消费流量不均的问题解决掉了,整个 Flink job 就会运行的很好。
Case 2
第二个 case 是一个 AB test 的应用场景,做这个 AB test 场景的一个初衷是什么呢?在我们实时的数仓里面,需要去产出小时级别的中间表,以及天级的中间表,给推荐算法的工程师以及数据分析师来使用。对于小时级别的中间表以及天级的中间表的产生,需要通过实时的去计算底层的各种类型的打点,比如用户观看的打点、某个视频的下发打点,还有用户其他行为的打点等等,会按照某一个维度进行聚合。聚合了之后会进行相关的一些统计,最终会形成一张宽带供推荐算法工程师以及数据分析师来使用。
这个地方我们就会有 Table A、Table B 和 Table K 的一个表。假设有 K 张表,那么我们需要对 K 张表进行一次聚合操作。假设是按照 uid 进行一次聚合,那么这个聚合有两种方式:
第一种方式是做 join。对于 Flink 而言,它的流式 join 可能耗时会比较长,整个计算资源的消耗也是非常大的。所以我们这边做了一个比较巧妙的方案就是使用 union 代替 join。我们会把 Table A、Table B 和 Table K 通过 union 的方式会生成一个 View X。然后把 View X 直接写出以小时为粒度,到 ClickHouse 供用户查询。在 union 的过程当中,我们还会做一些相关的聚合的操作。来把相关的指标给聚合起来供用户使用。这个就是小时级别的中间表。
首先。在左边 Table A、Table B 和 Table K 会使用 Flink SQL 把数据从 Pulsar 消费出来,然后做成一个独立的 table。然后同样也是以 union 的方式把实时的流表给 union 起来,做一些统计相关的处理生成一个视图,一个View X。这个 View X 会根据我们精心设计过的一个 row-key,把它以天为维度写出到 HBase 里面去。