
**导读:**自如作为一家专注于提供租房产品和服务的 O2O 互联网公司,构建了一个涵盖城市居住生活领域全链条的在线化、数据化、智能化平台,实时计算在自如一直扮演着重要的角色。到目前为止,自如每日需要处理 TB 级别的数据,本文由来自自如的实时计算小伙伴带来,介绍了自如基于 StreamPark 的实时计算平台深度实践。
- 实时计算遇到的挑战
- 需求解决方案之路
- 基于 StreamPark 的深度实践
- 实践经验总结和示例
- 带来的收益
- 未来规划
自如作为提供租房产品及服务的 O2O 互联网品牌,成立于 2011 年 10 月,自如已为近 50 万业主、500 万自如客提供服务,管理房源超过 100 万间。截至 2021 年 3 月,自如已开通北京、上海、深圳、杭州、南京、广州、成都、天津、武汉、苏州 10 大城市。 自如通过打造涵盖 To C 和 To B 的品质居住产品、逐步实现城市居住生活领域全链条的线上化、数据化、智能化的平台能力。自如 APP 装机量累计达 1.4 亿次,日均线上服务调用达 4 亿次,拥有智能化房源万余间。自如现已在 PC、APP、微信全渠道实现租房、服务、社区的 O2O 闭环,省去传统租房模式所有中间冗余环节,通过 O2O 模式重构居住市场格局,并建立了中国最大的 O2O 青年居住社区。
在拥有庞大用户 群体情况下,自如为了给用户提供更加优质的产品体验,实现企业的数字化转型,从 2021 年开始大力发展实时计算,Flink 在自如的实时计算中一直扮演着重要的角色。到目前为止,自如每日需要处理 TB 级别的数据,总共拥有 500+ 个实时作业,并支撑每日超过 1000 万次的数据调用请求。
实时计算遇到的挑战
在自如,实时计算大概分为 2 个应用场景:
-
数据同步:包括 Kafka、Mysql、Mongo 数据同步到 Hive / Paimon / ClickHouse 等。
-
实时数仓:包括出租、收房、家服等业务实时指标。
在实时计算实践过程中遇到了一些挑战,大致如下:
01 作业上线效率低
在自如实时作业的开发上线流程是:数据仓库开发人员将 Flink SQL 代码嵌入到程序中,在本地进行代码调试,然后编译成 FatJar,最后再将作业以工单和 JAR 包形式提交给运维,运维负责作业上线的小伙伴再通过命令行的方式将作业部署到线上 Kubernetes session 环境。可以看到这一过程涉及到诸多环节,每一步都是需要人为介入,效率极其低下,而且非常容易出错,影响工作效率和稳定性。因此,我们亟需构建一套高效、自动化的实时计算平台,以满足日益增涨的实时计算需求。

02 作业归属信息不明确
由于实时计算平台没有对作业进行统一管理,业务代码都是由 GitLab 管理,虽然解决了部分问题,但是我们发现仓库代码与线上部署的 Flink 作业管理之间仍然存在缺陷:缺乏明确归属、缺少分组和有效权限控制,导致作业管理混乱且责任链路难以追溯。为确保代码和上线作业的一致和可控性,亟需建立严格且清晰的作业管理体系,其中包括实行严格的代码版本控制、明确作业归属和负责人、以及建立有效的权限控制。
03 作业维护困难
在自如有多个不同版本的 Flink 作业在运行,由于 Apache Flink® 的 API 在大版本升级中经常会发生变动,且不保证向下兼容性,这直接导致流作业项目代码的升级成本变得很高。因此如何管理这些不同版本的作业成了头痛的问题。
由于没有统一的作业平台,这些作业在提交时,只能通过执行脚本的形式进行提交。不同的作业有不同重要程度和数据量级,作业所需资源和运行参数也都各不相同,都需要相应的修改。我们可以通过修改提交脚本或直接在代码中设置参数来进行修改,但这使得配置信息的获 取变得困难,尤其是当作业出现重启或失败时,FlinkUI 无法打开,配置信息变成一个黑盒。因此,亟需建立一个更加高效、支持配置实时计算平台。
04 作业开发调试困难
在以往的开发流程中,我们通常在本地的 IDEA 环境中,通过将 SQL 代码嵌入程序代码的方式进行作业的开发和调试,以验证程序的正确性。然而,这种方式存在如下弊端:
1.多数据源调试困难。通常,一个需求可能涉及多个不同的数据源。为了在本地环境调试,开发人员需要申请开通数据访问需要的白名单,这一过程既耗时又繁琐。
2.SQL 代码难以阅读和修改。由于 SQL 代码是嵌入在程序代码中的,这使得代码难以阅读,修改起来也相当不便。更为困难的是,当需要通过 SQL 片段的方式进行调试时,由于缺少 SQL 版本管理和语法校验的支持,开发人员很难通过客户端日志定位到具体的 SQL 行号,从而找出执行失败的原因。
因此,急需提高开发、调试的效率
寻求解决方案之路
在平台构建的初期阶段,2022 年初开始我们就全面调查了行业内的几乎所有相关项目,涵盖了商业付费版和开源版。经过调查和对比发现,这些项目都或多或少地存在一定的局限性,可用性和稳定性也无法有效地保障。
综合下来 StreamPark 在我们的评估中表现最优,是唯一一个没有硬伤且扩展性很强的项目:同时支持 SQL 和 JAR 作业,在 Flink 作业的部署模式上也是最为完善和稳定的,特有的架构设计使得不仅不会锁定 Flink 版本,还支持便捷的版本切换和并行处理,有效解决了作业依赖隔离和冲突的问题。我们重点关注的作业管理 & 运维能力也非常完善,包括监控、告警、SQL 校验、SQL 版本对比、CI 等功能,StreamPark 对 Flink on K8s 的支持也是我们调研的所有开源项目中最为完善的。但 StreamPark 的 K8s 模式提交需在本地构建镜像导致存储资源消耗。
目前在最新的 2.2 版本中社区已经重构了这部分实现
在深入分析了众多开源项目的优缺点后,我们认为可以先去参与了解那些拥有优秀的架构、充满发展潜力,并且核心团队积极努力的项目,投身其中。基于这样的认识,我们做出了如下决策:
1.在作业部署模式上,我们决定采用 On Kubernetes 的模式。实时作业的资源消耗具有动态性,对 Kubernetes 提供的弹性扩缩容有强烈的需求,这有助于我们更好地应对数据产出的波动,确保作业的稳定运行。
2.在开源组件的选择上,我们经过各项指标综合对比评估,最终选择了当时的 StreamX。后续和社区保持密切的沟通,在此过程中深刻感受到创始人认真负责的态度和社区的团结友善的氛围,也见证了项目 2022 年 09 月加入 Apache 孵化器的过程,这让我们对该项目的未来充满希望。
3.在 StreamPark 基础上,我们要推动与公司已有生态的整合,以便更好地满足我们的业务需求。