加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动互联 > 正文

阿里巴巴Blink正式开源,重要优化点解读

发布时间:2019-01-29 20:05:05 所属栏目:移动互联 来源:大沙
导读:Apache Flink 是德国柏林工业大学的几个博士生和研究生从学校开始做起来的项目,早期叫做 Stratosphere。2014 年,StratoSphere 项目中的核心成员从学校出来开发了 Flink,同时将 Flink 计算的主流方向定位为流计算,并在同年将 Flink 捐赠 Apache,后来快

首先,我们对 SQL engine 的架构做了较大的调整。提出了全新的 Query Processor(QP), 它包括了一个优化层(Query Optimizer)和一个算子层(Query Executor)。这样一来,流计算和批计算的在这两层大部分的设计工作就能做到尽可能地复用。另外,SQL 和 TableAPI 的程序最终执行的时候将不会翻译到 DataStream 和 DataSet 这两个 API 上,而是直接构建到可运行的 DAG 上来,这样就使得物理执行算子的设计不完全依赖底层的 API,有了更大的灵活度,同时执行代码也能够被灵活的 codegen 出来。

唯一的一个影响就是这个版本的 SQL 和 TableAPI 不能和 DataSet 这个 API 进行互相转换,但仍然保留了和 DataStream API 互相转换的能力(将 DataStream 注册成表,或将 Table 转成 DataStream 后继续操作)。未来,我们计划把 dataset 的功能慢慢都在 DataStream 和 TableAPI 上面实现。到那时 DataStream 和 SQL 以及 tableAPI 一样,是一个可以同时描述 bounded 以及 unbounded processing 的 API。

除了架构上的重构,Blink 还在具体实现上做了较多比较大的重构。

首先,Blink 引入了二进制的数据结构 BinaryRow,极大的减少了数据存储上的开销以及数据在序列化和反序列化上计算的开销。

其次,在算子的实现层面,Blink 在更广范围内引入了 CodeGen 技术。由于预先知道算子需要处理的数据的类型,在 QP 层内部就可以直接生成更有针对性更高效的执行代码。Blink 的算子会动态的申请和使用资源,能够更好的利用资源,提升效率,更加重要的是这些算子对资源有着比较好的控制,不会发生 OutOfMemory 的问题。

此外,针对流计算场景,Blink 加入了 miniBatch 的执行模式,在 aggregate、join 等需要和 state 频繁交互且往往又能先做部分 reduce 的场景中,使用 miniBatch 能够极大的减少 IO,从而成数量级的提升性能。除了上面提到的这些重要的重构和功能点,Blink 还实现了完整的 SQL DDL,带 emit 策略的流计算 DML,若干重要的 SQL 功能,以及大量的性能优化策略。

有了上面提到的诸多架构和实现上的重构。Blink 的 SQL/tableAPI 在功能和性能方面都取得了脱胎换骨的变化。在批计算方面,首先 Blink batch SQL 能够完整地跑通 TPC-H 和 TPC-DS,且性能上有了极大的提升。

阿里巴巴Blink正式开源,重要优化点解读

如上图所示,是这次开源的 Blink 版本和 spark 2.3.1 的 TPC-DS 的 benchmark 性能对比。柱状图的高度代表了运行的总时间,高度越低说明性能越好。可以看出,Blink 在 TPC-DS 上和 Spark 相比有着非常明显的性能优势,而且这种性能优势随着数据量的增加而变得越来越大。在实际的场景这种优势已经超过 Spark 三倍,在流计算性能上我们也取得了类似的提升。我们线上的很多典型作业,性能是原来的 3 到 5 倍。在有数据倾斜的场景,以及若干比较有挑战的 TPC-H query,流计算性能甚至得到了数十倍的提升。

除了标准的 Relational SQL API。TableAPI 在功能上是 SQL 的超集,因此在 SQL 上所有新加的功能,我们在 tableAPI 也添加了相对应的 API。除此之外,我们还在 TableAPI 上引入了一些新的功能。其中一个比较重要是 cache 功能。在批计算场景下,用户可以根据需要来 cache 计算的中间结果,从而避免不必要的重复计算,它极大地增强了 interactive programming 体验。我们后续会在 tableAPI 上添加更多有用的功能。其实很多新功能已经在社区展开讨论并被社区接受,例如我们在 tableAPI 增加了对一整行操作的算子 map/flatMap/aggregate/flatAggregate (Flink FLIP29) 等等。

Hive 的兼容性

我们这次开源的版本实现了在元数据(meta data)和数据层将 Flink 和 Hive 对接和打通。国内外很多公司都还在用 Hive 在做自己的批处理。对于这些用户,现在使用这次 Blink 开源的版本,就可以直接用 Flink SQL 去查询 Hive 的数据,真正能够做到在 Hive 引擎和 Flink 引擎之间的自由切换。

为了打通元数据,我们重构了 Flink catalog 的实现,并且增加了两种 catalog,一个是基于内存存储的 FlinkInMemoryCatalog,另外一个是能够桥接 Hive metaStore 的 HiveCatalog。有了这个 HiveCatalog,Flink 作业就能读取 Hive 的 metaData。为了打通数据,我们实现了 HiveTableSource,使得 Flink job 可以直接读取 Hive 中普通表和分区表的数据。因此,通过这个版本,用户可以使用 Flink SQL 读取已有的 Hive meta 和 data,做数据处理。未来我们将在 Flink 上继续加大对 Hive 兼容性的支持,包括支持 Hive 特有的 query,data type,和 Hive UDF 等等。

Zeppelin for Flink

为了提供更好的可视化和交互式体验,我们做了大量的工作让 Zeppelin 能够更好的支持 Flink。这些改动有些是在 Flink 上的,有些是在 Zeppelin 上的。在这些改动全部推回 Flink 和 Zeppelin 社区之前,大家可以使用这个 Zeppelin image (具体细节请参考 Blink 代码里的 docs/quickstart/zeppelin_quickstart.md) 来测试和使用这些功能。

这个用于测试的 Zeppelin 版本,首先很好地融合和集成了 Flink 的多种运行模式以及运维界面。使用文本 SQL 和 tableAPI 可以自如的查询 Flink 的 static table 和 dynamic table。此外,针对 Flink 的流计算的特点,这一版 Zeppelin 也很好地支持了 savepoint,用户可以在界面上暂停作业,然后再从 savepoint 恢复继续运行作业。

在数据展示方面,除了传统的数据分析界面,我们也添加了流计算的翻牌器和时间序列展示等等功能。为了方便用户试用,我们在这一版 zeppelin 中提供 3 个 built-in 的 Flink tutorial 的例子: 一个是做 Streaming ETL 的例子, 另外两个分别是做 Flink Batch, Flink Stream 的基础样例。

阿里巴巴Blink正式开源,重要优化点解读

Flink Web

我们对 Flink Web 的易用性与性能等多个方面做了大量的改进,从资源使用、作业调优、日志查询等维度新增了大量功能,使得用户可以更方便的对 Flink 作业进行运维。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读