【问题标题】:Kinesis Streams and FlinkKinesis Streams 和 Flink
【发布时间】:2020-02-14 21:35:42
【问题描述】:

我有一个关于 Kinesis 流中数据分片的问题。在将用户数据发送到我的运动流时,我想使用随机分区键,以便分片中的数据均匀分布。为了使这个问题更简单,我想通过在我的 Flink 应用程序中关闭 userId 来聚合用户数据。

我的问题是:如果分片是随机分区的,因此一个 userId 的数据分布在多个 Kinesis 分片上,Flink 是否可以处理读取多个分片然后重新分配数据,以便单个 userId 的所有数据流式传输到同一个聚合器任务?或者,在 Flink 使用之前,我是否需要按用户 ID 对 kinesis 流进行分片?

【问题讨论】:

    标签: apache-flink flink-streaming amazon-kinesis


    【解决方案1】:

    ... Flink 能否处理读取多个分片,然后重新分配数据,以便将单个 userId 的所有数据流式传输到同一个聚合器任务?

    如果您使用 Flink 的 DataStream API,keyBy(e -> e.userId) 的效果是重新分发所有事件,以便任何特定 userId 的所有事件都将流式传输到相同的下游聚合器任务。

    每个主机是否会从流中的分片子集读取数据,然后 Flink 是否会使用 keyBy 运算符将相同键的消息传递给将执行实际聚合的主机?

    是的,没错。

    例如,如果您有 8 台物理主机,每台提供 8 个插槽来运行作业,那么将有 64 个聚合器任务实例,每个实例将负责键空间的不相交子集。

    假设有超过 64 个分片可供读取,那么在 64 个任务中的每一个任务中,源将从一个或多个分片读取,然后根据其用户 ID 分发它读取的事件。假设 userIds 均匀分布在分片中,那么每个源实例会发现它读取的一些事件是针对分配给它处理的 userIds 的,并且应该使用本地聚合器。其余事件将分别发送到其他 63 个聚合器之一,具体取决于负责每个 userId 的工作人员。

    【讨论】:

    • 这个规模如何?最终,Flink 集群中需要多个物理主机来处理大量数据。工作是如何跨多个主机分配的?每个主机是否会从流中的分片子集读取数据,然后 Flink 是否会使用 keyBy 运算符将相同键的消息传递给将执行实际聚合的主机?还是某个特定键的所有数据都需要在同一个分片中,以便集群中的单个主机可以读取和处理?
    • 感谢您更新原始答案。这正是我想要的。最后一个跟进问题?你知道预期的性能差异吗?我想如果我对 userId 进行分片,通过网络在主机之间传递的消息会少很多,但我读过 Flink 有一个非常复杂的基于信用的数据传输算法。对性能的实际影响有任何想法吗?
    • 网络不是一个重要因素。更重要的是 ser/de 开销,由于 keyBy,这两种方式都会发生。
    • 顺便说一句,如果你能接受答案就好了。
    猜你喜欢
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    相关资源
    最近更新 更多