阿里妹导读:如同咱们去年12月在 Flink Forward China 峰会所约,阿里巴巴内部 Flink 版本 Blink 将于 2019 年 1 月底正式开源。今天,咱们终于等到了这一刻。web
阿里资深技术专家大沙,将为你们详细介绍本次开源的Blink主要功能和优化点,但愿与业界同仁共同携手,推进Flink社区进一步发展。算法
Apache Flink是德国柏林工业大学的几个博士生和研究生从学校开始作起来的项目,早期叫作Stratosphere。2014年,StratoSphere项目中的核心成员从学校出来开发了Flink,同时将Flink计算的主流方向定位为流计算,并在同年将Flink捐赠Apache,后来快速孵化成为Apache的顶级项目。如今Flink是业界公认的最好的大数据流计算引擎。性能优化
阿里巴巴在2015年开始尝试使用Flink。可是阿里的业务体量很是庞大,挑战也不少。彼时的Flink无论是规模仍是稳定性还没有经历实践,成熟度有待商榷。为了把这么大的业务体量支持好,咱们不得不在Flink之上作了一系列的改进,因此阿里巴巴维护了一个内部版本的Flink,它的名字叫作Blink。网络
基于Blink的计算平台于2016年正式上线。截至目前,阿里绝大多数的技术部门都在使用Blink。Blink一直在阿里内部错综复杂的业务场景中锻炼成长着。对于内部用户反馈的各类性能、资源使用率、易用性等诸多方面的问题,Blink都作了针对性的改进。虽然如今Blink在阿里内部用的最多的场景主要仍是在流计算,可是在批计算场景也有很多业务上线使用了。例如,在搜索和推荐的算法业务平台中,它使用Blink同时进行流计算和批处理。Blink被用来实现了流批一体化的样本生成和特征抽取这些流程,可以处理的特征数达到了数千亿,并且每秒钟处理数亿条消息。在这个场景的批处理中,咱们单个做业处理的数据量已经超过400T,而且为了节省资源,咱们的批处理做业是和流计算做业以及搜索的在线引擎运行在一样的机器上。因此你们能够看到流批一体化已经在阿里巴巴取得了极大的成功,咱们但愿这种成功和阿里巴巴内部的经验都可以带回给社区。数据结构
其实从咱们选择Flink的第一天开始咱们就一直和社区紧密合做。过去的这几年咱们也一直在把阿里对Flink 的改进推回社区。从2016年开始咱们已经将流计算SQL的大部分功能,针对runtime的稳定性和性能优化作的若干重要设计都推回了社区。可是Blink自己发展迭代的速度很是快,而社区有本身的步伐,不少时候可能没法把咱们的变动及时推回去。对于社区来讲,一些大的功能和重构,须要达成共识后,才能被接受,这样才能更好地保证开源项目的质量,可是同时就会致使推入的速度变得相对较慢。通过这几年的开发迭代,咱们这边和社区之间的差距已经变得比较大了。架构
Blink 有一些很好的新功能,好比性能优越的批处理功能,在社区的版本是没有的。在过去这段时间里,咱们不断听到有人在询问Blink的各类新功能。指望Blink尽快开源的呼声愈来愈大。咱们一直在思考如何开源的问题,一种方案就是和之前同样,继续把各类功能和优化分解,逐个和社区讨论,慢慢地推回Flink。但这显然不是你们所期待的。另外一个方案,就是先完整的尽量的多的把代码开源,让社区的开发者可以尽快试用起来。第二个方案很快收到社区广大用户的支持。所以,从2018年年中开始咱们就开始作开源的相关准备。通过半年的努力,咱们终于把大部分Blink的功能梳理好,开源了出来。运维
咱们把代码贡献出来,是为了让你们能先尝试一些他们感兴趣的功能。Blink永远不会单独成为一个独立的开源项目来运做,他必定是Flink的一部分。开源后咱们指望能找到办法以最快的方式将Blink merge到Flink中去。Blink开源只有一个目的,就是但愿 Flink 作得更好。Apache Flink 是一个社区项目,Blink以什么样的形式进入 Flink 是最合适的,怎么贡献是社区最但愿的方式,咱们都要和社区一块儿讨论。机器学习
在过去的一段时间内,咱们在Flink社区征求了普遍的意见,你们一致认为将本次开源的Blink代码做为Flink的一个branch直接推回到Apache Flink项目中是最合适的方式。而且咱们和社区也一块儿讨论规划出一套可以快速merge Blink到Flink master中的方案(具体细节能够查看Flink社区正在讨论的FLIP32)。咱们指望这个merge可以在很短的时间内完成。这样咱们以后的Machine Learning等其余新功能就能够直接推回到Flink master。相信用不了多久,Flink 和 Blink 就彻底合二为一了。在那以后,阿里巴巴将直接使用Flink用于生产,并同时协助社区一块儿来维护Flink。性能
本次开源的Blink代码在Flink 1.5.1版本之上,加入了大量的新功能,以及在性能和稳定性上的各类优化。主要贡献包括,阿里巴巴在流计算上积累的一些新功能和性能的优化,一套完整的(可以跑通所有TPC-H/TPC-DS,可以读取Hive meta和data)高性能Batch SQL,以及一些以提高易用性为主的功能(包括支持更高效的interactive programming, 与zeppelin更紧密的结合, 以及体验和性能更佳的Flink web)。将来咱们还将继续给Flink贡献在AI,IoT以及其余新领域的功能和优化。更多的关于这一版本Blink release的细节,请参考Blink代码根目录下的README.md文档。下面,我来分模块介绍下Blink主要的新的功能和优化点。学习
为了更好的支持batch processing,以及解决阿里巴巴大规模生产场景中遇到的各类挑战,Blink对Runtime架构、效率、稳定性方面都作了大量改进。在架构方面,首先Blink引入了Pluggable ShuffleArchitecture,开发者能够根据不一样的计算模型或者新硬件的须要实现不一样的shuffle策略进行适配。此外Blink还引入新的调度架构,允许开发者根据计算模型自身的特色定制不一样调度器。为了优化性能,Blink可让算子更加灵活的chain在一块儿,避免了没必要要的数据传输开销。在Pipeline Shuffle模式中,使用了ZeroCopy减小了网络层内存消耗。在BroadCast Shuffle模式中,Blink优化掉了大量的没必要要的序列化和反序列化开销。
此外,Blink提供了全新的JM FailOver机制,JM发生错误以后,新的JM会从新接管整个JOB而不是重启JOB,从而大大减小了JM FailOver对JOB的影响。最后,Blink也开发了对Kubernetes的支持。不一样于Standalone模式在Kubernetes上的拉起方式,在基于Flink FLIP6的架构上基础之上,Blink根据job的资源需求动态的申请/释放Pod来运行TaskExecutor,实现了资源弹性,提高了资源的利用率。
SQL/TableAPI架构上的重构和性能的优化是Blink本次开源版本的一个重大贡献。首先,咱们对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版本和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)等等。
咱们此次开源的版本实现了在元数据(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可以更好的支持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的例子: 一个是作StreamingETL的例子, 另外两个分别是作Flink Batch,Flink Stream的基础样例。
咱们对Flink Web的易用性与性能等多个方面作了大量的改进,从资源使用、做业调优、日志查询等维度新增了大量功能,使得用户能够更方便的对Flink做业进行运维。在资源使用方面,新增了Cluster、TaskManager与Job三个级别的资源信息,使得资源的申请与使用状况一目了然。做业的拓扑关系及数据流向能够追溯至 Operator 级别,Vertex 增长了InQueue,OutQueue等多项指标,能够方便的追踪数据的反压、过滤及倾斜状况。TaskManager 和 JobManager 的日志功能获得大幅度增强,从Job、Vertex、SubTask 等多个维度均可以关联至对应日志,提供多日志文件访问入口,以及分页展现查询和日志高亮功能。
另外,咱们使用了较新的Angular 7.0 对Flink web进行了全面重构,页面运行性能有了一倍以上的提高。在大数据量状况下也不会发生页面卡死或者卡顿状况。同时对页面的交互逻辑进行了总体优化,绝大部分关联信息在单个页面就能够完成查询和比对工做,减小了大量没必要要的跳转。
Blink迈出了全面开源的第一步,接下来咱们会和社区合做,尽量以最快的方式将Blink的功能和性能上的优化merge回Flink。本次的开源版本一方面贡献了Blink多年在流计算的积累,另外一方面又重磅推出了在批处理上的成果。接下来,咱们会持续给Flink社区贡献其余方面的功能。咱们指望每过几个月就能看到技术上有一个比较大的亮点贡献到社区。下一个亮点应该是对机器学习的支持。要把机器学习支持好,有一系列的工做要作,包括引擎的功能,性能,和易用性。这里面大部分的工做咱们已经开发完成,而且不少功能都已经在阿里巴巴内部服务上线了。
除了技术上创新以及新功能以外,Flink的易用性和外围生态也很是重要。咱们已经启动了若干这方面的项目,包括Python以及Go等多语言支持,Flink集群管理,Notebook,以及机器学习平台等等。这些项目有些会成为Flink自身的一部分贡献回社区,有些不是。但它们都基于Flink,是Flink生态的一个很好的补充。独立于Flink以外的那些项目,咱们都也在认真的考虑开源出来。总之,Blink在开源的第一天起,就已经彻底all-in的融入了Flink社区,咱们但愿全部的开发者看到咱们的诚意和决心。
将来,不管是功能仍是生态,咱们都会在Flink社区加大投入,咱们也将投入力量作 Flink 社区的运营,让 Flink 真正在中国、乃至全世界大规模地使用起来。咱们衷心的但愿更多的人加入,一块儿把Apache Flink开源社区作得更好!
本文来自云栖社区合做伙伴“阿里技术”,如需转载请联系原做者。