web-dev-qa-db-fra.com

Comment pouvons-nous créer un sujet à Kafka à partir du IDE en utilisant API

Comment pouvons-nous créer une rubrique dans Kafka à partir de IDE à l'aide de l'API, car lorsque je le fais:

bin/kafka-create-topic.sh --topic mytopic --replica 3 --zookeeper localhost:2181

Je reçois l'erreur:

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

Et j'ai suivi la configuration du développeur telle quelle.

44
ramu

Dans Kafka 0.8.1+, la dernière version de Kafka d’aujourd’hui, vous pouvez créer un nouveau sujet par programme via AdminCommand. La fonctionnalité de CreateTopicCommand (une partie de l'ancienne version de Kafka 0.8.0) mentionnée dans l'une des réponses précédentes à cette question a été déplacée à AdminCommand.

Exemple de Scala pour Kafka 0.8.1:

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)

Construisez des dépendances, en utilisant sbt comme exemple:

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"),
  ...
)

EDIT: exemple Java ajouté pour Kafka 0.9.0.0 (dernière version en date de janvier 2016).

Dépendances 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>

Code:

import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.ZkConnection;

import Java.util.Properties;

import kafka.admin.AdminUtils;
import kafka.utils.ZKStringSerializer$;
import kafka.utils.ZkUtils;

public class KafkaJavaExample {

  public static void main(String[] args) {
    String zookeeperConnect = "zkserver1:2181,zkserver2:2181";
    int sessionTimeoutMs = 10 * 1000;
    int connectionTimeoutMs = 8 * 1000;
    // 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.
    ZkClient zkClient = new ZkClient(
        zookeeperConnect,
        sessionTimeoutMs,
        connectionTimeoutMs,
        ZKStringSerializer$.MODULE$);

    // Security for Kafka was added in Kafka 0.9.0.0
    boolean isSecureKafkaCluster = false;
    ZkUtils zkUtils = new ZkUtils(zkClient, new ZkConnection(zookeeperConnect), isSecureKafkaCluster);

    String topic = "my-topic";
    int partitions = 2;
    int replication = 3;
    Properties topicConfig = new Properties(); // add per-topic configurations settings here
    AdminUtils.createTopic(zkUtils, topic, partitions, replication, topicConfig);
    zkClient.close();
  }

}

EDIT 2: exemple Java ajouté pour Kafka 0.10.2.0 (dernière version en date d'avril 2017).

Dépendances Maven:

<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>

Code:

import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.ZkConnection;

import Java.util.Properties;

import kafka.admin.AdminUtils;
import kafka.admin.RackAwareMode;
import kafka.utils.ZKStringSerializer$;
import kafka.utils.ZkUtils;

public class KafkaJavaExample {

  public static void main(String[] args) {
    String zookeeperConnect = "zkserver1:2181,zkserver2:2181";
    int sessionTimeoutMs = 10 * 1000;
    int connectionTimeoutMs = 8 * 1000;

    String topic = "my-topic";
    int partitions = 2;
    int replication = 3;
    Properties topicConfig = new Properties(); // add per-topic configurations settings here

    // 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.
    ZkClient zkClient = new ZkClient(
        zookeeperConnect,
        sessionTimeoutMs,
        connectionTimeoutMs,
        ZKStringSerializer$.MODULE$);

    // Security for Kafka was added in Kafka 0.9.0.0
    boolean isSecureKafkaCluster = false;

    ZkUtils zkUtils = new ZkUtils(zkClient, new ZkConnection(zookeeperConnect), isSecureKafkaCluster);
    AdminUtils.createTopic(zkUtils, topic, partitions, replication, topicConfig, RackAwareMode.Enforced$.MODULE$);
    zkClient.close();
  }

}
71
Michael G. Noll

Depuis 0.11.0.0, tout ce dont vous avez besoin est:

<dependency>
    <groupId>org.Apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>0.11.0.0</version>
</dependency>

Cet artefact contient maintenant la AdminClient (org.Apache.kafka.clients.admin). 

AdminClient peut gérer de nombreuses tâches administratives de Kafka, notamment la création de sujets:

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)));

Le résultat de cette commande est une CreateTopicsResult, que vous pouvez utiliser pour obtenir une Future pour l'ensemble de l'opération ou pour chaque création de sujet individuel:

  • pour obtenir un avenir pour toute l'opération, utilisez CreateTopicsResult#all().
  • pour obtenir Futures pour tous les sujets individuellement, utilisez CreateTopicsResult#values().

Par exemple: 

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

ou:

CreateTopicsResult result = ...
for (Map.Entry<String, KafkaFuture<Void>> entry : result.values().entrySet()) {
    try {
        entry.getValue().get();
        log.info("topic {} created", entry.getKey());
    } catch (InterruptedException | ExecutionException e) {
        if (Throwables.getRootCause(e) instanceof TopicExistsException) {
            log.info("topic {} existed", entry.getKey());
        }
    }
}

KafkaFuture est "un avenir flexible qui prend en charge le chaînage d'appels et d'autres modèles de programmation asynchrones" et "finira par devenir une mince couche au-dessus de CompletebleFuture de Java 8".

29
Dmitry Minkovsky

Pour créer un sujet via Java api et Kafka 0.8+, essayez ce qui suit:

Première importation sous déclaration

import kafka.utils.ZKStringSerializer$;

Créez un objet pour ZkClient de la manière suivante,

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

Vous pouvez essayer avec la classe scala kafka.admin.CreateTopicCommand de créer un sujet à partir de code Java ... en fournissant les arguments nécessaires.

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: Vous devez ajouter les dépendances maven pour jopt-simple-4.5 & zkclient-0.1 

10
Biks

Si vous utilisez Kafka 0.10.0.0+, la création d'une rubrique à partir de Java nécessite la transmission du paramètre de type RackAwareMode. C'est un objet de cas Scala, et obtenir son instance de Java est délicat (preuve: Comment "obtenir" un objet de cas Scala de Java? par exemple. Mais cela ne s'applique pas à notre cas).

Heureusement, rackAwareMode est un paramètre facultatif. Pourtant, Java ne supporte pas les paramètres optionnels. Comment pouvons-nous résoudre cela? Voici une solution:

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

Utilisez-le avec la réponse de miguno, et vous êtes prêt à partir.

2
Dmitriusan

Quelques façons dont votre appel ne fonctionnerait pas. 

  1. Si votre cluster Kafka ne possède pas suffisamment de nœuds pour prendre en charge une valeur de réplication de 3. 

  2. S'il y a un préfixe de chemin d'accès chroot, vous devez l'ajouter après le port de zookeeper

  3. Vous n'êtes pas dans le répertoire d'installation de Kafka lors de l'exécution (c'est le plus probable)

1
Gregory Patmore

Dans Kafka 0.8 Exemple de producteur , l'exemple ci-dessous crée un sujet nommé page_visits et commence également à produire si l'attribut auto.create.topics.enable est défini sur true (valeur par défaut) dans le fichier Kafka Broker config .

import Java.util.*;

import kafka.javaapi.producer.Producer;
import kafka.producer.KeyedMessage;
import kafka.producer.ProducerConfig;

public class TestProducer {
    public static void main(String[] args) {
        long events = Long.parseLong(args[0]);
        Random rnd = new Random();

        Properties props = new Properties();
        props.put("metadata.broker.list", "broker1:9092,broker2:9092 ");
        props.put("serializer.class", "kafka.serializer.StringEncoder");
        props.put("partitioner.class", "example.producer.SimplePartitioner");
        props.put("request.required.acks", "1");

        ProducerConfig config = new ProducerConfig(props);

        Producer<String, String> producer = new Producer<String, String>(config);

        for (long nEvents = 0; nEvents < events; nEvents++) { 
            long runtime = new Date().getTime();  
            String ip = “192.168.2.” + rnd.nextInt(255); 
            String msg = runtime + “,www.example.com,” + ip; 
            KeyedMessage<String, String> data = new KeyedMessage<String, String>("page_visits", ip, msg);
            producer.send(data);
        }
        producer.close();
   }
}
1
Hild

De quel IDE essayez-vous?

Veuillez indiquer le chemin complet. La commande ci-dessous crée un sujet.

  1. cd kafka/bin
  2. ./kafka-create-topic.sh --topic test --zookeeper localhost:2181
0
Sanket

Il existe une nouvelle API AdminZkClient que nous pouvons utiliser pour gérer les rubriques dans le serveur 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$);

Vous pouvez consulter ce lien pour plus de détails https://www.analyticshut.com/streaming-services/kafka/create-and-list-kafka-topics-in-Java/

0
Mahesh Mogal

Sur la base des dernières API kafka-client et Kafka 1.1.1, la version de travail du code est la suivante:

Importez les derniers clients kafka en utilisant sbt.

// https://mvnrepository.com/artifact/org.Apache.kafka/kafka-clients
libraryDependencies += Seq("org.Apache.kafka" % "kafka-clients" % "2.1.1",
"org.Apache.kafka" %% "kafka" % "1.0.0")

Le code pour la création de sujet dans 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())
  }

}

Validez le nouveau sujet en utilisant:

./kafka-topics.sh --zookeeper 192.30.1.5:2181 --list

J'espère que cela aidera quelqu'un . Référence: http://kafka.Apache.org/21/javadoc/index.html?org/Apache/kafka/clients/admin/AdminClient.html

0
Tammy