Kinesis Streams 和 Flink

Kinesis Streams and Flink

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

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

... can Flink handle reading off of multiple shards and then redistributing the data so that all of the data for a single userId is streamed to the same aggregator task?

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

Would each host read in data from a subset of the shards in the stream and would Flink then use the keyBy operator to pass messages of the same key to the host that will perform the actual aggregation?

是的,没错。

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

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