我正在编写一个客户端来使用kafka 0.9。我想知道如何创建一个主题。这个回答:How to create a Topic in Kafka through Java与我的要求类似。除此之外,该解决方案仅适用于Kafka 0.8.2,这与Kafka 0.9的API有很大不同。
答案 0 :(得分:9)
我尝试跟随Soon Chee Loong对Kafka 0.9.0.1的回答,但不得不做出一个改变。 ZKStringSerializer现在是私有的。为了创建ZkUtils,我使用了以下API(它在内部创建了一个ZkClient):
ZkUtils.apply(
"zookeeper1:port1,zookeeper2:port2",
sessionTimeoutMs,
connectionTimeoutMs,
false)
答案 1 :(得分:8)
在线查看scala api和各种链接后。
这是我找到的解决方案:
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>
代码:
import java.util.Properties;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.ZkConnection;
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;
ZkClient zkClient = new ZkClient(
zookeeperConnect,
sessionTimeoutMs,
connectionTimeoutMs,
ZKStringSerializer$.MODULE$);
// Security for Kafka was added in Kafka 0.9.0.0
boolean isSecureKafkaCluster = false;
// ZkUtils for Kafka was used in Kafka 0.9.0.0 for the AdminUtils API
ZkUtils zkUtils = new ZkUtils(zkClient, new ZkConnection(zookeeperConnect), isSecureKafkaCluster);
String topic = "my-topic";
int partitions = 2;
int replication = 3;
// Add topic configuration here
Properties topicConfig = new Properties();
AdminUtils.createTopic(zkUtils, topic, partitions, replication, topicConfig);
zkClient.close();
}
}
如果您想知道为什么下面的代码看起来不像Java:
ZKStringSerializer$.MODULE$
这是因为ZkStringSerializer是一个Scala对象。 您可以在这里阅读更多相关信息:
How create Kafka ZKStringSerializer in Java?
注意:您必须使用ZKStringSerializer初始化ZkClient 如果你不这样做,那么createTopic()似乎只会起作用 (换句话说:它会毫无错误地返回) 该主题仅存在于Zookeeper中,仅在列出主题时有效。 即下面的列表命令工作正常
bin/kafka-topics.sh --list --zookeeper localhost:2181
但卡夫卡本身并没有创造这个话题。 为了说明,下面的describe命令将引发错误。
bin/kafka-topics.sh --describe --zookeeper localhost:2181
因此,请确保使用ZKStringSerializer $ .MODULE $初始化它。
参考文献: How Can we create a topic in Kafka from the IDE using API从最IDE-使用-API
很快Chee Loong, 多伦多大学
答案 2 :(得分:1)
对于Kafka 0.9及更高版本,您需要使用新的API AdminZkClient。 AdminUtils API已弃用。
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$);
您可以查看更多详细信息at this link