如何使用docker命令向正在运行的kafka容器添加主题?

时间:2017-01-29 15:37:35

标签: docker groovy apache-kafka

我有一个使用以下

启动的kafka容器
docker run --detach --name kafka -p 2181:2181 -p 9092:9092 --env ADVERTISED_HOST=192.168.1.89 --env ADVERVTISED_PORT=9092 --env AUTO.CREATE.TOPICS.ENABLE spotify/kafka

我可以使用docker logs kafka来查看它的启动。

然后我创建了一个简单的groovy脚本客户端生成器来编写一些条目,但这会导致错误

> Sending metadata request {topics=[wills topic]} to node 0
> Error while fetching metadata with correlation id 1 : {wills topic=INVALID_TOPIC_EXCEPTION}
....

我在客户端代码中设置了以下属性

    Properties props = new Properties()
    props.put("bootstrap.servers", "192.168.1.89:9092" )   //Assign localhost id and external port (9092 int)
    props.put("acks", "all")                            //Set acknowledgements for producer requests.
    props.put("retries", 0)                             //If the request fails, the producer can automatically retry,
    props.put("batch.size", 16384)                      //Specify buffer size in config
    props.put("linger.ms", 1)                           //Reduce the no of requests less than 0
    props.put("buffer.memory", 33554432)                //The buffer.memory controls the total amount of memory available to the producer for buffering.
    props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
    props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer")
    props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
    props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
    props.put ("auto.create.topics.enable", true)       //enable auto topic creation

    producer = new org.apache.kafka.clients.producer.KafkaProducer<String, String>(props)

    for(int i = 0; i < 10; i++) {
        producer.send(new ProducerRecord<String, String>(topicName, Integer.toString(i), Integer.toString(i)))
    }
    println("Message sent successfully")
    producer.close()

但似乎并没有启用自动主题创建。鉴于我已经将kafka服务器作为docker容器进行了旋转 - 如何使用docker命令启动并运行该容器实例作为与容器通信的方法

在kafka网站上有一个关于运行shell命令的注释“bin / kafka-topics.sh --create --zookeeper localhost:2181 --rerelication-factor 1 --partitions 1 --topic test “

但不容易看出一旦它在容器中如何编辑/交互它。

如何在启动时管理docker中的kafka容器实例。否则你必须添加到docker run命令以获取在启动时预先创建的主题

此时收到的建议非常好

2 个答案:

答案 0 :(得分:2)

错误消息{wills topic=INVALID_TOPIC_EXCEPTION}表示您使用wills topic作为主题名称。

主题名称不能包含空格。尝试重命名为wills_topic,它应该可以解决问题。

此正则表达式描述了主题名称的合法字符(选中sources):

val legalChars = "[a-zA-Z0-9\\._\\-]"

使用docker exec -it <container-name> <command>启动Kafka管理工具。或者只是在容器docker exec -it <container-name> bash中打开一个bash(参见Docker docs)。

答案 1 :(得分:0)

使用docker exec -it [container_id] /opt/kafka_2.11-0.10.1.0/bin/kafka-topics.sh --create --zookeeper localhost:2181-复制因子1-分区1-主题测试