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

一文读懂Apache Flink技术

发布时间:2018-11-06 00:22:04 所属栏目:教程 来源:大数据首席数据师
导读:本文是先介绍 Flink,再说 Flink的过去和现在 一、Flink介绍 Flink是一款分布式的计算引擎,它可以用来做批处理,即处理静态的数据集、历史的数据集;也可以用来做流处理,即实时地处理一些实时数据流,实时地产生数据的结果;也可以用来做一些基于事件的应

在Flink 1.5.0时期,Flink首次对外正式地提到新的部署模型和处理模型。新的模型开发工作已经持续了很久,在阿里巴巴内部这个新的处理模型也已经运行了有两年以上,该模型的实现对Flink内部代码改动量特别大,可以说是自Flink项目建立以来,Runtime改动最大的一个改进。简而言之,它的一个特性就是它可以使得在使用YARN、Mesos这种调度系统时,可以更加更好地动态分配资源、动态释放资源、提高资源利用性,还有提供更好的jobs之间的隔离。最后是在这个版本中,Flink对其网络站进行了一个基本重构。

2.5 Flink 网络栈重构

在流计算中有两个用来衡量性能的指标:延迟和吞吐。

一般来讲如果想要更高吞吐就要牺牲一些延迟,如果想要更低的延迟就要牺牲一定的吞吐。但是网络栈的重构却实现了延迟和吞吐的同时提升,这主要得益于它两方面的工作:第一个是基于信用的流控,另一个是基于事件的I/O。一个用来提高它的吞吐,另一个用来降低它的延迟。

在介绍流控之前需要先介绍一下现有的网络栈。Flink中TaskManager就是用来管理各个task的角色,它是以进程为单位;task用来执行用户代码,以线程为单位。当tasks之间有数据传输的交互的时候就要建立网络的连接,如果2秒之间都建立一个TCP连接的话,那么这个TCP连接会被严重浪费,所以Flink在两个TaskManager之间建立一个TCP连接,即两个进程之间只存在一个连接。各个task之间以TCP channel的方式来共享TCP的连接,这样整个job中就不会有太多的TCP连接。

2.6 Flink 反压

反压的意思是当某一个task的处理性能跟不上输入速率的时候,其输入端的Buffer就会被填满,当输入端Buffer被填满的时候就会导致TCP的读取被暂停。TCP的读取被暂停之后,就会导致上游输出端的Buffer池越积越多,因为下游此时已经不再进行消费。

当上游输出端的Buffer池也堆满的时候, TCP通道就会被关闭,其内部所有的TCP channel也会被关闭。从而上游task就会逐级的向上游进行反压,这是整体的反压流程,所以说Flink以前的反压机制是比较原生态、比较粗暴的,因为其控制力度很大,整个TCP中一旦某一个Task性能跟不上,就会把整个TCP连接关掉。如下图所示:

一文读懂Apache Flink技术

右下角的task虽然处理跟不上了,但上面的task仍然可以继续进行处理。左边这些上游数据可以继续发给右上角的task进行处理。但是由于现在整个的TCP连接都被关闭,导致右上角task同样收不到数据,整体吞吐量实际上是下降的趋势。为了优化这个功能就需要做到更加细密度的流控,目前是关闭整个TCP连接,优化措施就是需要对TCP channel进行控制,当某个task处理不过来时只需要该Task对应的TCP channel,其它TCP channel不受影响。优化实现方式就是基于信用的流控。

基于信用的流控的核心思想就是基于信用额度的消费。比如银行做贷款,为了防止坏账太多,它会对每一个人评估其信用额度,当发放贷款时贷款不会超过这个人能承受的额度。基于这种方式,它能够一方面不会产生太多坏账,另一方面可以充分地把银行的资金利用起来。基于信用的流控就是基于这种思想,Flink中所谓的信用额度,就是指这个下游消费端的可用的Buffer数。如下图:

一文读懂Apache Flink技术

该图左边是指发送端,有四个输出的队列,每个队列里面的方块代表输出Buffer,即准备丢给下游处理的Buffer。右边是消费端,消费端也有四个队列,这四个队列里面也有一些Buffer块,这些Buffer块是空闲的Buffer,准备用来接收上游发给自己的数据。

上面提到基于数据的流控中所谓的信用就是指这个消费端它可用的Buffer数,代表当前还能够消费多少数据,消费端首先会向上游反馈当前的信用是多少, producer端只会向信用额度大于0的下游进行发送,对于信用额度如果为0的就不再发送数据。这样整个网络的利用率便得到了很大的提升,不会发生某些Buffer被长时间的停留在网络的链路上的情况。

基于信用的流控主要有以下两方面的优化提升:

  • 一个是当某一个task发生反压处理跟不上的时候,不会发生所有的task都卡住,这种做法使吞吐量得到了很大的提升,在阿里内部用双11大屏作业进行测试,这种新的流控算法会得到20%的提升;
  • 另一个是基于事件的I/O,Flink在网络端写数据时会先往一个Buffer块里面写数据,这个Buffer块是一个32K的长度的单位,即32K的大小,当这个Buffer块被填满的时候就会输出到网络里面,或者如果数据流比较慢,没办法很快填满的话,那么会等待一个超时,默认一个100毫秒,即如果100毫秒内还没被填满那么这个Buffer也会被输出到网络里面。此时若是在以前版本中Flink延迟可能是在100毫秒以内,最差的情况下是到100毫秒,因为需要到100毫秒等这个Buffer发出去。

如果要得到更低的延时,现在的做法就会将这个Buffer直接加入到输出的队列,但是还是保持继续往这个Buffer块里面写数据,当网络里面有容量时这个Buffer块便会立刻被发出去,如果网络现在也比较繁忙,那就继续填充这个Buffer,这样吞吐也会比较好一点。基于这种算法,Flink的延时几乎是完美的,可以看到它的曲线基本上是低于10毫秒的,这也充分利用了网络的容量,几乎对吞吐没有影响。

【编辑推荐】

  1. Apache Flink实现的数据流体系结构
  2. 流计算框架Flink与Storm的性能对比
  3. 大数据处理引擎Spark与Flink大比拼
  4. 比拼生态和未来,Spark和Flink哪家强?
  5. 美团点评基于 Flink 的实时数仓建设实践
【责任编辑:未丽燕 TEL:(010)68476606】
点赞 0

(编辑:核心网)

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

热点阅读