web-dev-qa-db-ja.com

Kafka through Javaでトピックを作成する方法

Javaを使用してKafka(kafka_2.8.0-0.8.1.1)にトピックを作成します。コマンドプロンプトでトピックを作成した場合、およびJava APIを介してメッセージをプッシュした場合、問題なく動作します。しかし、Java APIを使用してトピックを作成したいと思います。以下のコードを見つけた長い検索の後、

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

上記のコードを試したところ、トピックが作成されていることが示されていますが、トピック内のメッセージをプッシュできません。私のコードに何か問題がありますか?または上記を達成する他の方法はありますか?

36
Jaya Ananthram

私はそれを修正しました..長い研究の後..

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

上記のコードから、ZkClientはトピックを作成しますが、このトピック情報はkafkaを認識しません。ですから、ZkClientのオブジェクトを次の方法で作成する必要があります。

最初に以下のステートメントをインポートし、

import kafka.utils.ZKStringSerializer$;

次の方法でZkClientのオブジェクトを作成します。

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

編集1:(@ajkretコメント用)

上記のコードは、APIが変更されているため、kafka> 0.9では機能しません。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

プロセスは、最新(2.1.0)APIでかなり簡素化されているようです。 Kafka 2.1.0の最新のAPIを使用すると、次のように実行できます。

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

kafka.propertiesファイルの内容は次のとおりです

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

新しく作成されたトピックを反映するには、AdminClientのインスタンスを閉じる必要があることに注意してください。

Kafka (これを書いている時点で、私はKafka v0。 10.0.0)

変更する必要があります。

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

以下へ;

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

終了したら接続を閉じることもお勧めします。

zkClient.close();
7
Richard G

AdminUtils APIは非推奨になっています。 Kafka=サーバーでトピックを管理するために使用できる新しいAPI AdminZkClientがあります。

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

詳細については、このリンクを参照できます。 https://www.analyticshut.com/streaming-services/kafka/create-and-list-kafka-topics-in-Java/

5
Mahesh Mogal

kafka v0.10.2.1でこれを達成しようとして、シリアル化エラー 'Java.io.StreamCorruptedException: invalid stream header: 3139322E '以下は、必要なインポートを含むサンプル作業コードです。

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