Java 我们如何使用API从IDE在Kafka中创建主题
我们如何使用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
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
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