我有一个关于在 Kinesis 流中分片数据的问题。我想在将用户数据发送到我的 kinesis 流时使用随机分区键,以便分片中的数据均匀分布。为了使这个问题更简单,我想通过在 Flink 应用程序中键入 userId 来聚合用户数据。
我的问题是:如果分片是随机分区的,以便一个 userId 的数据分布在多个 Kinesis 分片上,Flink 是否可以处理读取多个分片,然后重新分发数据,以便单个用户 ID 的所有数据都流式传输到同一个聚合器任务?或者,在 Flink 使用之前,我是否需要按用户 ID 对 kinesis 流进行分片?
...Flink 能否处理读取多个分片,然后重新分发数据,以便单个 userId 的所有数据都流式传输到同一个聚合器任务?
如果你使用 Flink 的 DataStream API,keyBy(e -> e.userId)
的效果是重新分发所有事件,以便任何特定 userId 的所有事件都将流式传输到同一个下游聚合器任务。
每个主机是否会从流中的分片子集读取数据,然后 Flink 使用 keyBy 运算符将相同键的消息传递给将执行实际聚合的主机?
是的,没错。
例如,如果您有 8 个物理主机,每个主机提供 8 个用于运行作业的插槽,则将有 64 个聚合器任务实例,每个实例将负责密钥空间的不相交子集。
假设有超过 64 个分片可供读取,那么在 64 个任务中的每个分片中,源将从一个或多个分片中读取,然后根据其 userId 分配它读取的事件。假设 userId 均匀分布在分片上,那么每个源实例都会发现它读取的一些事件是分配给它处理的用户 ID,应该使用本地聚合器。其余事件都需要发送到其他 63 个聚合器之一,具体取决于负责每个 userId 的工作线程。