生産および消費ジョブを開始する前に、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サーバーが実行中であり、プロデューサーの準備ができていることを知る方法はありますか。一部の開始データパケットが失われるため、これを確認する必要があります。
ありがとう。
すべてのKafkaブローカーにはbroker.id
を割り当てる必要があります。起動時に、ブローカーは/broker/ids/$id
のパスでZookeeperに一時ノードを作成します。ノードは一時的なものなので、ブローカーが切断されるとすぐに削除されます。シャットダウンすることにより。
以下のように、一時的なブローカーノードのリストを表示できます。
echo dump | nc localhost 2181 | grep brokers
ZooKeeperクライアントインターフェイスは多くのコマンドを公開します。 dump
は、クラスターのすべてのセッションおよび一時ノードをリストします。
注:上記の前提:
localhost
のデフォルトポート(2181
)で実行しており、そのlocalhost
がクラスターのリーダーですzookeeper.connect
Kafka configは、Kafkaクラスターのchroot envを指定していません。つまり、Host:port
ではなくHost:port/path
だけです。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
}
ポールの答えは非常に良く、ブローカーの観点から見ると、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()
}
Linuxの場合、「ps aux | grep kafka」は、kafkaプロパティが結果に表示されるかどうかを確認します。例えば。 /path/to/kafka/server.properties
以下のコードを使用して、サーバーが実行されている場合に利用可能なブローカーを確認できます。
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;
}
良いオプションは、メッセージの生成または消費を開始する前に、以下のように 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;