当前位置: 首页 > 知识库问答 >
问题:

利用Kinesis限制Flink中的网络流量

闾丘山
2023-03-14

我有一个Flink应用程序在Amazon的Kinesis数据分析服务(托管Flink集群)中运行。在应用程序中,我从Kinesis流keyBy userId读取用户数据,然后聚合一些用户信息。问了这个问题之后,我了解到Flink会在集群中跨物理主机拆分一个流的读取。然后Flink将传入事件转发给主机,该主机将聚合器任务分配给对应于给定事件的密钥空间。

考虑到这一点,我试图决定使用什么作为我的Flink应用程序读取的Kinesis流的分区键。我的目标是限制Flink集群中主机之间的网络流量,以优化Flink应用程序的性能。我可以随机分区,使事件均匀地分布在分片上,也可以按用户ID对分片进行分区。

这个决定取决于Flink在内部的工作方式。Flink是否足够聪明,可以为主机上的本地聚合器任务分配一个密钥空间,该密钥空间将与同一主机上的Kinesis使用者任务正在读取的碎片的密钥空间相对应?如果是这种情况,那么按用户ID进行分片将导致网络流量为零,因为每个事件都是由将其聚合的主机进行流式传输的。似乎Flink没有一个明确的方法来实现这一点,因为它不知道运动流是如何分片的。

共有1个答案

阚夕
2023-03-14

10年前,通过网络传输尽可能少的数据是非常重要的。5年来,网络的速度变得如此之快,以至于你注意到通过网络或内存访问数据块之间几乎没有什么区别(当然,随机访问还是要快得多),因此我不会为额外的流量担心太多(除非你必须为此付费)。有趣的是,Google Datastream开始在两个任务之间将所有数据流到一个中央shuffle服务器,有效地将流量增加了一倍;但是他们仍然在他们的Petabyte网络上经历了巨大的加速。

考虑到这一点,让我们转到Flink。闪烁目前没有办法动态调整碎片,因为它们可以随着时间的推移来去。在使用FLIP-27的半年内,情况可能会有所不同。

就目前而言,有一个变通方法,目前主要用于Kafka-land(静态分区)。datastreamutils#reinterpretaskeyedstream允许您指定逻辑keyby而无需物理洗牌。当然,您要负责提供的分区与实际情况相符,否则将得到不正确的结果。

 类似资料:
  • 我正试图将mkv文件(见下面的属性)发送到Kinesis视频流。我想有10-15帧每秒的FPS。

  • 我知道这可能是一个相对通用的问题,但我正试图看看如何才能被指向正确的方向... 我试图用AWS Rekognition建立一个实时人脸识别应用程序。我对API很满意,并使用上传到S3的静态图像来执行面部识别。然而,我正试图找到一种将实时数据流到Rekognition的方法。在阅读了Amazon提供的各种文章和文档后,我发现了这个过程,但似乎无法克服一个障碍。 根据文档,我可以用Kinesis来完成

  • 流量控制(Traffic Control, tc)是Linux内核提供的流量限速、整形和策略控制机制。它以qdisc-class-filter的树形结构来实现对流量的分层控制 : tc最佳的参考就是Linux Traffic Control HOWTO,详细介绍了tc的原理和使用方法。 基本组成 从上图中可以看到,tc由qdisc、fitler和class三部分组成: qdisc通过队列将数据包缓

  • 通过stream API,我可以编写一个RichCoFlatMapFunction来接受一个控制流和一个数据流,控制流中包含了启动、停止或改变参数的计算元素,我知道我可以存储当前控制设置的状态,并在处理数据流时检查值。 但是用Flink SQL做类似的事情的方法是什么呢?我不能使用join,因为数据流和控制流不能连接在一起。 我们提出的解决方案是通过应用程序本身存储控件设置。其想法是: > 将控制

  • 我正在测试Apache Flink(使用v1.8.2)从Kinesis Data Stream读取消息的速度。Kinesis Data Streams仅包含一个分片,它包含40,000条消息。每个消息大小小于5 KB。 尝试使用TRIM\u HORIZON从最旧的消息中读取流,我希望该应用程序能够快速读取所有消息,因为通过GetRecords,每个碎片可以支持高达每秒2 MB的最大总数据读取速率。

  • 我已经为在某些条件下限制Crashlytics网络使用的能力不足而工作了一段时间。例如,漫游、计费网络等。。 根据SDK留档,我发现只有两个选项可以解决这个问题: > 发送崩溃报告之前的内置用户同意对话框 这个API非常有限,因为: > 不初始化Crashlytics不仅可以阻止网络访问,还可以防止Crashlytics将崩溃报告保存在本地以便最终发送事件的任何机会。更不用说在运行时没有选择退出的