Kafka Connectアプリケーションを本番環境でデプロイすることを検討しています。ただし、tasks.maxの設定について、必要で重要性が高いという2つの質問がありますが、実際に何をすべきかについては詳細があいまいです。この値をに設定します。
データを消費してシンクに書き込みたいパーティションがn個あるトピックがある場合(私の場合はS3に書き込んでいます)、tasks.maxを何に設定する必要がありますか? nに設定する必要がありますか? 2nに設定する必要がありますか?直感的には、値をnに設定したいと思うようで、それが私がやってきたことです。
Kafkaトピックを変更し、トピックのパーティションを増やすとどうなりますか?Kafkaコネクタを一時停止し、設定した場合はtasks.maxを増やす必要があります。 nに?2nの値を設定した場合、コネクタは自動的に動作する並列処理を増やす必要がありますか?
Kafka Connectシンクでは、タスクは基本的にコンシューマスレッドであり、読み取り元のパーティションを受信します。10個のパーティションがあり、tasks.max
が5に設定されている場合、各タスクは2つのパーティションを受信しますオフセットを読み取り、追跡します。tasks.max
をパーティション数を超える数に構成した場合、Connectは、読み取っているトピックのパーティションに等しい数のタスクを起動します。
トピックのパーティション数を変更した場合、接続タスクを再起動する必要があります。tasks.max
がまだパーティション数よりも大きい場合、Connectはその数のタスクを開始します。
編集、発見されたばかりConnectorContext
: https://kafka.Apache.org/0100/javadoc/org/Apache/kafka/connect/connector/ConnectorContext.html
これを含めるようにコネクタを作成する必要がありますが、トピックの変更(パーティションの追加/削除)があった場合、Connectにはコネクタを再構成する機能があるようです。
パーティションの数よりもtasks.max
の数が多いため、Kafka-Connect(5.1.2)インスタンス間のワークロードの分散に問題がありました。
私たちの場合、10個のKafka接続タスクと消費されるトピックの3つのパーティションがありました。これらの10個のワーカーのうち3個はトピックの3個のパーティションに割り当てられ、他の7個はどのパーティションにも割り当てられていませんが(予想されます)、Kafka Connectは、ワークロードを考慮せずにタスクを均等に分散していました。そのため、一部のインスタンスが存在するインスタンスにタスクを分散することになりました。アイドル状態を維持する(空でないワーカーに割り当てられていないため)か、一部のインスタンスが他のインスタンスよりも多く機能しています。
この問題を解決するために、tasks.max
をトピックのパーティション数に等しく設定します。
Kafka Connectがリバランス中にタスクの割り当てを考慮しないことは、私たちにとって本当に予想外のことです。また、tasks.max
設定に関するドキュメントも見つかりませんでした。