快手基于 Flink 的持续优化与实践
共 4606字,需浏览 10分钟
·
2021-03-10 23:49
Flink 稳定性持续优化
Flink 任务启动优化
Flink SQL 实践与优化
未来的工作
一、Flink 稳定性持续优化
第一点就是 Kafka Sink 容忍丢失。该问题的背景是,如果 Kafka 服务异常引发任务失败,并且业务可以容忍少量数据丢失,但是不期望任务挂掉的情况。针对该问题,我们的优化是,设置 Kafka Sink 容忍 M 时间内 X% 丢失。具体实现上,Sink 单 task 统计失败频率,失败频率超过阈值任务才失败。
第二点是 Kafka Source 一键丢 lag。该问题背景是, 一旦任务 lag 较长时间,未及时发现,或者任务 debug 环节,需要丢掉历史验证。之前只能靠重启任务来丢弃 lag,任务重启代码比较好,耗时长。我们优化后,可以热更新、无需重启任务即可以丢弃 lag。实现逻辑是动态发操作命令给 source,source 收到命令后 seek 到最新位置。
第三点是 Kafka broker 列表动态获取。该问题背景是, 生产环境中 Kafka broker 机器可能会故障下线,一旦请求到下线机器,会发生获取 metadata 超时,任务频繁失败。我们优化后,Source task 启动,可以获取集群信息,动态重新获取 Kafka brokerlist,避免频繁重启。
第一,内部自研 Hawk 系统,5s 发现宕机。
第二,Yarn 整合 Hawk,快速感知宕机。
第三,Flink 感知宕机 container release。
第一,允许冗余部分 Container。
第二,适当调整 cancel task timeout 时间。
第三,针对适合任务开启 Region Failover。
二、Flink 任务启动优化
三、Flink SQL 实践与优化
第一,MiniBatch Aggregation,思路是内存缓存 batch 数据再进行聚合,减少状态访问次数。
第二,Local Global Aggregation,思路是聚合操作拆分为两阶段, Local 阶段预聚合减少数据条数,Global 解决全局聚合。
第三,Split Distinct Aggregation,思路是针对 count distinct 场景, 对分组 key 先分桶预聚合, 再对分桶结果全局聚合。
第一,两阶段聚合,分为 Local window Agg 和 Global window Agg。Local window Agg:预聚合 window 大小与 global 阶段保持一致,checkpoint 时将结果写出,不保存状态 。Global window Agg:全量聚合。
第二,增加 mini-batch,好处是 local 阶段 mini-batch 避免数据量缓存过多,Global 阶段 mini-batch 减少状态访问次数。
优化前:相同 UDF 多次执行,性能变差。 优化后:同一条数据下 UDF 结果复用,避免多次调用执行,节约资源,性能也得到提升。拿示例 SQL 来说,性能提升了 2 倍。
四、未来工作
第一,关于资源利用率。目标是提升集群整体资源利用均衡性,Flink 任务内调度均衡性,以及 Flink 任务资源使用合理性。
第二,关于 Flink SQL。我们会持续的去做推广。我们希望提升 SQL 任务稳定性和 SQL 任务资源的利用率。
第三,探索流批统一,这也是业界的一个方向。我们希望可以一套代码就解决问题,不用重复开发两套任务。
另外,快手数据平台部招贤纳士!数据平台部主要为快手业务的飞速发展提供数据新能源,每日面向万亿级用户数据,打造行业领先的EB级数据处理与应用平台,驱动业务创新,保持快手在用户理解,内容分发,生态安全等领域的领先地位。