我想在开始生产和消费工作之前确保kafka服务器是否正在运行。它是在windows环境中,这是我的kafka服务器在eclipse中的代码......
Properties kafka = new Properties();
kafka.setProperty("broker.id", "1");
kafka.setProperty("port", "9092");
kafka.setProperty("log.dirs", "D://workspace//");
kafka.setProperty("zookeeper.connect", "localhost:2181");
Option<String> option = Option.empty();
KafkaConfig config = new KafkaConfig(kafka);
KafkaServer server = new KafkaServer(config, new CurrentTime(), option);
server.startup();
在这种情况下,if (server != null)
是不够的,因为它始终是真的。那么有没有办法知道我的kafka服务器正在运行并为生产者做好准备。我有必要检查一下,因为它会导致丢失一些起始数据包。
感谢。
答案 0 :(得分:32)
必须为所有Kafka经纪人分配async
。启动时,代理将在Zookeeper中创建一个短暂的节点,路径为broker.id
。由于节点是短暂的,所以一旦代理断开连接,它将被移除,例如,通过关闭。
您可以查看短暂的代理节点列表,如下所示:
/broker/ids/$id
ZooKeeper客户端界面公开了许多命令; echo dump | nc localhost 2181 | grep brokers
列出了群集的所有会话和临时节点。
注意,以上假设:
dump
上的默认端口2181
)上运行ZooKeeper,而localhost
是群集的领导者localhost
Kafka配置没有为您的Kafka群集指定chroot env,即它只是zookeeper.connect
而不是host:port
答案 1 :(得分:3)
保罗的回答非常好,实际上是卡夫卡和Zk从经纪人的角度一起工作。
我想说另一个检查Kafka服务器是否正在运行的简单选项是创建一个指向cluste的简单KafkaConsumer并尝试一些操作,例如 listTopics()。如果kafka服务器未运行,您将获得 TimeoutException ,然后您可以使用try-catch
句子。
def validateKafkaConnection(kafkaParams : mutable.Map[String, Object]) : Unit = {
val props = new Properties()
props.put("bootstrap.servers", kafkaParams.get("bootstrap.servers").get.toString)
props.put("group.id", kafkaParams.get("group.id").get.toString)
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
val simpleConsumer = new KafkaConsumer[String, String](props)
simpleConsumer.listTopics()
}
答案 2 :(得分:3)
我使用了AdminClient api。
Properties properties = new Properties();
properties.put("bootstrap.servers", "localhost:9092");
properties.put("connections.max.idle.ms", 10000);
properties.put("request.timeout.ms", 5000);
try (AdminClient client = KafkaAdminClient.create(properties))
{
ListTopicsResult topics = client.listTopics();
Set<String> names = topics.names().get();
if (names.isEmpty())
{
// case: if no topic found.
}
return true;
}
catch (InterruptedException | ExecutionException e)
{
// Kafka is not available
}
答案 3 :(得分:3)
您可以在计算机上安装 Kafkacat 工具
例如在Ubuntu上,您可以使用
进行安装apt-get install kafkacat
一旦安装了kafkacat,则可以使用以下命令进行连接
kafkacat -b <your-ip-address>:<kafka-port> -t test-topic
运行上述命令后,如果kafkacat能够建立连接,则表明kafka已启动并正在运行
答案 4 :(得分:1)
首先,您需要创建 AdminClient bean:
@Bean
public AdminClient adminClient(){
Map<String, Object> configs = new HashMap<>();
configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG,
StringUtils.arrayToCommaDelimitedString(new Object[]{"your bootstrap server address}));
return AdminClient.create(configs);
}
然后,您可以使用以下脚本:
while (true) {
Map<String, ConsumerGroupDescription> groupDescriptionMap =
adminClient.describeConsumerGroups(Collections.singletonList(groupId))
.all()
.get(10, TimeUnit.SECONDS);
ConsumerGroupDescription consumerGroupDescription = groupDescriptionMap.get(groupId);
log.debug("Kafka consumer group ({}) state: {}",
groupId,
consumerGroupDescription.state());
if (consumerGroupDescription.state().equals(ConsumerGroupState.STABLE)) {
boolean isReady = true;
for (MemberDescription member : consumerGroupDescription.members()) {
if (member.assignment() == null || member.assignment().topicPartitions().isEmpty()) {
isReady = false;
}
}
if (isReady) {
break;
}
}
log.debug("Kafka consumer group ({}) is not ready. Waiting...", groupId);
TimeUnit.SECONDS.sleep(1);
}
此脚本将每秒检查使用者组的状态,直到状态为稳定。由于所有使用者均已分配给主题分区,因此您可以得出结论,服务器正在运行并准备就绪。
答案 5 :(得分:0)
好的选择是在开始制作或使用消息之前使用AdminClient,如下所示
private static final int ADMIN_CLIENT_TIMEOUT_MS = 5000;
try (AdminClient client = AdminClient.create(properties)) {
client.listTopics(new ListTopicsOptions().timeoutMs(ADMIN_CLIENT_TIMEOUT_MS)).listings().get();
} catch (ExecutionException ex) {
LOG.error("Kafka is not available, timed out after {} ms", ADMIN_CLIENT_TIMEOUT_MS);
return;
}
答案 6 :(得分:0)
如果服务器正在运行,则可以使用以下代码检查可用的代理。
import org.I0Itec.zkclient.ZkClient;
public static boolean isBrokerRunning(){
boolean flag = false;
ZkClient zkClient = new ZkClient(endpoint.getZookeeperConnect(), 10000);//, kafka.utils.ZKStringSerializer$.MODULE$);
if(zkClient!=null){
int brokersCount = zkClient.countChildren(ZkUtils.BrokerIdsPath());
if(brokersCount > 0){
logger.info("Following Broker(s) {} is/are available on Zookeeper.",zkClient.getChildren(ZkUtils.BrokerIdsPath()));
flag = true;
}
else{
logger.error("ERROR:No Broker is available on Zookeeper.");
}
zkClient.close();
}
return flag;
}
答案 7 :(得分:0)
我在融合的卡夫卡中发现了一个事件OnError
:
consumer.OnError += Consumer_OnError;
private void Consumer_OnError(object sender, Error e)
{
Debug.Log("connection error: "+ e.Reason);
ConsumerConnectionError(e);
}
及其代码文档:
//
// Summary:
// Raised on critical errors, e.g. connection failures or all brokers down. Note
// that the client will try to automatically recover from errors - these errors
// should be seen as informational rather than catastrophic
//
// Remarks:
// Executes on the same thread as every other Consumer event handler (except OnLog
// which may be called from an arbitrary thread).
public event EventHandler<Error> OnError;
答案 8 :(得分:0)
对于Linux,“ ps aux | grep kafka”查看结果是否显示kafka属性。例如。 /path/to/kafka/server.properties