Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.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
Java 我们如何使用API从IDE在Kafka中创建主题_Java_Apache Kafka - Fatal编程技术网

Java 我们如何使用API从IDE在Kafka中创建主题

Java 我们如何使用API从IDE在Kafka中创建主题,java,apache-kafka,Java,Apache Kafka,我们如何使用API从IDE在Kafka中创建主题,因为当我这样做时: bin/kafka-create-topic.sh --topic mytopic --replica 3 --zookeeper localhost:2181 我得到一个错误: bash: bin/kafka-create-topic.sh: No such file or directory 我按照开发人员设置的原样进行操作。您尝试使用哪个IDE 请提供完整的路径,下面是终端将创建主题的命令 cd卡夫卡/bin /ka

我们如何使用API从IDE在Kafka中创建主题,因为当我这样做时:

bin/kafka-create-topic.sh --topic mytopic --replica 3 --zookeeper localhost:2181
我得到一个错误:

bash: bin/kafka-create-topic.sh: No such file or directory

我按照开发人员设置的原样进行操作。

您尝试使用哪个IDE

请提供完整的路径,下面是终端将创建主题的命令

  • cd卡夫卡/bin
  • /kafka-create-topic.sh——主题测试——zookeeper本地主机:2181
  • 在Kafka 0.8中,如果Kafka文件中的
    auto.create.topics.enable
    属性设置为
    true
    (默认),下面的示例将创建一个名为
    的主题

    import java.util.*;
    导入kafka.javaapi.producer.producer;
    导入kafka.producer.KeyedMessage;
    导入kafka.producer.ProducerConfig;
    公共类测试制作人{
    公共静态void main(字符串[]args){
    long events=long.parseLong(args[0]);
    随机rnd=新随机();
    Properties props=新属性();
    props.put(“metadata.broker.list”,“broker1:9092,broker2:9092”);
    put(“serializer.class”、“kafka.serializer.StringEncoder”);
    props.put(“partitioner.class”、“example.producer.SimplePartitioner”);
    道具放置(“请求.要求.确认”,“1”);
    ProducerConfig config=新的ProducerConfig(道具);
    生产者生产者=新生产者(配置);
    对于(long-nEvents=0;nEvents
    您可以尝试使用kafka.admin.CreateTopicCommand scala类从Java代码创建主题…提供必要的参数

    String [] arguments = new String[8];
    arguments[0] = "--zookeeper";
    arguments[1] = "10.***.***.***:2181";
    arguments[2] = "--replica";
    arguments[3] = "1";
    arguments[4] = "--partition";
    arguments[5] = "1";
    arguments[6] = "--topic";
    arguments[7] = "test-topic-Biks";
    
    CreateTopicCommand.main(arguments);
    

    NB:您应该为
    jopt-simple-4.5
    &
    zkclient-0.1

    添加maven依赖项,因为有几种方式您的调用不起作用

  • 如果您的Kafka群集没有足够的节点来支持复制值3

  • 如果有chroot路径前缀,则必须将其附加在zookeeper端口之后

  • 运行时,您不在Kafka安装目录中(这是最有可能的情况)

  • 在Kafka 0.8.1+(目前最新版本的Kafka)中,您可以通过
    AdminCommand
    以编程方式创建新主题。先前对此问题的一个答案中提到的
    CreateTopicCommand
    (旧卡夫卡0.8.0的一部分)功能已移至
    AdminCommand

    卡夫卡0.8.1的Scala示例:

    import kafka.admin.AdminUtils
    import kafka.utils.ZKStringSerializer
    import org.I0Itec.zkclient.ZkClient
    
    // Create a ZooKeeper client
    val sessionTimeoutMs = 10000
    val connectionTimeoutMs = 10000
    // Note: You must initialize the ZkClient with ZKStringSerializer.  If you don't, then
    // createTopic() will only seem to work (it will return without error).  The topic will exist in
    // only ZooKeeper and will be returned when listing topics, but Kafka itself does not create the
    // topic.
    val zkClient = new ZkClient("zookeeper1:2181", sessionTimeoutMs, connectionTimeoutMs,
        ZKStringSerializer)
    
    // Create a topic named "myTopic" with 8 partitions and a replication factor of 3
    val topicName = "myTopic"
    val numPartitions = 8
    val replicationFactor = 3
    val topicConfig = new Properties
    AdminUtils.createTopic(zkClient, topicName, numPartitions, replicationFactor, topicConfig)
    
    import kafka.utils.ZkUtils
    
    val sessionTimeoutMs = 10000
    val connectionTimeoutMs = 10000
    val (zkClient, zkConnection) = ZkUtils.createZkClientAndConnection(
      "localhost:2181", sessionTimeoutMs, connectionTimeoutMs) 
    
    以sbt为例构建依赖关系:

    libraryDependencies ++= Seq(
      "com.101tec" % "zkclient" % "0.4",
      "org.apache.kafka" % "kafka_2.10" % "0.8.1.1"
        exclude("javax.jms", "jms")
        exclude("com.sun.jdmk", "jmxtools")
        exclude("com.sun.jmx", "jmxri"),
      ...
    )
    
    编辑:添加了Kafka 0.9.0.0的Java示例(2016年1月的最新版本)。

    Maven依赖项:

    <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka_2.11</artifactId>
        <version>0.9.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.7</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka_2.11</artifactId>
        <version>0.10.2.0</version>
    </dependency>
    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.9</version>
    </dependency>
    
    编辑2:添加了Kafka 0.10.2.0的Java示例(2017年4月的最新版本)。

    Maven依赖项:

    <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka_2.11</artifactId>
        <version>0.9.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.7</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka_2.11</artifactId>
        <version>0.10.2.0</version>
    </dependency>
    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.9</version>
    </dependency>
    

    要通过java api和Kafka 0.8+创建主题,请尝试以下操作:

    下面的第一个导入语句

    import kafka.utils.ZKStringSerializer$;
    
    按以下方式为ZkClient创建对象

    ZkClient zkClient = new ZkClient("localhost:2181", 10000, 10000, ZKStringSerializer$.MODULE$);
    AdminUtils.createTopic(zkClient, myTopic, 10, 1, new Properties());
    

    如果您使用的是Kafka 0.10.0.0+,则从Java创建主题需要传递RackAwareMode类型的参数。它是一个Scala case对象,从Java获取它的实例是很棘手的(例如,证明:但它不适用于我们的情况)

    幸运的是,rackAwareMode是一个可选参数。但是Java不支持可选参数。我们如何解决这个问题?以下是一个解决方案:

    AdminUtils.createTopic(zkUtils, topic, 1, 1, 
        AdminUtils.createTopic$default$5(),
        AdminUtils.createTopic$default$6());
    

    将它与miguno的答案一起使用,您就可以开始了。

    从Kafka 0.10.1开始,Michael提到的ZKStringSerializer是私有的(对于Scala)。您可以在ZkUtils中使用工厂方法createZkClient或createZkClientAndConnection

    卡夫卡0.10.1的Scala示例:

    import kafka.admin.AdminUtils
    import kafka.utils.ZKStringSerializer
    import org.I0Itec.zkclient.ZkClient
    
    // Create a ZooKeeper client
    val sessionTimeoutMs = 10000
    val connectionTimeoutMs = 10000
    // Note: You must initialize the ZkClient with ZKStringSerializer.  If you don't, then
    // createTopic() will only seem to work (it will return without error).  The topic will exist in
    // only ZooKeeper and will be returned when listing topics, but Kafka itself does not create the
    // topic.
    val zkClient = new ZkClient("zookeeper1:2181", sessionTimeoutMs, connectionTimeoutMs,
        ZKStringSerializer)
    
    // Create a topic named "myTopic" with 8 partitions and a replication factor of 3
    val topicName = "myTopic"
    val numPartitions = 8
    val replicationFactor = 3
    val topicConfig = new Properties
    AdminUtils.createTopic(zkClient, topicName, numPartitions, replicationFactor, topicConfig)
    
    import kafka.utils.ZkUtils
    
    val sessionTimeoutMs = 10000
    val connectionTimeoutMs = 10000
    val (zkClient, zkConnection) = ZkUtils.createZkClientAndConnection(
      "localhost:2181", sessionTimeoutMs, connectionTimeoutMs) 
    
    然后按照Michael的建议创建主题:

    import kafka.admin.AdminUtils
    
    val zkUtils = new ZkUtils(zkClient, zkConnection, false)
    val numPartitions = 4
    val replicationFactor = 1
    val topicConfig = new Properties
    val topic = "my-topic"
    AdminUtils.createTopic(zkUtils, topic, numPartitions, replicationFactor, topicConfig)
    

    从0.11.0.0开始,您只需要:

    <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka-clients</artifactId>
        <version>0.11.0.0</version>
    </dependency>
    
    此命令的输出是一个
    CreateTopicsResult
    ,您可以使用它为整个操作或每个单独的主题创建获取一个
    Future

    Properties config = new Properties();
    config.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka:9092");
    
    AdminClient admin = AdminClient.create(config);
    
    Map<String, String> configs = new HashMap<>();
    int partitions = 1;
    int replication = 1;
    
    admin.createTopics(asList(new NewTopic("topic", partitions, replication).configs(configs)));
    
    • 要获得整个操作的未来,请使用
      CreateTopicsResult#all()
    • 要单独获取所有主题的
      Future
      s,请使用
      CreateTopicsResult#values()
    例如:

    CreateTopicsResult result = ...
    KafkaFuture<Void> all = result.all();
    
    CreateTopicsResult=。。。
    KafkaFuture all=result.all();
    
    或:

    CreateTopicsResult=。。。
    对于(Map.Entry:result.values().entrySet()){
    试一试{
    entry.getValue().get();
    log.info(“主题{}已创建”,entry.getKey());
    }捕获(中断异常|执行异常e){
    if(Throwables.getRootCause(e)TopiceExistsException实例){
    log.info(“主题{}存在”,entry.getKey());
    }
    }
    }
    

    KafkaFuture
    是“支持调用链接和其他异步编程模式的灵活未来”,并且“最终将成为Java 8的
    completedlefuture
    之上的一块薄垫片”

    我们可以使用
    AdminZkClient
    来管理Kafka服务器中的主题

    String zookeeperHost = "127.0.0.1:2181";
    Boolean isSucre = false;
    int sessionTimeoutMs = 200000;
    int connectionTimeoutMs = 15000;
    int maxInFlightRequests = 10;
    Time time = Time.SYSTEM;
    String metricGroup = "myGroup";
    String metricType = "myType";
    KafkaZkClient zkClient = KafkaZkClient.apply(zookeeperHost,isSucre,sessionTimeoutMs,
                    connectionTimeoutMs,maxInFlightRequests,time,metricGroup,metricType);
    
    AdminZkClient adminZkClient = new AdminZkClient(zkClient);
    
    String topicName1 = "myTopic";
    int partitions = 3;
    int replication = 1;
    Properties topicConfig = new Properties();
    
    adminZkClient.createTopic(topicName1,partitions,replication,
                topicConfig,RackAwareMode.Disabled$.MODULE$);
    
    有关详细信息,请参阅此链接

    基于最新的kafka客户端api和kafka 2.1.1,代码的工作版本如下:

    使用sbt导入最新的kafka客户端

    // https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients
    libraryDependencies += Seq("org.apache.kafka" % "kafka-clients" % "2.1.1",
    "org.apache.kafka" %% "kafka" % "2.1.1")
    
    在scala中创建主题的代码:

    import java.util.Arrays
    import java.util.Properties
    
    import org.apache.kafka.clients.admin.NewTopic
    import org.apache.kafka.clients.admin.{AdminClient, AdminClientConfig}
    
    class CreateKafkaTopic {
      def create(): Unit = {
        val config = new Properties()
        config.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "192.30.1.5:9092")
    
        val localKafkaAdmin = AdminClient.create(config)
    
        val partitions = 3
        val replication = 1.toShort
        val topic = new NewTopic("integration-02", partitions, replication)
        val topics = Arrays.asList(topic)
    
        val topicStatus = localKafkaAdmin.createTopics(topics).values()
        //topicStatus.values()
        println(topicStatus.keySet())
      }
    
    }
    
    使用以下方法验证新主题:

    ./kafka-topics.sh --zookeeper 192.30.1.5:2181 --list
    
    希望对别人有帮助。
    参考:

    在运行命令之前,您应该在
    KAFKA_BASE_DIR
    (安装KAFKA的位置,例如/var/KAFKA)中。直接进入bin,然后编写sh KAFKA-create-topic.sh--topic mytopic--replica 3--zookeer localhost:2181。或者sh./kafka-create-topic.sh--topic mytopic--replica 3--zookeeper localhost:2181 one dir p