Apache Flink 社区最新动向及 1,9 版本的功能展望 伍翀

QCon大会

2019/06/25 发布于 技术 分类

QCon  QCon2019 

文字内容
1. Apache Flink 社区最新动向 及 1.9 版本的功能展望 伍翀 (云邪)
2. 目录
3. 自我介绍 n 伍翀(云邪,Jark) n Apache Flink Committer l ⾃自 Flink v1.0 开始在社区贡献 l 专注⼯工作于 Flink Table & SQL 已有3年年 n 阿⾥里里巴巴 Blink SQL 的开发与优化
4. 目录 • Flink 当前架构与问题 • Flink 未来架构与解决方案 • Flink 1.9 新特性预览 • Flink 社区最新动态总结
5. 背景 • Apache Flink: 流批统一的新一代大数据引擎 • Alibaba Blink: 阿里巴巴基于 Apache Flink 打造的企业级计算引擎 • Blink 开源:2019-01-28 《阿里正式向 Apache Flink 贡献 Blink 源码》 • 合并 Blink 计划:2019-02-13 《Batch as a Special Case of Streaming and Alibaba's contribution of Blink》 本演讲所涉及的部分内容还在讨论和设计阶段,并不代表最终呈现的样子。
6. 当前架构
7. Flink 当前架构 DataStream API DataSet API Stream Processing Batch Processing Runtime Table API & SQL Relational Operator Tree DataStream API DataSet API Stream Processing Batch Processing Runtime Transformation Batch Plan StreamGraph Distributed Streaming Dataflow Optimized Plan Local Cluster Cloud Single JVM Standalone, YARN GCE, EC2 Job Graph Stream Task & StreamOperator Batch Task & Driver
8. 存在的问题? 从架构设计、代码质量、开发的角度来看 Table API & SQL Relational DataStream API DataSet API Stream Processing Batch Processing • 不同的 DAG 表示形式和翻译路径 • 不同的算子实现:StreamOperator, Driver Runtime Operator Tree Transformation • 不同的 Task 执行:StreamTask,BatchTask • DataSet 有自己的小型优化器与 SQL 优化器打架 Batch Plan StreamGraph • 基于 DataSet 开发的语义很难和标准 SQL 保持一致 Optimized Plan • 算子在流批之间无法共享 Job Graph • 两套完全独立的 connector 集合 • 潜在问题:两条独立的技术栈 -> 需要更多的人力 -> 功能开发变慢、性能提升变难,bug变多 Stream Task & StreamOperator Batch Task & Driver Deploy
9. 未来架构
10. 批是流的一个特例,我们是否可以…? DataStream API DataSet API Stream Processing Batch Processing 完成!
11. Runtime 改动 • JobGraph 需要加强,携带上有界性等信息 • FLINK-11875:基于 push 模型的可选边的 Operator Batch: pull-based (Driver) Stream: push-based (StreamOperator)
12. Runtime 改动 • JobGraph 需要加强,节点携带上有界性等信息 • FLINK-11875:基于 push 模型的可选边的 Operator • FLINK-10429:插件化调度机制 • FLINK-10288:高效的批处理作业恢复 • FLINK-10653:插件化 Shuffle Service
13. Table API & SQL 改动 • FLINK-11439:INSERT INTO flink_sql SELECT * FROM blink_sql 模块拆分 flink-table-common flink-table-api-java flink-table-api-scala Blink Runner flink-table-runtime-blink flink-table-planner-blink flink-table-planner Flink Runner
14. Flink 新架构 Table API & SQL Table API & SQL DataStream API Relational Relational Batch & Stream Processing DataStream API DataSet API Stream Processing Batch Processing DAG API & StreamOperator Runtime Runtime Distributed Streaming Dataflow Local Cluster Cloud Local Cluster Cloud Single JVM Standalone, YARN GCE, EC2 Single JVM Standalone, YARN GCE, EC2
15. Flink SQL 1.9 新特性预览
16. Flink SQL 1.9 新特性预览 BinaryRow 大量性能优化 DDL 维表 Join 完整高效的批处理支持 TopN Hive 集成
17. 改进的基础数据结构—— BinaryRow 旧数据结构: Row n Java 对象的空间开销⾼高 n 主类型的装箱和拆箱开销 n 昂贵的 hashCode() 和 (反)序列列化 Row Object[] Integer(321) String(“awesome”) String(“flink”)
18. 改进的基础数据结构—— BinaryRow 新数据结构: BinaryRow n 避免了了很多反序列列化开销 不不仅在批处理理中表现出⾊色, 在流处理理中也收获了了⼀一倍的提升 n 与内存管理理紧密结合 n CPU 缓存友好 offset to var length data null bits 0x000.. 321 32L 7 Fixed length part 39L 5 “awesome” “flink” Variable length part
19. Unified SQL DDL (preview) 流处理 CREATE TABLE kafka_orders ( order_id VARCHAR, product VARCHAR, 定义了schema amount BIGINT, order_ts TIMESTAMP, 定义了一个计算列 proctime AS PROCTIME(), 定义了watermark WATERMARK FOR order_ts AS BOUNDED WITH DELAY '10' SECOND ) WITH ( connector='kafka', kafka.topic='orders', kafka.zookeeper.connect='localhost:2181', 定义了表的属性,包括存储类型, kafka.bootstrap.servers='localhost:9092', 连接信息,读取的范围,有界性 kafka.group.id='testGroup', kafka.startup-offset='earliest', kafka.end-offset='none', ... ); SELECT product, TUMBLE_START(order_ts, INTERVAL '1' MINUTE), COUNT(*) FROM kafka_orders GROUP BY product, TUMBLE(order_ts, INTERVAL '1' MINUTE);
20. Unified SQL DDL (preview) 批处理 CREATE TABLE kafka_orders ( order_id VARCHAR, product VARCHAR, amount BIGINT, order_ts TIMESTAMP, proctime AS PROCTIME(), WATERMARK FOR order_ts AS BOUNDED WITH DELAY '10' SECOND ) WITH ( connector='kafka', kafka.topic='orders', kafka.zookeeper.connect='localhost:2181', kafka.bootstrap.servers='localhost:9092', kafka.group.id='testGroup', kafka.startup-offset='earliest', kafka.end-offset='2019-05-28 00:00:00', ... ); SELECT product, TUMBLE_START(order_ts, INTERVAL '1' MINUTE), COUNT(*) FROM kafka_orders GROUP BY product, TUMBLE(order_ts, INTERVAL '1' MINUTE);
21. 维表 JOIN (preview) CREATE TABLE mysql_products ( product_id VARCHAR, product_name VARCHAR, price DECIMAL, PRIMARY KEY (productId) ) WITH ( connector = 'mysql' … ); SELECT o.*, p.* FROM kafka_orders AS o JOIN mysql_products FOR SYSTEM_TIME AS OF o.proctime AS p ON o.product_id = p.product_id
22. TopN SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY category ORDER BY sales DESC) AS rownum FROM shop_sales) WHERE rownum <= 3 • 支持分组 TopN • 针对细分场景,3种不同实现,优化器自动选择 result category shopId sales rownum book shop-43 89 1 book shop-46 56 2 book shop-58 43 3 fruit shop-12 78 1 fruit shop-44 67 2 fruit shop-32 57 3 … … … …
23. 大量流处理性能优化 • MiniBatch • Local 聚合 • Distinct Agg 自动热点打散 • Distinct State 共享 • 细分场景,特定算子实现 • 100+ 优化规则
24. 完整批处理能力支持和性能提升 TPC-H Results for Batch (lower is better) 600 500 400 300 200 100 0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 Blink q11 q12 q13 Flink 1.6.0 q14 q15 q16 q17 q18 q19 q20 q21 q22
25. Hive 集成 • 统一的 Catalog 接口 • 提供基于内存和可持久化的 Catalog 实现 • 提供 Hive Catalog,支持与 Hive 的互操作 • 支持在 Flink 中运行 Hive UDF
26. Flink 社区最新动态
27. Flink 社区最新动态 • 计划于 7 月份发布 Flink 1.9 • SQL: • FLIP-32: 重构 Table 模块,使其同时支持多个 Runner • FLINK-11439: Merge Blink 分支的大部分 SQL 功能 (进度90%) • FLIP-29: 增强 Table API 功能 • Runtime: • • • • FLINK-11875:基于 push 模型的可选边的 Operator FLINK-10429:插件化调度机制 FLINK-10288:高效的批处理作业恢复 FLINK-10653:插件化 Shuffle Service • 生态: • FLIP-30: 插件化 Catalog,支持 Hive Meta Store • FLIP-38: Python Table API • FLIP-39: 基于 Table API 实现一套全新的 ML Pipeline
28. 总结
29. 总结 • Flink 1.9 将是具有里程碑意义的一个版本 • Flink 有史以来改动最大的一个版本,所有模块都在迎接变化 • 改造之后,Flink 将具备比较完善流批一体的技术架构 • 用户将有一个较好的流批统一的体验 • 希望能有更多人加入到社区一起努力