web-dev-qa-db-ja.com

Kafkaサーバーが実行されているかどうかを確認する方法は?

生産および消費ジョブを開始する前に、kafkaサーバーが実行されているかどうかを確認したい。これはWindows環境にあり、ここにEclipseでの私のkafkaサーバーのコードがあります...

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サーバーが実行中であり、プロデューサーの準備ができていることを知る方法はありますか。一部の開始データパケットが失われるため、これを確認する必要があります。

ありがとう。

35
Khan

すべてのKafkaブローカーにはbroker.idを割り当てる必要があります。起動時に、ブローカーは/broker/ids/$idのパスでZookeeperに一時ノードを作成します。ノードは一時的なものなので、ブローカーが切断されるとすぐに削除されます。シャットダウンすることにより。

以下のように、一時的なブローカーノードのリストを表示できます。

echo dump | nc localhost 2181 | grep brokers

ZooKeeperクライアントインターフェイスは多くのコマンドを公開します。 dumpは、クラスターのすべてのセッションおよび一時ノードをリストします。

注:上記の前提:

  • ZooKeeperをlocalhostのデフォルトポート(2181)で実行しており、そのlocalhostがクラスターのリーダーです
  • zookeeper.connect Kafka configは、Kafkaクラスターのchroot envを指定していません。つまり、Host:portではなくHost:port/pathだけです。
36
Paul Carey

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
}
4
Mohammad Faisal

ポールの答えは非常に良く、ブローカーの観点から見ると、Kafkaと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()
  }
3
dbustosp

Linuxの場合、「ps aux | grep kafka」は、kafkaプロパティが結果に表示されるかどうかを確認します。例えば。 /path/to/kafka/server.properties

2
Raffy Arnaez

以下のコードを使用して、サーバーが実行されている場合に利用可能なブローカーを確認できます。

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;
    }
0
usman

良いオプションは、メッセージの生成または消費を開始する前に、以下のように 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;
        }

合流したカフカでイベント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;