Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka ApacheKafka 0.9.0.0显示带有分区的所有主题_Apache Kafka - Fatal编程技术网

Apache kafka ApacheKafka 0.9.0.0显示带有分区的所有主题

Apache kafka ApacheKafka 0.9.0.0显示带有分区的所有主题,apache-kafka,Apache Kafka,我目前正在评估ApacheKafka,我有一个简单的消费者,应该从特定的主题分区读取消息。这是我的客户: public static void main(String args[]) { Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("group.id", "test"); props.put("enable.aut

我目前正在评估ApacheKafka,我有一个简单的消费者,应该从特定的主题分区读取消息。这是我的客户:

public static void main(String args[]) {

    Properties props = new Properties();
    props.put("bootstrap.servers", "localhost:9092");
    props.put("group.id", "test");
    props.put("enable.auto.commit", "false");
    props.put("auto.commit.interval.ms", "1000");
    props.put("session.timeout.ms", "30000");
    props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

    KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);

    TopicPartition partition0 = new TopicPartition("test_topic", Integer.parseInt(args[0]));

    ArrayList topicAssignment = new ArrayList();
    topicAssignment.add(partition0);
    consumer.assign(topicAssignment);

    //consumer.subscribe(Arrays.asList("test_topic"));
    int commitInterval = 200;
    List<ConsumerRecord<String, String>> buffer = new ArrayList<ConsumerRecord<String, String>>();

    while (true) {
        ConsumerRecords<String, String> records = consumer.poll(100);
        for (ConsumerRecord<String, String> record : records) {
            buffer.add(record);
            if (buffer.size() >= commitInterval) {
                process(buffer);
                consumer.commitSync();
                buffer.clear();
            }
        }
    }
}

static void process(List<ConsumerRecord<String, String>> buffers) {
   for (ConsumerRecord<String, String> buffer : buffers) {
       System.out.println(buffer);
   }
}
正如您在这里看到的,我创建的主题有两个分区(p0和p1)

然后,我使用以下命令启动我的消费者的两个实例:

对于消费者1:

java -cp target/scala-2.11/kafka-consumer-0.1.0-SNAPAHOT.jar com.test.api.consumer.KafkaConsumer09Java 0
对于消费者2:

java -cp target/scala-2.11/kafka-consumer-0.1.0-SNAPAHOT.jar com.test.api.consumer.KafkaConsumer09Java 1
其中0和1表示我希望消费者从中读取消息的实际分区

但实际情况是,只有我的消费者1得到了所有信息。我的印象是,来自制作者的消息最终都会平等地出现在分区上

我使用以下命令查看我的主题test\u topic有多少个分区:

Joes-MacBook-Pro:kafka_2.11-0.9.0.0 joe$ bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --broker-info --group test --topic test_topic --zookeeper localhost:2181
[2016-01-14 13:36:48,831] WARN WARNING: ConsumerOffsetChecker is deprecated and will be dropped in releases following 0.9.0. Use ConsumerGroupCommand instead. (kafka.tools.ConsumerOffsetChecker$)
Group           Topic                          Pid Offset          logSize         Lag             Owner
test            test_topic                     0   10000           10000           0               none
BROKER INFO
0 -> 172.22.4.34:9092
为什么只有一个分区,即使我告诉卡夫卡为test_主题创建两个分区

这是我的制作人:

  def main(args: Array[String]) {
    //val conf = new SparkConf().setAppName("VPP metrics producer")
    //val sc = new SparkContext(conf)

    val props: Properties = new Properties()
      props.put("metadata.broker.list", "localhost:9092,localhost:9093")
      props.put("serializer.class", "kafka.serializer.StringEncoder")

    val config = new ProducerConfig(props)
    val producer = new Producer[String, String](config)

    1 to 10000 map {
      case i => 
        val jsonStr = getRandomTsDataPoint().toJson.toString
        println(s"sending message $i to kafka")
        producer.send(new KeyedMessage[String, String]("test_topic", jsonStr))
        println(s"sent message $i to kafka")
    }
  }

我不知道如果你用2创建主题,为什么你会有1个分区。我从来没有遇到过,这是肯定的

你能试试这个吗

bin/kafka-topics.sh--描述--zookeeper本地主机:2181--主题测试
这应该会告诉您实际有多少个分区

然后,如果真的有一个分区,也许您可以从创建一个新主题开始:

bin/kafka-topics.sh--create--zookeeper localhost:2181--replication factor 2--partitions 2--topic test_topic_2

然后尝试:

bin/kafka-topics.sh--description--zookeer localhost:2181--topic test\u topic\u 2

... 然后报告结果。

您只是从分区0消费,但还需要从分区1消费。如果您从1消费并提交,您将在pid no列中看到也没有1


但是你也需要一个能写进1的制作人。

非常有趣!我还想检查一下,但没有成功。当每个分区都有所有权但不知道如何分配所有权时,我看到了一些更详细的输出…Joes MacBook Pro:kafka_2.11-0.9.0.0 joe$bin/kafka-topics.sh--descripe--Zookeer localhost:2181--topic test_topic_2 Joes MacBook Pro:kafka_2.11-0.9.0.0 joe$抱歉我错过了你的问题。这对Kafka 0.9不起作用,因为它不再在ZK中存储消费者偏移量信息,而是存储在一个特殊的Kafka主题中。我使用Kafka监视器来监视我的消费者偏移量,因此您可以查看它(适用于0.9)<代码>docker run-it-p 8080:8080-e ZK=jpodeszwik/kafka偏移量监视器:0.2.1。如果没有,请转到查看如何手动运行它。Kafka不是应该通过以循环方式将消息写入分区来自动执行此操作吗?我已经编辑了我的帖子,加入了制片人。我应该如何以及怎样使它写入分区?此外,我的使用者2正在从分区1读取数据。看看我上面帖子中的最后一个参数!对于消费者2:“@sparkr我错过了消费者2的那个。对不起。我今天也在试验卡夫卡。我所经历的是,在塞进卡夫卡的同时,让消费者2只消费它对我有效。我不太清楚分区何时切换。我正在使用python api。producer的默认值应该是它服务于两个分区。。。事实上,就我而言。。。有一个名为random_start=True//的设置应该是默认设置。解决方案是什么?我的意思是,关于阿帕奇·卡夫卡的宣传似乎太多了,如果我不得不努力让基本的东西正常工作,我就不那么相信了!我希望使用使用者向两个分区写入数据并从这两个分区读取数据,我希望使用者1读取50%的消息,使用者2读取剩余的50%的消息。我应该在上面的代码中做些什么来实现这一点?
  def main(args: Array[String]) {
    //val conf = new SparkConf().setAppName("VPP metrics producer")
    //val sc = new SparkContext(conf)

    val props: Properties = new Properties()
      props.put("metadata.broker.list", "localhost:9092,localhost:9093")
      props.put("serializer.class", "kafka.serializer.StringEncoder")

    val config = new ProducerConfig(props)
    val producer = new Producer[String, String](config)

    1 to 10000 map {
      case i => 
        val jsonStr = getRandomTsDataPoint().toJson.toString
        println(s"sending message $i to kafka")
        producer.send(new KeyedMessage[String, String]("test_topic", jsonStr))
        println(s"sent message $i to kafka")
    }
  }