Flink 在 58 同城的应用与实践

2021-11-05  本文已影响0人  Flink中文社区

本文整理自 58 同城实时计算平台负责人冯海涛在 Flink Forward Asia 2020 分享的议题《Flink 在 58 同城应用与实践》,内容包括:

  1. 实时计算平台架构
  2. 实时 SQL 建设
  3. Storm 迁移 Flink 实践
  4. 一站式实时计算平台
  5. 后续规划
Flink 在 58 同城应用与实践 FL.jpg

一、实时计算平台架构

实时计算平台的定位是为 58 集团海量数据提供高效、稳定的实时计算一站式服务。一站式服务主要分为三个方向:

img

平台建设主要分为两个部分:

img

上图是我们的实时计算平台的架构。

我们在业务发展过程中,引入了 Flink 计算框架。首先从业务来说,58 是一个一站式生活服务平台,包含很多业务线。随着业务的发展,数据量越来越大,场景越来越丰富,需要一个更加强大的计算框架来满足用户的需求。

我们前期基于 Storm 和 SparkStreaming 构建的计算集群在很大程度上并不能满足这些场景需求。于是对 Flink 进行了调研,发现 Flink 不论是在计算性能,还是流数据特性支持上,都体现出了非常大的优势。因此,我们决定采用 Flink 作为主流的计算框架。

img

上图是我们 Flink 集群的建设情况。Flink 作为实时计算框架,经常需要 7×24 小时的可用性。我们在建设底层集群的时候,需要考虑高可用的架构。

Flink 计算框架在 58 经历了大概两年多的发展。目前我们的集群有 900 多台机器,2000 多个实时任务,每天处理大概 2.5 万亿的实时数据,数据量峰值达到了 3000 万每秒。

二、实时 SQL 建设

1. 实时 SQL 演进

SQL 编程具有低门槛、自动优化、版本统一等特点。同时 Flink SQL 作为实时数仓的主要工具,是我们在建设 Flink 平台时考虑的一个主要方向。

我们最早上线的 Flink 是基于 1.6 版本的,当时这个版本只支持 DML,我们在当时的版本基础上进行了一些扩展,主要是在 DDL 语法上的扩展支持。在用户使用层面,为了简化 DDL 的定义,也通过一个配置化的方式来实现自动生成 DDL。在开发的时候,提供可视化开发的功能和在线调试的功能。

随着社区的开源,我们将 Flink SQL 切换到了社区版本,之后也升级相关的版本,以及合并比较多的社区版本特性,比如说 Blink 相关、批流合一、对 Hive 的支持。

最后针对 Flink SQL 这块的实时数仓,也做了一些数仓化的工作,主要包括元数据管理、血缘关系、数仓分层、权限管理等等。

img

2. 存储扩展

关于存储扩展这一块,最开始我们是基于 Flink 自己实现的一套 DDL。随着社区开源,切换到社区的 Flink SQL 版本,然后在上面做了一些扩展,主要有几个方面:

img

3. 性能优化

关于性能优化,主要是两方面:

img

4. 数仓化建设

实时数仓作为 Flink 的一个比较典型的应用场景,相较于离线数仓它可能存在一些平台化不完善的方面:

为了提升实时数仓建设的效率,我们提供了面向数仓化实时 SQL 能力,在数仓设计,任务开发,平台化管理方面全面对齐离线数仓的建设模式。

img

4.1 数仓化

数仓化主要是参考离线数仓的模型,对我们实时数仓这一块进行模型建设。

比如说,最原始的数据会进入ODS 层,经过一些清洗落入到行为明细层,之后会拆分到具体的主题明细层,然后再将一些相关的维表信息进行计算,再到汇总层,最终提供给最上层的应用,包括一些实时报表,Ad-hoc 查询等。

img

4.2 数仓平台

实时数仓目前主要还是基于这种 Lambda 架构来进行平台化的建设。

图片

三、Storm 迁移 Flink 实践

1. Flink 与 Storm 对比

Flink 相对于 Storm 来说,有比较多的优势。

因此我们决定迁移到 Flink。

img

2. Flink-Storm 工具

在 Storm 迁移到 Flink 的时候,如果让用户重新基于 Flink 进行逻辑开发,可能需要比较大的工作量。因此我们对 Flink 进行了调研,发现有个 Flink-Storm 工具。它实现了将 Storm Topology 转到 Flink Topology。比如说,把 spout 转换到 Flink 的 source function,把 bolt 转换到 Transform 和 sink function。

在使用的过程中我们也发现一些问题,Flink-Storm 工具无法支持 Yarn 模式, 缺少 Storm 引擎功能,最后还有一个比较大的问题,我们的 storm 在发展过程中维护了很多版本,但是 Flink-Storm 工具只支持基于一个版本进行开发。于是,我们做了一些改进。

img

3. 对 Flink-Storm 的改进

3.1 消息保障

Storm 有三个特点:

我们做了四点改进:

img

3.2 对 Storm 定时器的支持

在早期版本里面其实是没有窗口机制的,我们借助 Storm 定时机制来实现窗口计算。它的机制是这样的,Storm 引擎会定时向 bolt 里面发送一个系统信号,用户就可以通过这个系统信号进行一个切分,模拟窗口操作。

同样,Flink 也没有这样一个定时器的机制,于是我们就考虑从 Flink-Storm 层面来实现,改造了 BoltWrapper 类,它作为 bolt 类的一个封装,实现机制跟 bolt 是一样的,包括 5 点:

图片

3.3 Storm on Yarn

Storm on yarn 并不是直接提交到 YARN 集群,它只是提交到 local 或者 stand alone 的模式。Flink on yarn 主要是提供了 ClusterClient 这样一个代理,实现方式有三个步骤:

  1. 初始化 YarnClusterConfiguration Flink 配置 执行 jar 包 / 资源配置 加载 classpath;

  2. 启动 yarn client;

  3. 复用 Flink on yarn 机制 deploy 转换后的 jobGraph。

图片

4. 任务迁移

在完善上述的一些改进之后,迁移就比较容易了。首先我们会把改造后的版本打包,上传到公司的私服上。然后用户在他的工程里面只需要引入 jar 包。在代码这一块,只需要将原来基于 storm 的提交方式改造成基于 Flink 的提交方式,逻辑是完全不用动的。在任务部署模式这一块,也提供了 Flink 提交的模式,这样一个脚本可以实现 Flink Perjob 模式。

图片

总结一下,除了一些比较极端的复杂情况,基本上做到了无缝迁移所有的任务。迁移到 Flink 之后,大部分任务的延迟都降低到毫秒级别,整个吞吐提升 3~5 倍。同时,整体资源节省了大概 40%,约等于 80 台机器。完成了 5 个 storm 集群完全下线,实现了任务平台化管理。

图片

四、一站式实时计算平台

1. Wstream 平台

我们为了提升管理效率而打造了 Wstream 平台,它构建在底层引擎和上层应用之间,对用户可以屏蔽底层的集群信息,比如跨机房多集群的一些信息。

用户可以在 Wstream 平台之上很好的去构建他们的应用。

图片

2. 状态管理

状态作为 Flink 一个比较重要的特性,在实际场景中有大量的应用。用户在使用平台的时候,没法跟底层的 Flink 工具进行交互,于是我们就将底层的一些能力进行了集成。

对于整个任务状态管理来说,我们通过 jobgraph 设置定向到指定 Hdfs 目录,进行统一目录管理。在状态小文件这块,控制并发度,jobgraph 优化,checkpoint 间隔时间,保留版本数量。

图片

3. SQL 调试

针对 Flink SQL,我们也提供了一些调试功能。这里主要包括两块:

这样我们可以更方便的对整个业务逻辑进行调试。

图片

4. 任务监控

关于任务监控,对于 Flink 实时计算任务来说,我们主要关心的是任务的稳定性、性能方面、以及业务逻辑是否符合预期。对于如何监控这些指标,主要包括 4 个层面:

图片

5. 监控体系

为了采集这些指标,我们也基于 Prometheus 搭建了一套监控体系。对于所有的 Flink 任务,会实时将 metrics 推到 pushgateway,然后会将收集到的指标推到 Prometheus,这一块我们主要是采用的 federation 的机制。所有子节点负责指标采集,之后汇聚到一个中心节点,由中心节点统一对外提供服务。最终可以实现整个指标的计算和告警。

图片

6. 监控告警

有了上面这些指标之后,我们在告警这一块就可以比较方便。针对实时计算比较关注的任务稳定性方面,我们可以从 Topic 消息消费堆积、任务计算 qps 波动、Flink task Restart、Flink Checkpoint failed、任务失败、延迟等信息来观察整个任务的运行情况。

图片

7. 指标可视化

在指标可视化这一块,主要是两个层面:

图片

五、后续规划

我们的后续规划,主要包括 4 个方面:

图片
上一篇下一篇

猜你喜欢

热点阅读