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