本篇文章6069字,读完约15分钟

指南:

正如我们去年12月在福林福沃德中国峰会上商定的那样,阿里的内部福林克版本将于2019年1月底正式开放,我们终于等到了这一刻。

阿里* * * *的技术专家达莎将详细介绍这款开源眨眼的主要功能和优化点,希望与业内同仁携手,共同推动flink社区的进一步发展。

blinkongithub

github/apache/flink/tree/blink

眨眼入门

阿帕奇链接是由德国柏林技术大学的几名博士生和研究生发起的一个项目,在早期被称为同温层。2014年,同温层项目的核心成员从学校出来开发flink。同时,flink计算的主流方向是面向流计算。同年,弗林克被捐赠给阿帕奇,然后它很快孵化成阿帕奇的* * *项目。现在,flink被认为是行业内一个不错的大数据流计算引擎。

阿里正式向 Apache Flink 贡献 Blink 源码

阿里在2015年开始尝试弗林克。然而,阿里的业务量是巨大的,有许多挑战。当时,从规模和稳定性的角度来看,弗林克还没有付诸实践,它的成熟性值得商榷。为了支持如此大的业务量,我们必须对flink进行一系列的改进,所以阿里保留了flink的内部版本,叫做blink。

阿里正式向 Apache Flink 贡献 Blink 源码

基于眨眼的计算平台于2016年正式推出。到目前为止,眨眼已经被阿里的大多数技术部门使用。眨眼一直在阿里复杂的商业环境中训练和成长。Blink在各种性能、资源利用率、易用性和内部用户反馈的许多其他方面都做出了有针对性的改进。虽然blink在阿里使用的* * *场景主要是在流计算中,但许多企业在批量计算场景中使用在线。例如,在搜索和推荐算法业务平台中,它使用闪烁进行流量计算和批处理。眨眼用于实现样本生成和特征提取的流程,每秒钟可以处理数千亿个特征和数亿条信息。在这种情况下的批处理中,我们的单个作业处理的数据量已经超过400t,为了节省资源,我们的批处理作业在与流计算作业和搜索的在线引擎相同的机器上运行。因此,我们可以看到,流程和批次的整合在阿里取得了巨大的成功,我们希望这一成功和阿里的内部经验能够带回社区。

阿里正式向 Apache Flink 贡献 Blink 源码

眨眼开源的背景

事实上,自从我们选择了弗林克,我们就一直与社区紧密合作。在过去的几年里,我们一直在把阿里在弗林克的进步推回到社区。自2016年以来,我们已经将流计算sql的大部分功能和一些重要的运行时稳定性和性能优化设计推回到社区。然而,blink自己的开发迭代速度非常快,并且社区有自己的速度,这可能不会及时推回我们的变更。对于社区来说,一些大的功能和重构需要在被接受之前达成共识,以便更好地保证开源项目的质量,但同时,* * *会导致推送速度变得相对较慢。经过几年的开发迭代,我们这边和社区之间的差距变得更大了。

阿里正式向 Apache Flink 贡献 Blink 源码

Blink有一些很好的新功能,比如具有卓越性能的批处理,这在社区版本中是不可用的。在过去,我们听到人们询问眨眼的新功能。越来越多的人要求blink尽快开放源代码。我们一直在思考如何开放源代码。一个解决方案* * *是继续像以前一样分解各种函数和优化,一个接一个地与社区讨论它们,然后慢慢地将它们推回flink。但这显然不是所有人所期望的。另一个解决方案,* * *,就是首先完全开放尽可能多的代码,这样社区就可以尽快尝试它。第二个方案很快得到了社区用户的支持。因此,从2018年年中开始,我们开始为开源做准备。经过半年的努力,我们终于理清了blink的大部分功能,开辟了新的来源。

阿里正式向 Apache Flink 贡献 Blink 源码

闪烁开源方法

我们贡献代码,这样每个人都可以先尝试一些他们感兴趣的功能。Blink永远不会作为一个独立的开源项目运行,它必须是flink的一部分。在开源之后,我们期望找到一种方法来快速地将眨眼合并到flink中。眨眼开源只有一个目的,* * *就是希望弗林克能做得更好。Apacheflink是一个社区项目。眨眼以什么形式进入弗林克是合适的,如何贡献是社区的希望。我们应该和社区讨论一下。

阿里正式向 Apache Flink 贡献 Blink 源码

在过去的一段时间里,我们在弗林克社区征求了广泛的意见,每个人都认为这是一种* * *合适的方式,可以将这个开源的眨眼代码作为弗林克的一个分支直接推回到Apache弗林克项目中。此外,我们与社区讨论并计划了一个可以快速将flink并入flinkmaster的方案(详见flip32由flink社区讨论)。我们预计这次合并将在短时间内完成。这样,机器学习* * *等其他新功能就可以直接推回到flinkmaster。我相信用不了多久弗林克和眨眼***就会完全融为一体。之后,阿里将直接使用火石进行生产,同时协助社区维护火石。

阿里正式向 Apache Flink 贡献 Blink 源码

这个开源闪烁的主要功能和优化点

这种开源的闪烁代码为Flink 1 . 5 . 1版增加了许多新的功能,并在性能和稳定性方面进行了各种优化。主要贡献包括阿里在流计算方面积累的一些新功能和性能优化,一套完整的高性能batchsql(可以运行所有tpc-h/tpc-ds,并读取hivemeta和数据),以及一些专注于提高可用性的功能(包括支持更高效的交互编程、与齐柏林飞艇更紧密的集成以及具有更好的体验和性能的flinkweb)。未来,我们将继续在人工智能、物联网和其他新领域为flink贡献功能和优化。有关此版本blinkrelease的更多详细信息,请参考blink代码根目录中的readme.md文档。接下来,我将在模块中介绍眨眼的主要新功能和优化点。

阿里正式向 Apache Flink 贡献 Blink 源码

运行时

为了更好地支持batchprocessing并解决Ali大规模生产场景中遇到的各种挑战,blink在运行时架构、效率和稳定性方面做了大量改进。在体系结构方面,blink首先引入了pluggabelshufflearyarchitecture,并且* * *可以根据不同的计算模型或新硬件的需求来适应不同的洗牌策略。此外,blink还引入了一种新的调度架构,允许* * *根据计算模型本身的特性定制不同的调度器。为了优化性能,闪烁链使运营商更加灵活,避免不必要的数据传输开销。在pipelineshuffle模式下,零拷贝用于减少网络层内存消耗。在broadcastshuffle模式下,blink优化了许多不必要的序列化和反序列化开销。

阿里正式向 Apache Flink 贡献 Blink 源码

此外,blink提供了一种全新的jmfailover机制。在jm失败后,新的jm将接管整个作业,而不是重新启动作业,从而大大降低了jmfailover对作业的影响。在* * *,眨眼也发展了对库本内特斯的支持。与kubernetes上独立模式的上拉模式不同,基于flinkflip6架构,blink根据作业的资源需求动态请求/释放pod来运行taskexecutor,实现了资源的灵活性,提高了资源利用率。

阿里正式向 Apache Flink 贡献 Blink 源码

●sql/tableapi

sql/tableapi架构的重构和性能的优化是blink开源版本的一大贡献。首先,我们对sqlengine的架构做了很大的调整。提出了一种新的查询处理器(qp),它包括查询优化层和操作层。这样,这两层中的流量计算和批量计算的大部分设计工作都可以尽可能地重用。

阿里正式向 Apache Flink 贡献 Blink 源码

此外,sql和tableapi的程序在最终执行时不会被转换为数据流和数据集,而是直接构建在运行的dag上,因此物理执行操作符的设计不完全依赖于底层的api,具有更大的灵活性。同时,执行代码也可以由灵活的codegen生成。* * *影响之一是此版本的sql和tableapi不能用dataset api进行转换,但它仍然保留了用datastreamapi进行转换的能力(将数据流注册为表,或将表转换为数据流后继续操作)。未来,我们计划在数据流和tableapi上实现数据集的功能。那时,数据流就像sql和tableapi一样,是一个可以同时描述有界和无界处理的api。

阿里正式向 Apache Flink 贡献 Blink 源码

除了架构上的重构之外,blink在具体实现上做了越来越多的重构。首先,blink引入了二进制数据结构binaryrow,大大降低了数据存储开销以及序列化和反序列化中的数据计算开销。其次,在运营商的实施层面,blink在更大范围内引入了codegen技术。因为操作员需要处理的数据类型是预先知道的,所以可以在qp层直接生成更有针对性和效率的执行代码。

阿里正式向 Apache Flink 贡献 Blink 源码

眨眼操作者可以动态申请和使用资源,这样可以更好的利用资源,提高效率。更重要的是,这些运营商对资源有更好的控制,不会出现内存不足的问题。此外,针对流计算场景,blink加入了迷你批处理的执行模式。在聚合和连接等场景中,需要频繁地与状态交互,并且通常先进行部分减少,使用迷你批处理可以大大减少io,从而将性能提高几个数量级。除了上面提到的这些重要的重构和功能点,blink还实现了完整的sqlddl、带有emit策略的dml、几个重要的sql函数以及大量的性能优化策略。

阿里正式向 Apache Flink 贡献 Blink 源码

通过上面提到的架构和实现中的重构。Blink的sql/tableapi在功能和性能上做了很大的改变。在批处理计算中,blinkbatchsql可以完全运行tpc-h和tpc-ds,其性能得到了极大的提高。如上图所示,这是开源flash版本和spark2.3.1的tpc-ds之间的基准性能比较。直方图的高度代表总运行时间,高度越低,性能越好。可以看出,闪烁在性能上明显优于火花。此外,随着数据量的增加,这种性能优势越来越大。在实际场景中,这个优势已经超过火花三次。我们在流计算性能方面也做了类似的改进。对于我们生产线上的许多典型工作,它的性能是原来的3到5倍。在数据倾斜和一些具有挑战性的tpc-hquery场景中,流计算的性能甚至提高了几十倍。

阿里正式向 Apache Flink 贡献 Blink 源码

除了标准关系之外。Tableapi是sql in函数的超集,所以对于所有新添加的sql函数,我们都在tableapi中添加了相应的api。此外,我们在tableapi中引入了一些新函数。其中一个更重要的是缓存功能。在批量计算场景中,用户可以根据需要缓存计算的中间结果,从而避免不必要的重复计算。它极大地增强了交互式编程的体验。稍后我们将向tableapi添加更多有用的函数。事实上,许多新的功能已经在社区中讨论并被社区所接受。例如,我们在tableapi中添加了一个运算符map/flat map/aggregate/flat aggregate(flink flip 29),等等。

阿里正式向 Apache Flink 贡献 Blink 源码

●蜂巢兼容性

我们的开源版本在元数据和数据层实现了flink和hive之间的连接。国内外许多公司仍在使用hive进行自己的批量加工。对于这些用户来说,现在使用这个开源版本的blink,* * *,可以直接使用flinksql查询蜂巢数据,并且可以在蜂巢引擎和flink引擎之间自由切换。

阿里正式向 Apache Flink 贡献 Blink 源码

为了获取元数据,我们重新构建了flinkcatalog的实现,并添加了两种目录,一种是基于内存存储的FlinkMemorycatalog,另一种是可以桥接hivemetastore的hivecatalog。有了这个hivecatalog,flink作业* * *可以读取hive的元数据。为了获取数据,我们实现了hivetablesource,这样flinkjob就可以直接读取hive中常用表和分区表的数据。因此,有了这个版本,用户可以使用flinksql读取现有的hivemeta和数据进行数据处理。未来,我们将继续增加对flink上的hive兼容性的支持,包括对hive的唯一查询、数据类型、hiveudf等的支持。

阿里正式向 Apache Flink 贡献 Blink 源码

齐柏林森林公园

为了提供更好的视觉和互动体验,我们做了大量的工作来让齐柏林飞船更好地支持弗林克。这些变化有些在弗林克,有些在齐柏林飞船上。在所有这些变化被推回到弗林克和齐柏林飞艇社区之前,你可以使用这个齐柏林飞艇模型(请参考文档/快速启动/齐柏林飞艇_快速启动. md中的闪烁代码了解详细信息)来测试和使用这些功能。这款用于测试的齐柏林飞艇版本,首次整合了flink的各种运行模式和操作维护界面。通过使用文本sql和tableapi,可以自由地查询flink的静态表和动态表。

阿里正式向 Apache Flink 贡献 Blink 源码

此外,根据弗林克流计算的特点,这个版本的齐柏林飞艇也非常支持保存点。用户可以暂停界面上的作业,然后从保存点恢复运行作业。在数据展示方面,除了传统的数据分析界面,我们还增加了流量计算和时间序列展示等触发器。为了方便用户试用,我们在这个版本的齐柏林飞艇中提供了三个内置flinktutorial的例子:一个是streamingetl的例子,另外两个是Flink Batch和Flink Stream的基本例子。

阿里正式向 Apache Flink 贡献 Blink 源码

flinkweb

我们在flinkweb的可用性和性能方面做了很多改进,并且从资源使用、作业优化、日志查询等方面增加了很多功能。,这使得用户更容易操作和维护flink作业。在资源使用方面,增加了三个层次的资源信息,即集群、任务管理器和作业,使资源的应用和使用一目了然。作业的拓扑关系和数据流可以追溯到操作员级别。vertex增加了inqueue和outqueue等索引,可以方便地跟踪数据的背压、过滤和倾斜。任务管理器和作业管理器的日志功能得到了很大的增强,可以从作业、顶点、子任务等多个维度关联相应的日志。,并提供多个日志文件访问条目,以及分页显示查询和日志突出显示功能。

阿里正式向 Apache Flink 贡献 Blink 源码

此外,我们使用更新的angular7.0完全重建flinkweb,页面运行性能提高了一倍多。即使在数据量很大的情况下,页面还是会被卡住。同时,从整体上优化了页面的交互逻辑,可以在单个页面上查询和比较大部分相关信息,从而减少了大量不必要的跳转。

阿里正式向 Apache Flink 贡献 Blink 源码

未来规划

眨眼已经迈出了全面开源的* * *一步。接下来,我们将与社区合作,尽快将眨眼的功能和性能优化合并回flink。一方面,这个开源版本多年来为blink在流计算领域的积累做出了贡献,另一方面,它也在批处理领域取得了成就。接下来,我们将继续为弗林克社区贡献其他功能。我们预计每隔几个月* * *就会看到一个为社区做出贡献的技术亮点。下一个亮点应该是对机器学习的支持。为了更好地支持机器学习,需要完成一系列任务,包括引擎功能、性能和易用性。这项工作的大部分已经开发出来,许多功能已经在阿里的内部服务中启动。

阿里正式向 Apache Flink 贡献 Blink 源码

除了技术创新和新功能,flink的可用性和周边生态也非常重要。我们已经在这个领域启动了几个项目,包括多语言支持,如python和go、flink集群管理、笔记本和机器学习平台。这些项目中的一些将成为弗林克自身的一部分,并为社区做出贡献,而另一些则不是。但它们都是基于弗林克,这是弗林克生态学的一个很好的补充。除了flink之外,独立于那些项目,我们也在认真考虑开源。总之,自从第一次* * *开源以来,blink已经完全融入了flink社区,我们希望所有* * *都能看到我们的诚意和决心。

阿里正式向 Apache Flink 贡献 Blink 源码

今后,我们将加大对福林克社区的投资,包括功能和生态方面的投资,也将投资福林克社区的运营,使福林克能够在中国乃至全世界大规模使用。我们真诚地希望更多的人加入我们,让apacheflink开源社区变得更好!

标题:阿里正式向 Apache Flink 贡献 Blink 源码

地址:http://www.hcsbodzyz.com/hcxw/2518.html