如何让消费者在Kafka 0.8 API中工作

时间:2016-05-19 11:17:19

标签: apache-kafka cloudera

我即将编写一个用于发布和使用kafka消息的原型。 我们已经建立了Cloudera基础设施(动物园管理员,经纪人等),我已经成功地使用了Kafka命令行工具来制作和使用消息。

我使用[org.apache.kafka/kafka_2.10 "0.8.2.1"]作为依赖项,并且已经能够使用客户端API来设置KafkaProducer,该KafkaConsumer发布具有纯字符串内容的消息,并且可以通过命令成功读取 - 在另一边排队消费者。

我的问题是:internets上是否有一个代码示例来说明如何初始化org.apache.kafka.clients.consumer.ConsumerConfig,并在另一方面阅读该消息,因为我已经搜索了好几天并且code examples似乎都没有工作:

  • 他们使用API​​本身甚至不存在的类或方法(例如,他们似乎将属性映射传递给createJavaConsumerConnector的构造函数,但不存在这样的构造函数;
  • 在类kafka.consumer.Consumer上调用curl http://{myhost}/{indexName}/_stats 静态方法...这些东西存在于哪个Universe中?)。

通常每个例子看起来都非常复杂。我希望消息传递框架需要几行配置来连接到代理,还有一些函数可以放入队列或主题。为Kafka设置Producer并不是非常复杂,而且我期待消费者与之相似。

我似乎也是not alone

1 个答案:

答案 0 :(得分:2)

首先,我要提一下,Kafka 0.8.00.8.10.8.2之间有一些API更改(0.9.0的市长重写和简化和0.10.0) - 因此,您的问题有点开放,只是要求0.8

要为0.8.2.2编写Java使用者,您需要包含依赖项:

  

这适用于Scala 2.11 - 还有其他Scala版本。

<dependency>
  <groupId>org.apache.kafka</groupId>
  <artifactId>kafka_2.11</artifactId>
  <version>0.8.2.2</version>
</dependency>

不要将 kafka-clients 用作0.8.x的artifactId。

消费者接收<String,String>键值对消息并将其打印到stdout的最小示例如下所示:

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import kafka.consumer.Consumer;
import kafka.consumer.ConsumerConfig;
import kafka.consumer.ConsumerIterator;
import kafka.consumer.KafkaStream;
import kafka.javaapi.consumer.ConsumerConnector;

public class ConsumerExample {

    public static void main(String[] args) {
        Properties props = new Properties();
        props.put("zookeeper.connect", "localhost:2181");
        props.put("group.id", "myGroup");

        final String topic = "test";

        ConsumerConnector consumer = Consumer.createJavaConsumerConnector(new ConsumerConfig(props));

        Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
        topicCountMap.put(topic, new Integer(1)); // number of consumer threads

        KafkaStream<byte[], byte[]> stream = consumer.createMessageStreams(topicCountMap).get(topic).get(0);

        ConsumerIterator<byte[], byte[]> it = stream.iterator();

        // infinite loop
        while(it.hasNext()) {
            System.out.println(new String(it.next().message()));
        }

        // non-reachable code...
        consumer.shutdown();
    }
}

完整示例 - 使用多个消费者线程,包括正确关闭 - 可以在此处找到:https://cwiki.apache.org/confluence/display/KAFKA/Consumer+Group+Example

要对此进行测试,请按照quickstart指南,通过Kafka的 console-producer 发送消息。