用kinesis限制flink的网络流量

lb3vh1jj  于 2021-06-24  发布在  Flink
关注(0)|答案(1)|浏览(543)

我在amazon的kinesis数据分析服务(managed flink cluster)中运行了一个flink应用程序。在应用程序中,我从一个kinesis流中读取用户数据,keyby userid,然后聚合一些用户信息。问了这个问题之后,我了解到flink将在集群中的物理主机上拆分流的读取。flink然后将传入事件转发给主机,主机将聚合器任务分配给与给定事件对应的密钥空间。
考虑到这一点,我试图决定使用什么作为flink应用程序读取的kinesis流的分区键。我的目标是限制flink集群中主机之间的网络流量,以优化flink应用程序的性能。我可以随机分区,这样事件就均匀地分布在碎片上,也可以按userid对碎片进行分区。
这个决定取决于Flink内部的工作方式。flink是否足够聪明,可以为主机上的本地聚合器任务分配一个密钥空间,该密钥空间将对应于同一主机上的kinesis consumer任务正在读取的碎片的密钥空间?如果是这种情况,那么按userid分片将导致网络流量为零,因为每个事件都是由聚合它的主机流式传输的。似乎Flink没有一个明确的方法来做这件事,因为他不知道动觉流是如何被切分的。
或者,flink是否随机分配每个flink使用者任务一个子集来读取碎片,并随机分配聚合器任务一部分密钥空间?如果是这种情况,那么碎片的随机分区似乎会导致最少的网络流量,因为至少有一些事件将由与事件的聚合器任务位于同一主机上的flink使用者读取。这比按userid分区然后必须通过网络转发所有事件要好,因为碎片的密钥空间与本地聚合器分配的密钥空间不一致。

ffvjumwh

ffvjumwh1#

10年前,通过网络传输尽可能少的数据是非常重要的。自5年以来,网络变得如此之快,以至于你注意到通过网络或内存访问数据块之间的差别很小(随机访问当然要快得多),这样我就不会为额外的流量操心太多了(除非你必须付费)。有趣的是,googledatastream开始在两个任务之间将所有数据流传输到一个中心shuffle服务器,有效地将流量增加了一倍;但他们的千兆字节网络仍在经历巨大的加速。
考虑到这一点,我们来谈谈Flink。flink目前没有办法动态地调整碎片,因为它们可以随着时间的推移来来去去去。在flip-27的半年内,情况可能会有所不同。
目前,有一个解决方案,目前主要用于Kafka土地(静态分区)。 DataStreamUtils#reinterpretAsKeyedStream 允许您指定逻辑 keyby 没有身体上的混乱。当然,您有责任确保所提供的分区符合实际情况,否则您将得到不正确的结果。

相关问题