使用 Kinesis 限制 Flink 中的网络流量
Limiting Network Traffic in Flink with Kinesis
我在 Amazon 的 Kinesis Data Analytics 服务(托管 Flink 集群)中有一个 Flink 应用程序 运行。在应用程序中,我从 Kinesis 流中读取用户数据,keyBy userId,然后聚合一些用户信息。问了,了解到Flink会将一个流的读取拆分到集群中的物理主机上。然后,Flink 会将传入的事件转发到主机,该主机已将聚合器任务分配给对应于给定事件的键 space。
考虑到这一点,我正在尝试决定将什么用作我的 Flink 应用程序从中读取的 Kinesis 流的分区键。我的目标是限制 Flink 集群中主机之间的网络流量,以优化我的 Flink 应用程序的性能。我可以随机分区,以便事件均匀分布在各个分片上,或者我可以按 userId 对我的分片进行分区。
决定取决于 Flink 内部的工作方式。 Flink 是否足够聪明,可以为主机上的本地聚合器任务分配一个键 space,该键将对应于 Kinesis 消费者分片的键 space同一主机上的任务正在读取? 如果是这种情况,则按 userId 进行分片将导致 零 网络流量,因为每个事件都是由将聚合它的主机流式传输。似乎 Flink 没有明确的方法来做到这一点,因为它不知道 Kinesis 流是如何分片的。
或者,Flink 是否随机分配每个 Flink 消费者任务读取分片的子集并随机分配聚合器任务一部分键 space? 如果是这种情况,那么似乎随机划分分片会导致最少的网络流量,因为至少有一些事件会被位于同一主机上的 Flink 消费者读取事件的聚合器任务。这比按 userId 分区然后必须通过网络转发所有事件要好,因为分片的 keySpace 与本地聚合器的分配键 spaces 不一致。
10 年前,通过网络传输尽可能少的数据非常重要。 5 年来,网络变得如此之快,以至于你注意到通过网络或内存访问一大块数据之间几乎没有区别(随机访问当然仍然快得多),因此我不会为额外的流量担心太多(除非你必须为此付费)。有趣的是,Google Datastream 开始将所有数据流式传输到两个任务之间的中央洗牌服务器,有效地使流量翻倍;但他们仍然在 PB 网络上体验到巨大的加速。
考虑到这一点,让我们转向 Flink。 Flink 目前无法动态调整分片,因为它们会随着时间的推移来来去去。 FLIP-27半年,可能不一样
目前,有一个解决方法,目前主要用于 Kafka-land(静态分区)。 DataStreamUtils#reinterpretAsKeyedStream
允许您指定逻辑 keyby
而无需物理洗牌。当然,您有责任提供的分区与实际相符,否则您会得到不正确的结果。
我在 Amazon 的 Kinesis Data Analytics 服务(托管 Flink 集群)中有一个 Flink 应用程序 运行。在应用程序中,我从 Kinesis 流中读取用户数据,keyBy userId,然后聚合一些用户信息。问了
考虑到这一点,我正在尝试决定将什么用作我的 Flink 应用程序从中读取的 Kinesis 流的分区键。我的目标是限制 Flink 集群中主机之间的网络流量,以优化我的 Flink 应用程序的性能。我可以随机分区,以便事件均匀分布在各个分片上,或者我可以按 userId 对我的分片进行分区。
决定取决于 Flink 内部的工作方式。 Flink 是否足够聪明,可以为主机上的本地聚合器任务分配一个键 space,该键将对应于 Kinesis 消费者分片的键 space同一主机上的任务正在读取? 如果是这种情况,则按 userId 进行分片将导致 零 网络流量,因为每个事件都是由将聚合它的主机流式传输。似乎 Flink 没有明确的方法来做到这一点,因为它不知道 Kinesis 流是如何分片的。
或者,Flink 是否随机分配每个 Flink 消费者任务读取分片的子集并随机分配聚合器任务一部分键 space? 如果是这种情况,那么似乎随机划分分片会导致最少的网络流量,因为至少有一些事件会被位于同一主机上的 Flink 消费者读取事件的聚合器任务。这比按 userId 分区然后必须通过网络转发所有事件要好,因为分片的 keySpace 与本地聚合器的分配键 spaces 不一致。
10 年前,通过网络传输尽可能少的数据非常重要。 5 年来,网络变得如此之快,以至于你注意到通过网络或内存访问一大块数据之间几乎没有区别(随机访问当然仍然快得多),因此我不会为额外的流量担心太多(除非你必须为此付费)。有趣的是,Google Datastream 开始将所有数据流式传输到两个任务之间的中央洗牌服务器,有效地使流量翻倍;但他们仍然在 PB 网络上体验到巨大的加速。
考虑到这一点,让我们转向 Flink。 Flink 目前无法动态调整分片,因为它们会随着时间的推移来来去去。 FLIP-27半年,可能不一样
目前,有一个解决方法,目前主要用于 Kafka-land(静态分区)。 DataStreamUtils#reinterpretAsKeyedStream
允许您指定逻辑 keyby
而无需物理洗牌。当然,您有责任提供的分区与实际相符,否则您会得到不正确的结果。