Kafka生产者-发送消息列表

时间:2018-07-09 06:26:16

标签: apache-spark apache-kafka

我需要发送少量消息,并确保每一批中的所有消息都在同一批中一起到达消费者。

例如,假设我需要在5个批次/组中​​发送400条消息,每个组将包含80条消息,并且需要在消费者端以同一批次使用。

我正在使用Spark结构化流媒体来消费消息。

我读过类似的问题,但我仍然对正确的做法感到困惑。

生产者是否应该将所有消息(每批)放到一个列表中,然后将列表发送到kafka?

还有其他更好的方法吗?

谢谢

1 个答案:

答案 0 :(得分:1)

这可以通过创建具有5个分区的主题来实现,以便可以将每种批处理消息类型发送到每个分区

ProducerRecord(java.lang.String topic, java.lang.Integer partition, K key, V value)
Creates a record to be sent to a specified topic and partition

我们可以创建5个使用者,并将每个使用者分配给每个分区,但是我不确定每个使用者poll()是否会一次拉取该分区中的所有消息

手动分区分配。 here doc

例如: 如果该进程正在维护与该分区关联的某种本地状态(例如本地磁盘上的键值存储),则该进程应仅获取其在磁盘上维护的分区的记录。
如果流程本身具有很高的可用性,并且在流程失败时将重新启动(也许使用群集管理框架,例如YARN,Mesos或AWS工具,或者作为流处理框架的一部分)。在这种情况下,Kafka无需检测故障并重新分配分区,因为使用过程将在另一台计算机上重新启动。
要使用此模式,只需使用指定要使用的分区的完整列表调用assign(Collection),而不用使用subscribe订阅主题。

 String topic = "foo";
 TopicPartition partition0 = new TopicPartition(topic, 0);
 TopicPartition partition1 = new TopicPartition(topic, 1);
 consumer.assign(Arrays.asList(partition0, partition1));