web-dev-qa-db-fra.com

Comment créer un sujet dans Kafka à Java

Je veux créer un sujet dans Kafka (kafka_2.8.0-0.8.1.1) via Java. Cela fonctionne bien si je crée un sujet dans l'invite de commande et si je pousse le message via l'api Java. Mais je veux créer un sujet via Java api. Après une longue recherche, j'ai trouvé le code ci-dessous,

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

J'ai essayé le code ci-dessus et cela montre que le sujet est créé mais je ne suis pas en mesure de pousser le message dans le sujet. Quelque chose ne va pas dans mon code? Ou tout autre moyen d'atteindre ce qui précède?

36
Jaya Ananthram

Je l'ai réparé .. Après une longue recherche ..

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

A partir du code ci-dessus, ZkClient créera un sujet mais ces informations de sujet n'auront pas connaissance de la kafka. Donc, ce que nous devons faire, c'est que nous devons créer un objet pour ZkClient de la manière suivante,

Importez d'abord la déclaration ci-dessous,

import kafka.utils.ZKStringSerializer$;

et créer 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());

Édition 1: (pour le commentaire @ajkret)

Le code ci-dessus ne fonctionnera pas pour kafka> 0.9 car l'api a été modifié, utilisez le code ci-dessous pour kafka> 0.9


import Java.util.Properties;
import kafka.admin.AdminUtils;
import kafka.utils.ZKStringSerializer$;
import kafka.utils.ZkUtils;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.ZkConnection;

public class KafkaTopicCreationInJava
{
    public static void main(String[] args) throws Exception {
        ZkClient zkClient = null;
        ZkUtils zkUtils = null;
        try {
            String zookeeperHosts = "192.168.20.1:2181"; // If multiple zookeeper then -> String zookeeperHosts = "192.168.20.1:2181,192.168.20.2:2181";
            int sessionTimeOutInMs = 15 * 1000; // 15 secs
            int connectionTimeOutInMs = 10 * 1000; // 10 secs

            zkClient = new ZkClient(zookeeperHosts, sessionTimeOutInMs, connectionTimeOutInMs, ZKStringSerializer$.MODULE$);
            zkUtils = new ZkUtils(zkClient, new ZkConnection(zookeeperHosts), false);

            String topicName = "testTopic";
            int noOfPartitions = 2;
            int noOfReplication = 3;
            Properties topicConfiguration = new Properties();

            AdminUtils.createTopic(zkUtils, topicName, noOfPartitions, noOfReplication, topicConfiguration);

        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (zkClient != null) {
                zkClient.close();
            }
        }
    }
}
37
Jaya Ananthram

Le processus semble être à peu près simplifié dans la dernière API (2.1.0). En utilisant la dernière API pour Kafka 2.1.0, cela peut être fait comme suit

import org.Apache.kafka.clients.admin.AdminClient;
import org.Apache.kafka.clients.admin.CreateTopicsResult;
import org.Apache.kafka.clients.admin.NewTopic;

Properties properties = new Properties();
properties.load(new FileReader(new File("kafka.properties")));

AdminClient adminClient = AdminClient.create(properties);
NewTopic newTopic = new NewTopic("topicName", 1, (short)1); //new NewTopic(topicName, numPartitions, replicationFactor)

List<NewTopic> newTopics = new ArrayList<NewTopic>();
newTopics.add(newTopic);

adminClient.createTopics(newTopics);
adminClient.close();

Le contenu de kafka.properties le fichier est le suivant

bootstrap.servers=localhost:9092
group.id=test
enable.auto.commit=true
auto.commit.interval.ms=1000
key.deserializer=org.Apache.kafka.common.serialization.StringDeserializer
value.deserializer=org.Apache.kafka.common.serialization.StringDeserializer

Notez que l'instance de AdminClient doit être fermée afin de refléter la rubrique nouvellement créée.

Juste un pointeur pour quiconque regarde cela avec une version mise à jour de Kafka (Au moment d'écrire ces lignes, j'utilisais Kafka v0. 10.0.0).

Vous devez changer;

AdminUtils.createTopic(zkUtils, topicName, noOfPartitions, noOfReplications, topicConfiguration);

Aux suivants;

AdminUtils.createTopic(zkUtils, topicName, noOfPartitions, noOfReplications, true, Enforced$.MODULE$);

C'est également une bonne idée de fermer la connexion une fois terminée;

zkClient.close();
7
Richard G

L'API AdminUtils devient obsolète. Il existe une nouvelle API AdminZkClient que nous pouvons utiliser pour gérer les sujets sur 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/

5
Mahesh Mogal

Pour ceux qui tentent d'atteindre cet objectif dans kafka v0.10.2.1 et rencontrent des problèmes avec une erreur de sérialisation 'Java.io.StreamCorruptedException: invalid stream header: 3139322E 'ci-dessous est un exemple de code de travail avec les importations nécessaires.

import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.ZkConnection;
import org.I0Itec.zkclient.exception.ZkMarshallingError;
import org.I0Itec.zkclient.serialize.ZkSerializer;
import org.Apache.kafka.clients.consumer.KafkaConsumer;
import org.Apache.kafka.common.PartitionInfo;

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

public static void createTopic(String topicName, int numPartitions, int numReplication) {
        ZkClient zkClient = null;
        ZkUtils zkUtils = null;
        try {
            String zookeeperHosts = "199.98.916.902:2181"; // If multiple zookeeper then -> String zookeeperHosts = "192.168.20.1:2181,192.168.20.2:2181";
            int sessionTimeOutInMs = 15 * 1000; // 15 secs
            int connectionTimeOutInMs = 10 * 1000; // 10 secs

            zkClient = new ZkClient(zookeeperHosts, sessionTimeOutInMs, connectionTimeOutInMs);
            //Ref: https://Gist.github.com/jjkoshy/3842975
            zkClient.setZkSerializer(new ZkSerializer() {
                @Override
                public byte[] serialize(Object o) throws ZkMarshallingError {
                    return ZKStringSerializer.serialize(o);
                }

                @Override
                public Object deserialize(byte[] bytes) throws ZkMarshallingError {
                    return ZKStringSerializer.deserialize(bytes);
                }
            });

            zkUtils = new ZkUtils(zkClient, new ZkConnection(zookeeperHosts), false);

            int noOfPartitions = 2;
            int noOfReplication = 3;
            Properties topicConfiguration = new Properties();

            AdminUtils.createTopic(zkUtils, topicName, noOfPartitions, noOfReplication, topicConfiguration,
                    RackAwareMode.Enforced$.MODULE$);

        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (zkClient != null) {
                zkClient.close();
            }
        }
    }
5
Saurabh Mishra