我正在尝试在Spark Structured Streaming和Hazelcast Jet之间映射一些概念,并了解其他主题。
Q1 - 在Spark中,每个Kafka分区都将成为spark中的分区,然后它们将由各个任务并行处理。我想我已经读过Hazelcast Jet会合并来自kafka的所有消息而不管group.id和主题分区,这是正确的吗?
Q2 - 我们如何增加Jet计划中“消费者”的数量以增加卡夫卡的吞吐量?在Spark中我想我们只需要增加主题分区的数量,以便为新分区分配新的spark任务。
Q3 - 如果上面的Q1为真,是否可以避免合并并分发要并行处理的kafka分区?一旦消息已经在kafka分区中进行分组和排序,合并所有消息意味着需要额外的处理来重新分区并再次对消息进行排序。
Q4 - 如何定义每个顶点的数量?我的意思是,在单词计数示例中我们有标记器和累加器,Jet将如何决定/划分处理器的数量以创建标记器和累加器的实例?
答案 0 :(得分:1)
A1 - 并行处理器的数量完全独立于Kafka分区的数量。处理器的数量由顶点的local parallelism和成员数决定:
totalParallelism = numberOfMembers * localParallelism
将为每个处理器分配所有主题分区的子集,并使用一个KafkaConsumer
。不使用group.id
,Jet使用手动分区分配。
A2 - 向Kafka主题添加新分区并不会增加消费者数量。您需要增加本地并行度。
A3 - 没有额外费用"合并"和"排序"。您可能想查看here。基本上每个顶点由多个并行处理器支持,每个边缘由多个队列支持,每两个处理器一个队列。如果下游处理器从多个队列中获取项目,则它只是按队列排队;合并没有额外的费用。在物品重新排序的意义上也没有排序。如果边缘不是distributed,则所有处理都是本地处理,没有任何序列化。
答案适用于Jet 0.5.1和0.6(在撰写本文时正在开发中)。
A4 - 见A1。