大数据理论篇 No.1-浅谈Flink中的数据传输

第1章 疑问

Flink在作业运行过程中,TaskManager之间会不断的进行数据交换,而TaskManager进程里是以Slot为单位执行任务的,一个TaskManager里可以有多个Slot,每个Slot之间都可能进行连接,并且传输数据,而在流计算的场景中,数据之间的交互需要非常的及时,但是如果每一次交互都立即传输,对网络资源的消耗会非常大,网络开销到达峰值的话,就会产生逆反效应了:及时性反而变差了,那么Flink是如何解决这一问题的呢?

 

第2章 缓冲区

Slot之间传输数据的时候,实际是将数据先收集到缓冲区中,而并非逐个发送,当数据被存到缓冲区后,数据达到一定的条件,再以批量的形式将数据进行发送。(Kafka也有相似的机制)

如果slot在不同TaskManager中,那么数据传输还需要经过网络,TaskManager向另一个TaskManager传输数据时会共享网络连接。每个TaskManager自身必须提供足够多的缓冲区来服务所有的连接。

Flink默认的网络缓冲区配置,可以应对中小型流量的使用场景。但是如果是大型流量的场景,用户还是需要调整自己的“内存和网络缓冲”配置,相关配置可以到官网查阅,这里就不细讲。

有了缓冲区之后,思考一个问题:缓冲的数据过多,数据到达的延时性就会越高,对于Flink这样的实时计算框架,是怎么解决这一问题的呢?

 

第3章 基于信用的流量控制

Flink实现了一种基于信用的流量控制机制,来降低延迟,工作原理大致是这样:

  • 发送端会将自己缓冲区积压的数据大小加入到发送的数据当中,一并发给接收端。
  • 接收端接收到发送端发过来数据之后,会根据其缓冲区积压的数据大小,生成一个信用值,并将信用值返回给发送端。
  • 发送端会根据信用值所限定的范围,尽可能的多传输缓冲区数据。

如此,每个发送端都会被授予一个信用值,如果某发送端数据积压过多,那么它所被授予的信用值,就能够使之尽量多发送数据,从而减少它的积压量,这种机制会在出现数据倾斜时很好的分配网络资源。

 

第4章 任务链接

另外Flink还有一种任务链接的机制,来降低本地通信的开销。但是任务链接机制是有条件的:

  • 条件一:每个算子必须有相同的并行度;
  • 条件二:算子之间是通过本地转发通道连接并交互数据。

满足条件的算子里的函数会被“融合”到同一个任务中,在同一个线程里执行,每个函数之间只需要通过简单的方法调用,就可以进行数据交互,各函数之间的数据传输基本存在序列化和通信(网络通信)的开销。

注:Flink默认是开启了任务链接,如果有业务不需要任务链接,需要自行禁用。

 

综上所述,Flink利用了这些机制来确保流计算过程中“实时性”和“资源利用率”的一个平衡,从而达到更高的吞吐、和最佳效的效率。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pezynd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值