消费和产生消息特别是Kafka分区?

时间:2016-07-28 10:26:58

标签: apache-kafka apache-zookeeper kafka-consumer-api kafka-producer-api

用于阅读主题中的所有分区:

~bin / kafka-console-consumer.sh --zookeeper localhost:2181 - topic myTopic --from-beginning

  1. 如何使用主题的特定分区? (例如,使用分区键13)
  2. 如何使用特定的分区键在分区中生成消息?有可能吗?

4 个答案:

答案 0 :(得分:2)

您无法使用控制台消费者和制作人。但是您可以使用更高级别的客户端(使用适合您的任何语言)。

  1. 您可以使用示例@model FamilyTree.Models.FamilyRelationship @{ ViewBag.Title = "Create"; } <h2>Create</h2> @using (Html.BeginForm()) { @Html.AntiForgeryToken() <div class="form-horizontal"> <h4>FamilyRelationship</h4> <hr /> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(model => model.familyMemberPrimary, new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.DropDownListFor(a => a.familyMemberPrimary, (SelectList)ViewBag.familyMember, new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.familyMemberPrimary, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.familyMemberSecondary, new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.DropDownListFor(a => a.familyMemberSecondary, (SelectList)ViewBag.familyMember, new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.familyMemberSecondary, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.relationshipType, new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.DropDownListFor(a => a.relationshipType, (SelectList)ViewBag.relationship, new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.relationshipType, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="Create" class="btn btn-default" /> </div> </div> </div> } <div> @Html.ActionLink("Back to List", "Index") </div> @section Scripts { @Scripts.Render("~/bundles/jqueryval") } 方法手动分配要使用的特定主题分区(https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/consumer/KafkaConsumer.java#L906
  2. 您可以使用自定义assign覆盖分区逻辑,您可以手动决定如何对邮件进行分区(https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/producer/ProducerConfig.java#L206-L208

答案 1 :(得分:1)

有了许多可用的客户端,您可以像serejja所说的那样指定分区号。

另请查看使用actor的https://github.com/cakesolutions/scala-kafka-client,并为手动分区和偏移提供多种模式。

如果你想在终端上做同样的事情,我建议使用kafkacat。 (https://github.com/edenhill/kafkacat) 我个人在开发过程中的选择。

您可以执行

之类的操作

kafkacat -b localhost:9092 -f 'Topic %t[%p], offset::: %o, data: %s key: %k\n' -t testtopic

对于特定分区,您只需使用-p标志。

答案 2 :(得分:0)

控制台生产者和消费者没有提供这种灵活性。您可以通过Kafka API来实现。

  1. 您可以使用assign()操作KafkaConsumer/Assign手动将分区分配给使用者。这将禁用组重新平衡。请非常小心地使用它。

  2. 您可以在KafkaProducer消息中指定分区详细信息。如果未指定,则按照分区程序策略进行存储。

答案 3 :(得分:0)

如何使用主题的特定分区? (例如 使用分区键13)

--partition中有一个名为kafka-console-consumer的标志

--partition <Integer: partition>         The partition to consume from.         
                                           Consumption starts from the end of   
                                           the partition unless '--offset' is   
                                           specified.                           

命令如下:

bin/kafka-console-consumer --bootstrap-server localhost:9092 --topic test --partition 0 --from-beginning