前言
Flink Forward Asia 2020 三天的分享已经结束,在这次分享上,自己也收获到了很多。这里写一篇文章来记录下自己这次的收获和总结,从个人的视角以及理解,和大家一起分享下,当然,如果有理解错误的地方,也欢迎大家指出。
1. Flink 已经成为实时计算事实标准
我相信很多公司实时计算的发展都是从 Strom 到 Spark Streaming ,然后再到 Flink 这样一个发展的历程。从引擎本身来讲,Flink 支持更低的实时计算时延,以及对于任务状态的支持。目前从国内各大公司使用来看,Flink 已经成为了各个公司在实时计算方面的首选,同时 Flink 社区也非常的活跃,Flink 所支持功能也在不断的完善。Apache Flink 已经成为各行业实时计算方面的事实标准。
2. Flink + AI
Flink 本质是一个流式计算引擎,那么实时计算出的数据要发挥数据本身的价值,与 AI 结合,便是一个非常好的方向。
Alink 今年新增数十个开源算法,同时在算法工作流方面,开源了 Flink AI Flow ,可以看到 Flink 在机器学习方面,功能迭代的速度也很快,希望未来我们能够使用 Flink 机器学习方面的能力,去更好的解决业务的需求。
我们内部算法在 Flink 方面,目前感觉应用相对较少,不像字节,光在算法特征实时处理方面,就有上万加实时任务,所以我思考明年能不能和算法同学,在实时方面,能够有更多的合作。当然,这个合作的前提,是我们的实时平台,在 Flink SQL 方面,能够更加的方便好用,功能完善。
3. Flink 批流一体化
今年 FFA 大会上听到最多的一个词,批流一体化,那么是否所有的企业都要去做批流一体呢,我觉得具体还是要看业务方的诉求和痛点。也就是说,是否需要批流一体,是业务方自己决定的,每个公司肯定都有自己的需求和痛点,所以也并不是一定要去做批流一体。
关于 Flink 批流一体,我觉得下面这个总结挺好的,Flink 批流一体化,并不是说去代替 Spark ,而是在实时业务场景中,业务方有一些批处理方面的需求,对于这方面批处理的需求,用 Flink 来满足。所以批流一体的需求,最初是来源于实时业务方。
这次也听了黄晓峰老师从批流一体化业务实践的分享,我觉得总结挺好的。先来说批流一体化的的优势:
上面是我对于的批流一体的理解,从我个人来看,目前 Flink 批处理能力与 Spark 对比,肯定还是稍逊一筹的,毕竟 Spark 已经非常成熟了,同时也在离线方面做了很多优化。不过随着 Flink 在批处理方面的能力优化,未来如果批处理方面的性能与 Spark 相差不大时,同时上面的痛点越来越大,那么业务方就可以去考虑批流一体。是否批流一体,是业务方自己决定,我们会基于 Flink 提供这样的能力,至于是否使用,取决于业务方。
4. 实时任务智能诊断
这次分享也看到很多公司在做实时任务智能诊断功能,实时任务智能诊断就是从不同角度去检测用户的实时任务,是否有异常情况,以及什么地方异常等,让用户根据智能诊断的结果,优化实时任务。打个比方,假设现在检测到用户的实时任务 Full GC 比较多,同时反压情况比较严重,智能诊断就能够提示用户调整内存,同时告诉用户具体是那个算子反压,智能化给出异常结果,更好的帮助用户专注于实时业务逻辑的开发,而不是实时任务优化方面。
这次谢亚东老师也带来了《基于 Monitoring REST API 的 Flink 轻量级作业诊断》的分享,整体使用 Flink Rest API 的一些指标查询接口,对于 Flink 作业进行诊断,主要从运行状态、数据处理、状态稳定三个方面对实时任务进行诊断,整体上还是很有参考意义的。
我觉得如果你们公司没有做实时任务智能诊断的话,可以参考这个思路来设计开发一个,当实时任务有异常情况时,也能借助于这个工具,快速定位到具体原因和解决,尽可能减少对于线上业务的使用的影响。
目前我是打算做一个实时任务诊断工具,会结合 Flink Rest API Monitor 相关接口,然后针对公司内部的实时任务可能出现的异常情况(会按照异常情况的危险级)排序,以及公司内部实时任务的一般特性,针对性的来做,这样也能帮助业务方更好的优化实时任务。
5. Flink on k8s 功能
目前主流的实时任务计算资源有两类:Yarn 和 K8s ,其中 Yarn 的比例居多。很多公司已经开始打算把 Flink on Yarn 往 Flink on k8s 上迁移,至于为什么 Flink 要往 K8s 上面迁移,社区同学给出了见解:
我们公司目前 Flink Jar 任务已经全部容器化了,对于我们,容器化的好处有三点:
如果你们公司想上 K8s,对于比较低的 Flink 版本,比如 1.7 ,1.8 的话,可以尝试 Flink Operator 的方案来实践。如果版本比较新的话,比如 1.10 以上,那么我觉得完全可以将版本升级到 1.12,然后直接使用 1.12 的 k8s 社区功能。最保底的方案就是自己对于 Flink 任务打镜像,然后创建任务的 Deployment 以及 Service 等,不过这种方式使用门槛较高,同时还需要考虑 Flink on k8s 非云原生的问题,这里还是推荐去使用社区的 K8s 功能。
6. Flink on 数据湖
最后,最近一个非常火的概念,数据湖。那么到底什么是数据湖呢,我个人的理解,首先数据湖是一种数据架构,它不仅能够存储结构化数据,也能够存储半结构化以及非结构化的数据,旨在对于企业数据进行统一的存储。目前在数据湖方面,比较火的有 Iceberg 以及 Hudi:
Iceberg 目前还不支持数据 Upsert(社区在做),但是底层抽象度很好,同时不和任何计算引擎绑定,目前国内大厂几乎都是选择 Iceberg 来进行功能扩展。当然,现在 Hudi 也在尽可能减少对于 Spark 的耦合,现在也已经在重构底层的代码。未来到底是 Hudi 还是 Iceberg,让我们拭目以待。
目前社区已经在做 Flink Iceberg Sink Connector,已经可以使用,在1.12 版本,不过不支持 Upsert 功能,iceberg 社区正在做这块,主要是胡争大佬,哈哈,大家有问题可以问他。Flink Hudi Sink Connector 也在开发中,未来具体使用哪个,业务方可以根据公司内部情况,来决定使用那个。
目前我们内部在数据湖方面,主要还是偏调研性质,同时也在评估引入数据湖技术所带来的收益以及我们的投入成本,整体还是观望状态,等到数据湖技术成熟以及业务方的相关痛点和需求之后,我们应该也会引入。至少在实时 BI 看板方面,我觉得 Flink + 数据湖 + Presto(或者其他) 能够进行统一掉,我们之前使用的是 Flink + kafka + Druid,Kafka 和 Druid 的成本,相对于 HDFS + Presto的成本,肯定是前者高。