作者:刘康
本文来自 7 月 26 日在上海举行的 Flink Meetup 会议,分享来自于刘康,目前在大数据平台部从事模型生命周期相关平台开发,现在主要负责基于 flink 开发实时模型特征计算平台。熟悉分布式计算,在模型部署及运维方面有丰富实战经验和深入的理解,对模型的算法及训练有一定的了解。
本文主要内容如下:
- 在公司实时特征开发的现状基础上,说明实时特征平台的开发背景、目标以及现状
- 选择 Flink 作为平台计算引擎的原因
- Flink 的实践:有代表性的使用示例、为兼容 Aerospike(平台的存储介质)的开发以及碰到的坑
- 当前效果 & 未来规划
一、在公司实时特征开发的现状基础上,说明实时特征平台的开发背景、目标以及现状
1、原实时特征作业的开发运维;
1.1、选择实时计算平台:依据项目的性能指标要求(latency,throughput 等),在已有的实时计算平台:Storm Spark flink 进行选择
1.2 主要的开发运维过程:
- 80% 以上的作业需要用到消息队列数据源,但是消息队列为非结构化数据且没有统一的数据字典。所以需要通过消费对应的 topic,解析消息并确定所需的内容
- 基于需求中的场景,设计开发计算逻辑
- 在实时数据不能完全满足数据需求的情况,另外开发单独的离线作业以及融合逻辑;
例如:在需要 30 天数据的场景下,但消息队列中只有七天内的数据时(kafka 中消息的默认保留时间),剩下 23 天就需要用离线数据来补充。
- 设计开发数据的校验和纠错逻辑
消息的传输需要依赖网络,消息丢失和超时难以完全避免,所以需要有一个校验和纠错的逻辑。
- 测试上线
- 监控和预警
2、原实时特征作业的开发痛点
- 消息队列数据源结构没有统一的数据字典
- 特征计算逻辑高度定制化,开发测试周期长
- 实时数据不能满足需求时,需要定制离线作业和融合逻辑
- 校验和纠错方案没有形成最佳实践,实际效果比较依赖个人能力
- 监控和预警方案需要基于业务逻辑定制
3、基于整理的痛点,确定下来的平台目标
- 实时数据字典:提供统一的数据源注册、管理功能,支持单一结构消息的 topic 和包含多种不同结构消息的 topic
- 逻辑抽象:抽象为 SQL,减少工作量 & 降低使用门槛
- 特征融合:提供融合特征的功能,解决实时特征不能完全满足数据需求的情况
- 数据校验和纠错:提供利用离线数据校验和纠错实时特征的功能
- 实时计算延迟:ms 级
- 实时计算容错:端到端 exactly-once
- 统一的监控预警和 HA 方案
4、特征平台系统架构
现在的架构是标准 lamda 架构,离线部分由 spark sql + dataX 组成。现在使用的是 KV 存储系统 Aerospike,跟 redis 的主要区别是使用 SSD 作为主存,我们压测下来大部分场景读写性能跟 redis 在同一个数据量级。
实时部分:使用 flink 作为计算引擎,介绍一下用户的使用方式:
- 注册数据源:目前支持的实时数据源主要是 Kafka 和 Aerospike,其中 Aerospike 中的数据如果是在平台上配置的离线或者实时特征,会进行自动注册。Kafka 数据源需要上传对应的 schemaSample 文件
- 计算逻辑:通过 SQL 表达
- 定义输出:定义输出的 Aerospike 表和可能需要的 Kafka Topic, 用于推送 Update 或者 Insert 的数据的 key
用户完成上面的操作后,平台将所有信息写入到 json 配置文件。下一步平台将配置文件和之前准备好的 flinkTemplate.jar(包含所有平台所需的 flink 功能) 提交给 yarn,启动 flink job。
5、平台功能展示
1)平台功能展示 - 数据源注册
2)实时特征编辑 - 基本信息
3)实时特征编辑 - 数据源选择
4)实时特征编辑 -SQL 计算
5)实时特征编辑 - 选择输出
二、选择 Flink 的原因
我们下面一个我们说一下我们选择 flink 来做这个特征平台的原因。
分为三个维度:最高延迟、容错、sql 功能成熟度
- 延迟:storm 和 flink 是纯流式,最低可以达到毫秒级的延迟。spark 的纯流式机制是 continuous 模式,也可以达最低毫秒级的延迟
- 容错:storm 使用异或 ack 的模式,支持 atLeastOnce。消息重复解决不。spark 通过 checkpoint 和 WAL 来提供 exactlyOnce。flink 通过 checkpoint 和 SavePoint 来做到 exactlyOnce。
-
sql 成熟度:storm 现在的版本中 SQL 还在一个实验阶段, 不支持聚合和 join。spark 现在可以提供绝大部分功能,不支持 distinct、limit 和聚合结果的 order by。flink 现在社区版中提供的 sql,不支持 distinct aggregate
三、Flink 实践
1、实⽤示例
2、兼容开发:flink 现在没有对 Aerospike 提供读写支持,所以需要二次开发
3、碰到的坑
四、平台当前效果 & 未来规划
当前效果:将实时特征上线周期从原平均 3 天 - 5 天降至小时级。未来规划:
- 完善特征平台的功能:融合特征等
- 简化步骤,提高用户体验
- 根据需求,进一步完善 SQL 的功能例如支持 win 的开始时间 offset,可以通过 countTrigger 的 win 等
下一步的规划是通过 sql 或者 DSL 来描述模型部署和模型训练