作者 | 梅源(Yuan Mei)
11 月 28 - 30 日,北京迎来了入冬以来的第一场雪,2019 Flink Forward Asia(FFA)也在初雪的召唤下顺利拉开帷幕。尽管天气寒冷,FFA 实际到会人次超过 2000,同比去年增加近 100%。
Flink Forward 是由 Apache 官方授权举办的会议,每年在欧洲、北美洲、亚洲各举办一场。通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到业界围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者的盛会。去年 12 月 Flink Forward 首次在中国举办,是规模最大、参与人数最多的 Flink Forward 大会。今年 Flink Forward China 正式升级为 Flink Forward Asia,吸引到更多的关注,并于 11 月 28 日在北京开幕。
除了参会人数的迅速增加,多元化也是今年 FFA 的一大闪光点。笔者根据大会纲要数了一下,大约有超过 25 家来自北美,欧洲和亚洲的公司,高校以及科研机构参与分享了超过 45 个议题。国内外一线大牌互联网公司齐聚一堂,其乐融融。这也说明越来越多的业界公司更加看好 Flink,并且深度参与 Flink 的规划与发展,这无论是对 Flink 的未来还是 Flink 社区的发展都有非常积极的意义。
经过几年的发展,Flink 已经成为 Apache 最活跃的社区和在 Github *问量前三的项目。Github 的星数(代表项目受欢迎程度)在 2019 一年之内翻了一番。Apache Flink 在中国本土也更加的普及,下图列出了一些使用 Flink 作为实时计算解决方案的中国公司 logo。
笔者总体的参会感受:引擎一体化和生态多元化是 Flink 一以贯之的发展策略。引擎一体化指的是离线(batch),实时(streaming)和在线(application)应用在执行层面的一体化。生态多元化指的是对 AI 生态环境的搭建和对更多生态的支持,包括 Hive,Python,Kubernetes 等。
接下来,笔者将根据自己参加的议题聊一聊参会的体验和一些自己的思考,希望能对感兴趣的同学有所助益。
主会场议题
在主议题之前有两个环节值得提一提。一是作为主场的阿里云智能请出阿里集团 CTO 兼阿里云智能总裁张建锋作为开场嘉宾进一步强化阿里集团以数据智能为驱动,All in Cloud 的决心以及开源的 Flink 在此过程中起到的关键性作用。下图很好地提炼了他的演讲。
二是由阿里云天池平台和 Intel 联合举办的 Apache Flink 极客挑战赛颁奖仪式。本次比赛吸引了全球超过 4000 名参赛者,经过四个月的四轮角逐最终产生共 10 个优胜队伍。值得一提的是获奖选手中有两位女将,未来也期待能有更多的妹子参与进来,放一张照片瞻仰一下。
下面言归正传,聊一聊几个主议题。
Stateful Function
照例,第一个主议题由 Flink 一哥 Stephan Ewen 执棒。作为对 Flink Forward 柏林站的延续,Stephan 继续推广他对 Flink 作为应用服务场景(Applications and Services)通用引擎的展望和规划。简而言之,他认为 Flink 除了能够做到批流一体,Flink 框架对于事件驱动的在线应用也可以有效甚至更好的支持,如下图所示:
我的理解是他所指的应用服务场景(Applications and Services)和传统意义上的 OLTP 类似。云上对此类问题的主流解决方案是现在很火的 FaaS (Function as a Service),但通常会有以下四方面痛点:
Bottlenecked by state access & I/O
State Consistency Problem
Scalability of Database (storing the states)
Connections and Request rates
特别是在应用逻辑非常复杂的情况下,应用逻辑之间的组合调用会更加复杂,并且加剧上面四个痛点的复杂度。
同时你会发现上面的这些问题都和 State 的存储(storage),读写(access)以及一致性(consistency)相关,而 Flink 的 Stream Processing 框架可以很好的解决这些和状态相关的问题。所以 Stateful Function 在 Flink 现有的框架上拓展了对 Function Composition 和 Virtual Instance(轻量级的 Function 资源管理)的支持,以达到对应用服务场景(Application)的通用支持。
目前所有 Stateful Function 代码均已开源,在获得社区认可后也会 merge 回 Apache Flink,有兴趣的同学可以去官网自己实践一下:https://statefun.io/ 。在分议题 Apache Flink 核心技术中也有一场专门讲 Stateful Function 的实现,使用和 demo,小伙伴们也可以去感受一下,题目叫“Stateful Functions: Unlocking the next wave of applications with Stream Processing”。
看到这里可能还是会觉得不太直观,我结合自己的理解再多说两句,我们可以从两个维度理解 Stateful Function:
- Stateful Function 到底要解决什么问题
- 为什么 Stateful Function 比现有的解决方案更好
设想如图所示的场景,我们使用 Lyft 打共享车。在乘客发起打车请求以后,Lyft 首先会根据乘客的定位,空闲司机的状态,目的地,交通状况和个人喜好给乘客推荐不同类型车辆的定价。在乘客选择定价以后,Lyft 会根据乘客的喜好(比如有些司机被乘客拉了黑名单),司机的喜好(乘客也有可能被司机拉了黑名单),司机和乘客的相对位置以及交通状况进行匹配,匹配完成后订单开始。在这个例子中,我们会发现:
- 有很多 Function Composition:乘客的喜好的计算,司机的喜好计算,司机和乘客相对位置计算,交通状况计算,以及最终匹配计算。
- 状态的一致性的重要:在匹配的过程中如果发生错误,在保持状态一致性的情况下回滚非常重要。我们不希望一个乘客匹配给两个司机,也不希望一个司机匹配给两个乘客,更不希望乘客或者司机因为一致性问题无法得到匹配。
Stateful Function 在 Flink 开源 Runtime 的基础上很好的解决了 Function Composition 和 State Consistency 的问题。
下面讨论一下第二个维度:为什么 Stateful Function 比现有的解决方案更好。我的理解是 Stateful Function 提供了更清晰的 abstraction。Stateful Function 把消息传输、状态管理从 Function 中隔离出来,使得用户只需要关注 Function 计算逻辑本身,而不需要关注 Function 的调度,组合等问题,这也使得 Stateful Function 框架能有更多的*度为 Function 调度组合等问题做优化。当然这只是我个人的理解,抛砖引玉。
Flink Heading Towards a Unified Engine
第二场由阿里巴巴实时计算负责人王峰(阿里花名:莫问)接棒,主要总结了 2019 年 Apache Flink 在一体化引擎发展方面的成果和未来的方向。他认为未来 Flink 的发展趋势是一体化:包括离线(batch),实时(streaming)和在线(application)一体化。在此基础上,也需要把拥抱 AI 和云原生纳入到一体化中。后面的内容就是围绕这三方面来展开的。
对于批流融合,通过 1.9 和 1.10 两个版本的发布,Flink 在 SQL 和 Table API 的层面以及 Flink runtime 层面对批流模式已经做到统一。对于 Flink SQL,在 1.10 这个版本里面,已经可以实现完整的 DDL 功能,兼容 Hive 生态系统并且支持 Python UDF。
总体得到的讯息是:
Flink SQL 在批模式下经过多方验证已经达到生产可用的状态。
Flink SQL 可以在 Hive 生态上直接运行,没有迁移成本。
Flink SQL 可以做到批流在 SQL 优化,算子层以及分布式运行层的一体化。
另外这部分印象比较深刻的一点是:跑 TPC-DS benchmark,Flink 1.10 比 Hive-3.0 快 7 倍:
在 AI 部分,2019 Flink 重点主要在优化和铺垫 AI 的基础设施部分:
- Flink 1.9 发布一套标准化的 Machine Learning Pipeline API (这个 pipeline 的概念最早在 Scikit-learn 中提出,在其他生态中也有广泛的采纳)。AI 的开发人员可以使用这套 API(Transformer,Estimator,Model)来实现机器学习算法。
- 更好的支持 Python 生态。Flink 1.10 在 Table API 中可以支持 Python UDF,复用了 Beam 的 Python 框架来进行 Java 和 Python 进程之间的通讯。
- Alink 开源发布。
Alink 是基于 Flink 的机器学习算法库,最大的亮点是对流式和在线学习的支持。这是开源地址 https://github.com/alibaba/alink ,感兴趣的同学可以研究一下。
在 AI 部分还有一个很值得期待的项目是 Flink AI 明年的一个重点投入方向:AI Flow。AI Flow 为 AI 链路定制了一套完整的解决方案:包括从 data acquisition,preprocessing,到 model training & validation & serving 以及 inference 的一整套链路。这个方案是针对解决现在 AI 链路里面数据预处理复杂,离线训练和在线预测脱钩等问题定制的,让我们拭目以待。
此外还有一个重要的方向是 Flink 对云原生生态的支持,具体来说就是与 Kubernetes 生态的深度融合。Kubernetes 环境可以在 multi-user 的场景下提供更好的隔离,对 Flink 在生产的稳定性方面会有所提升。Kubernetes 广泛应用在各种在线业务上,Flink 与 Kubernetes 的深度融合可以在更大范围内统一管理运维资源。Kubernetes 生态本身发展很快,可以给 Flink 在生产中提供更好的运维能力。后面 Lyft 和其他企业在分享中也提到希望 Flink 对 Kubernetes 可以原生地支持,也有以上这些方面的考虑。Flink 在 1.10 版本发布后可以原生地运行在 Kubernetes 之上。
阿里巴巴通过 1.9 和 1.10 两个版本历经 1 年左右将 Blink 中比较通用的部分悉数回馈给 Apache Flink 社区,回馈总代码数超过一百万行。阿里内部的 Blink 内核也逐步会由 Flink 内核替换,并且推出基于 Flink 内核的企业版 Ververica Platform,明年 1 月会正式商用。
另外这部分演讲中的两个 demo 让我眼前一亮。一个是基于 Flink + Hive + Zeppelin 的 Flink SQL demo,看完以后可以深刻感受到“可以在 Hive 生态上直接运行,没有迁移成本“,以及“一套 SQL,批流一体运行”的真正含义。还有一个是 Alink ML 基于 Jupyter 的 demo,看完以后我发现现在机器学习模型训练和使用可以如此简单,感兴趣的同学可以找来看看。
Storage Reimagined for a Streaming World
第三个议题是由戴尔科技集团带来的流式存储议题: Pravega。
他们的主要观点是随着流式计算在大企业用户中越来越广泛的应用,流式计算对存储也产生了新的需求:流式存储。需求来自两个方面:一是大型企业用户希望计算框架流程化繁为简,从而提出对流式计算存储一体化的需求;二是批流的计算一体化本身也对存储提出批流一体化需求。
在后面的分会场议题开源大数据生态中,Pravega 还有一场更偏技术的分享,包括整体的设计架构,如何保证 exactly once 语义,Stream Segment 如何更方便的提供 scaling up/down 等等,感兴趣的同学也可以看看,题目叫“Delivering stream data reliably with Pravega”。
这个议题本身也很有趣。不可避免的,我们会想到流式存储和通常意义上的消息队列系统(例如 Kafka)之间有什么区别,毕竟 infinite retention 的消息队列系统也可以被看成是一个 stream storage。另一个比较有趣的问题是一体化的抽象应该在哪个层面上来做,以及如何做。换言之,读写是否应该和存储分离,只提供统一的API?因为笔者对 storage 这块儿细节不是特别了解,这里就不班门弄斧了,感兴趣的小伙伴我们可以私下讨论。分议题中还有一场关于 Pulsar 的,也相关,题目叫“基于 Pulsar 和 Flink 进行批流一体的弹性数据处理”。
基于 Apache Flink 的大规模准实时数据分析平台
主议题的最后一场是 Flink 实践,是由 Lyft 带来的大规模准实时数据分析平台的分享。这里所说的准实时,指端到端数据延迟不超过 5 分钟,在 Lyft 内部主要用于数据交互式查询,下图是 Lyft 准实时平台架构图。
Flink 在整个架构中是用来做流数据注入的,Flink 向 AWS S3 以 Parquet 的格式持久化数据,并以这些原始数据为基础,进行多级 non-blocking 的 ETL 加工(压缩去重),建立实时数仓,用于交互式数据查询。
在这个分享中印象深刻的几点:
- Flink 的高效性。据 Lyft 的大佬们讲,这个新的平台相较于先前基于 Kinesis Client 的 ingestion 相比较,仅数据注入部分的集群就缩减了 10%,所以他们对 Flink 的高效性是非常认可的。
- Lyft 也提到,他们花了蛮多精力基于 Flink 的 StreamingFileSink 来解决 Flink 和 ETL 之间 watermark 的同步问题。其实我很希望他们能分享一下为何压缩去重(ETL)部分不也用 Flink 来做。如果是技术上的问题可以帮助 Flink 更好的完善自己。
- Lyft 提到 Flink 的重启和部署会对 SLO 造成延迟影响,subtask 停滞会造成整个 pipeline 的停滞以及期望 Flink 能够有一套在 Kubernetes 环境下运行的方案。其实这里提到的几点也在其他的几场企业实践分享中被提到,这些也是当前 Flink 亟待解决的几大痛点。社区对这几点都有规划,分议题中有一场“Pluggable Shuffle Service and Unaligned Checkpoints”有针对 Flink 重启和停滞的讨论;“Optimize Apache Flink on Kubernetes with YuniKorn Scheduler”讨论了一些和 Kubernetes 应用相关的问题。
除了 Lyft,在分会场中也有很多企业参与分享了自己使用和深度参与 Flink 开发的经验和教训。Flink 不仅在国内公司中深受欢迎,很多北美欧洲的公司比如 Netflix,Uber 和 Yelp 也越来越多的使用和开发 Flink,感兴趣的同学可以关注一下分会场议题中的“企业实践”和“实时数仓”专场。
分会场议题
分会场议题主要围绕着上面四个主议题展开,分为五个专场:
Apache Flink 核心技术:主要针对 Flink 1.9 和 1.10 中比较核心的技术更新。
人工智能:除了主议题已经包括的,Flink+TensorFlow 的实践分享也很有趣。
企业实践:字节跳动、快手、滴滴、网易、爱奇艺、Bilibili、360 等分享的实践经验。
实时数仓:Netflix,美团,小米等分享的基于 Flink 的数仓平台。
开源大数据生态:和 Flink 生态相关的内容,主要包括 Zeppelin,Kubernetes,Hive 等等。
由于篇幅关系,这里就不作展开了,分议题清单和所有PPT资料请点击:https://developer.aliyun.com/article/737925。
总结和感想
三天的 FFA,感触颇深。Flink 创始人之一 Ververica CEO Kostas Tzoumas 感慨说,五年前当他们 5 个初创刚刚开始 Flink 这个项目的时候无法想象今天 Flink 能有如此大的生态和如此广的应用。虽然我无法深切体会到他的感受,但是当前 Flink 社区的繁荣和 Flink 的应用广度是有目共睹的,但更重要的问题是:未来我们如何延续这种繁荣。Flink 在经历了高性能流式引擎,批流一体两代发展后,我们确实需要思考一下未来的 Flink 是什么样的。
在这届 FFA 中一直强调一体化和多元化的概念,也就是开篇讲的引擎一体化和生态多元化,具象化来说有三点:Stateful Function,拥抱AI,云原生。再到下一个层面也给 Flink 引擎本身提出更多的要求,这是挑战当然也是机遇。古语云瑞雪兆丰年, FFA 在北京的初雪中圆满落下帷幕,也让我们共同努力,把握好机遇一起迎接挑战,共创美好的 Flink 2020。最后,分享一张一哥 Stephan 在 Flink Forward Asia 的 cool 照作为全篇的收尾,大家一起感受一下。