Apache Kafka® Connectの開発をスピードアップする8つのヒント

<font color="Grey">*[8 tips to speed up Apache Kafka® Connect development ](https://aiven.io/blog/8-tips-to-speed-up-apache-kafka-connect-development)の翻訳です。*</font>

2022年11月29日

# Apache Kafka® Connectの開発をスピードアップする8つのヒント

Apache Kafka® Connectの設定は、時としてダークマジックのように思えるかもしれません。Apache Kafka® Connectの設定は、時として暗黒魔法のように思えるかもしれません。

Apache Kafka®は最新のデータプラットフォームのバックボーンであり、データを必要な場所に流すことができます。Kafka Connectは、JSON設定ファイルで数行を定義するだけで、Apache Kafkaをデータソースやデータシンクとしてさまざまなテクノロジーと統合できる魔法のようなものです。


時には、Apache Kafka® Connectはダークマジックのように見えるかもしれません：部分的に重複する機能を持つコネクタの多さ、一貫性のない設定パラメータ、曖昧なエラーメッセージは、ツールの背後に隠されたアートのように感じられるかもしれません。そのため、特にこの分野で初心者の場合、いくつかのKafka Connect設定のヒントを使えば、コネクトの神にゴキブリを捧げることから、完璧に動作する信頼性の高いストリーミングパイプラインにすることができます。


## ヒント #0: 基本ルール


ヒントの前に、Apache Kafka® Connectのマジシャンになるための基本的な法則をお伝えします：マニュアルを読むこと！


![image](https://cdn.sanity.io/images/sczeoy4w/production/b27f7fe1cd75b700912cc815384c209f706125dd-1875x1042.png?q=80&fit=min&auto=format&dpr=1.5)


Apache Kafka® Connectは、複雑な統合問題を解決し、複雑さの一部を取り除くという素晴らしい仕事をしている。とはいえ、この領域は非常に広く、多種多様なテクノロジーが存在し、同じような統合問題を解決するコネクターが部分的に重なり合っている。


次のKafka Connect Houdiniになるための最初の義務は、情報を拾い読みし、解決しようとしている統合問題にどのコネクタが存在するのかを理解し、説明書を注意深く読んで、私たちのケースでの使い方を評価することです。


さて、いよいよ正式にヒントを始める時が来た！


## ヒントその1：データの着地点を準備する


マジシャンがトリックに使うウサギを格納するために帽子を使うように、私たちはデータが適切に着地するための柔らかいクッションを準備する必要がある。Apache Kafka®からデータをソーシングするにしても、シンクするにしても、データを受け取るために必要なデータ構造をすべて事前に作成しておく必要がある。


たいていの場合、`auto_create_topics_enable`、`auto.create`、`auto.evolve`といったショートカットが提供され、対象のトピックやテーブルの作成を Apache Kafka® Connect に委任する。しかし、そうすることでこれらのアーティファクトの制御ができなくなり、下流のデータパイプラインで問題が発生する可能性がある。例えば、Kafka Connectはデフォルトのパーティション数でトピックを生成したり、思い通りのパーティショニングをせずにテーブルを生成したりします。そのため、ドキュメントをよく読み、それに従って必要なランディングスポットを事前に作成することをお勧めします。


ドキュメントを読んでもまだデータの着地点がわからない場合は、テスト環境を作成して `auto_create_topics_enable` または `auto.create` を有効にし、どの成果物が作成されたかをメモしておけば、本番環境で適切に定義できる。


## ヒント #2: 様々なコネクタの利点、限界、リスクを評価する


マジシャンがトリックを披露するためにすべての呪文を学ぶ必要があるように、私たちもApache Kafka® Connectの空間について同様の知識を集める必要があります。前述したように、Kafka Connectは素晴らしく広い空間であり、異なるコネクターが同じような問題を少しずつ異なる方法で解決している。


Kafka Connectをうまく使いこなすためには、私たちが直面している統合問題を解決する可能性のあるコネクタを理解し、そのメリット、技術的およびライセンス上の制限、関連するリスクを理解することが重要です。選択肢の明確なマップがあれば、ニーズに合わせて最適なものを選ぶことができる。


例えば、データベースのデータをApache Kafka®に取り込むには、[JDBCクエリ](https://docs.aiven.io/docs/products/kafka/kafka-connect/howto/jdbc-source-connector-pg.html)に基づくポーリングメカニズムか、[Debezium](https://docs.aiven.io/docs/products/kafka/kafka-connect/howto/debezium-source-connector-pg.html)のプッシュメカニズムの2つの選択肢があります。どちらも有効な選択肢のように見えますが、境界を押し広げ始めると、[JDBCソリューションはその限界を見せます](https://www.confluent.io/events/kafka-summit-london-2022/jdbc-source-connector-what-could-go-wrong/)。ソリューションの限界を知ることは、より良い選択をするのに役立つだろう。


## ヒント#3: 前提条件をチェックする


![image](https://cdn.sanity.io/images/sczeoy4w/production/ff2955961f12be4d17a5e2088b52bbf9d826b68f-1875x1042.png?q=80&fit=min&auto=format&dpr=1.5)


マジシャンは、ポーションの材料がすべて揃っていることを確認する必要がある。コネクターを成功させるためには、すべての前提条件が満たされているかどうかを確認するのと同じ注意を払う必要がある！


まず第一に、Apache Kafka® ConnectはJavaベースなので、特定のコネクタを実行するには、必要な**JAR依存関係**をすべて正確に正しいフォルダに置く必要があります（[Twitterの場合](https://aiven.io/blog/connecting-twitter-to-aiven-for-apache-kafka)をチェックしてください）。これだけでも大変な作業ですが、[Aiven for Apache Kafka® Connect](https://aiven.io/kafka-connect)のようなマネージド・プラットフォームを利用することで、その手間を省くことができます。


依存関係が整理されたら、必要なものがすべてそこにあることを適切にテストする必要がある：


* ネットワークパス**をチェックする：データベースへのpingは可能か？ Google Cloud StorageはKafka Connectクラスタからアクセス可能か？
* 認証情報と権限**を評価する。
* 必要なオブジェクト**が配置されていることを検証する：ターゲットS3バケットはすでに配置されていますか？[Debezium](https://docs.aiven.io/docs/products/kafka/kafka-connect/howto/debezium-source-connector-pg.html)が必要とするデータベースのレプリケーションは？


コネクタを開始する前に、すべての断片が整っていることを確認することで、よりスムーズなエクスペリエンスが得られます。エンドポイント間のネットワーク接続がないことが問題なのに、コネクターの設定をチェックするのに2時間も時間を取られるのは一番避けたいことです。


### データ・フォーマット


データフォーマットは一般的に見落とされがちなトピックだが、正しく行われなければ、下流のパイプラインに大きな影響を与える。


デフォルトの設定を使用すると、ほとんどのソースコネクタは Apache Kafka® トピックに JSON 形式でデータをプッシュします。スキーマが適切に定義されていないため、データ構造を理解する必要があるリレーショナルデータベースのようなテクノロジーにデータをシンクすることができません。テーブルのキーと値のスキーマを使用してもフィールドが見つかりません」というエラーに直面することになり、現在のところ、このようなコネクタを動作させるための回避策はありません。


ヒントとしては、可能な限り毎回スキーマを指定するデータフォーマットを使用することです。コネクター設定の観点からは、キーと値のスキーマを格納する[Karapace](https://docs.aiven.io/docs/products/kafka/karapace.html)のようなツールを利用するために、何行かのコード（[Debezium example](https://docs.aiven.io/docs/products/kafka/kafka-connect/howto/debezium-source-connector-pg.html)の`key.converter`と`value.converter`を確認してください）を追加することを意味します。


Apache Kafka®でデータを取り込む際にスキーマを適切に定義したら、同じスキーマレジストリ機能を使って、シンクコネクタにデータ形状を理解させ、スキーマを必要とするかどうかに関わらず、下流のどの技術にもプッシュすることができる。


## ヒント#4: メッセージペイロードの形状を変更する


Apache Kafka® Connectは、ソーシング/シンク中にデータの形状を変更できる魔法のような機能を提供します。この機能は**Single Message Transformations** (SMT)と呼ばれ、以下のような様々な方法でデータの形を変えることができます：


* フィルタリング**：受信データセットのサブセットだけを渡す。
* ルーティング**：特定のフィールド値に基づいて、異なるイベントを別々の宛先に送信する。
* キーの定義**：イベント・キーとして使用するフィールドのセットを定義する（これについては後ほど詳しく説明します）。
* マスキング**：フィールドを難読化または削除します。PII（個人を特定できる情報）データに便利です。


SMTは、統合フェーズでデータの形状をカスタマイズするための、非常に強力な[swiss army knife](https://www.morling.dev/blog/single-message-transforms-swiss-army-knife-of-kafka-connect/)です。


## ヒント#5: データのパーティショニングとルックアップを行うキーを定義する


Apache Kafka®ではパーティショニングを定義するためにキーが使用され、ターゲットシステムではルックアップを実行するためにキーが使用されます。キーが適切に定義されていれば、ソーシング（パーティションへの並列書き込み）とシンク（データベーステーブルのパーティション識別など）の両方でパフォーマンスが向上する。


したがって、より良い正しいパフォーマンスを達成するためには、キーを分析し、正確に定義することが非常に重要です（Apache Kafka®の順序付けは、パーティション内でのみ保証されます）。彼女のブログで、Olenaは[パーティション間でデータをバランスさせる方法](https://aiven.io/developer/balance-data-across-kafka-partitions)と、最適なパーティショニング戦略を選択する際に遭遇するかもしれないトレードオフについて深く掘り下げています。


## ヒント#6: コネクタの堅牢性を高める


Apache Kafka® Connectの魔法の力を強化するには、コネクタをより堅牢にし、エラーの影響を受けにくくする必要があります。パフォーマンスをテストし、ボトルネックを理解し、パイプラインを継続的に監視して改善することは、この分野でも適用できる「常套手段」です。また、特定の失敗から私たちを救うことができるかもしれない詳細なヒントもいくつかある。


### 飛行中のデータ量を減らす


ほとんどのコネクタでは、データ収集/プッシュの頻度を定義することができます。1日1回ターゲット環境にデータをシンクするということは、コネクタが1日のデータセットをすべて保持する必要があるということです。データ量が大きくなりすぎると、コネクタがクラッシュしてプロセスの再開を余儀なくされ、パイプラインに遅延が発生する可能性があります。より少ないデータをより頻繁に**書き込むことでリスクを軽減できますが、頻度と "バッチ "サイズの適切なバランスを見つける必要があります。


### パフォーマンスを向上させ、リスクを軽減するために、負荷を並列化する。


Kafka Connectには、負荷を並列化するために使用できるタスクの概念があります。


例として、データベースから15個のテーブルを取り込む必要がある場合、1つのコネクターに1つのタスクですべての負荷を持たせるのは危険な選択です。その代わりに、15個のタスクを持つ1つのコネクタを定義するか、ニーズに応じて1つのタスクを持つ15個の異なるコネクタを定義することで、データ取り込みを分散させることができます。


作業を並列化することは、パフォーマンスの向上と単一障害点に関連するリスクの低減の両方に役立つ。


## ヒント#7: デバッグの方法を知る


![image](https://cdn.sanity.io/images/sczeoy4w/production/2f357752418673c94a1acd7b9f1c92007a2bb853-1875x938.png?q=80&fit=min&auto=format&dpr=1.5)


間違いのない Apache Kafka® Connect のマジシャンになることはできません。私たちの仕事は、何が間違っているのかを理解し、それを修正することです。成功するための一般的なヒントをいくつか紹介します：


* ログは真実の源です。ログに含まれるエラーの説明は、問題の本質を理解し、どこを見るべきかのヒントを与えてくれます。
* 解決策を探す**：インターネットは、特定のエラーメッセージに対するたくさんの解決策を提供してくれる。私たちは時間をかけて、提案された修正が私たちの状況に当てはまるかどうかを注意深く理解する必要があります。投稿されたエラーメッセージが似ているからといって、その解決策が有効であると決めつけることはできません。


Kafkaは比較的新しい技術なので、私たちの前に誰も同じエラーに遭遇していないような状況に直面する可能性もある。しかし、そのような場合、ログをもう一度見たり、コネクタのコードを読んだりすることで、解決策が見つかるかもしれない......それがオープンソースの良さだ！


### エラー耐性と自動再起動


エラー許容度**は、コネクタがエラーになるまでに何回の解析ミスを許容するかを定義します。none`では最初のエラーで Kafka connect がクラッシュし、`all`ではどのメッセージも理解できなくてもコネクタの実行を継続する。


中間の選択肢として、**dead letter queue** というトピックがあります。デッド・レター・キューは、単一のメッセージ・エラーに対してコネクタをより堅牢にする素晴らしい方法ですが、使用する場合は積極的に監視する必要があります。一番避けたいのは、1年後に、くだらない書式エラーのために`orders`トピックに200,000通の解析されていないメッセージがあることを発見することです。


許容範囲に関連して、もう一つの有用なパラメータは**自動再起動**です。これをオンに設定することは、一過性のエラーからコネクタを救済する良い方法ですが、構成が単に間違っている場合には救済されません。


## ヒント#8: エボリューショントレースを保持する


Apache Kafka® Connectでは、"呪文集 "の概念がとてもよく通じます。反復的な手法でコネクタの設定に取り組むことで、長い道のりを歩むことができます。


まず、利用可能な設定のセットを読み、どのようなパラメータが必要かを分析し、コネクタの設定をできるだけシンプルにして、時間の経過とともに進化させることができる最小限の統合例を構築する必要があります。


上記と連動して、コンフィギュレーションのバージョン管理システムを適切に設定し、デプロイメントを可能な限り自動化することにも時間を費やす価値がある。このアプローチは、機能しない変更を元に戻す必要があるときに時間を節約し、デプロイ中のヒューマンエラーのリスクを減らす。[Apache Kafka® Connect REST API](https://kafka.apache.org/documentation/#connectapi)や、[Aiven Client](https://docs.aiven.io/docs/tools/cli/service/connector.html)、[Aiven Terraform Provider](https://docs.aiven.io/docs/tools/terraform/reference/cookbook/kafka-connect-terraform-recipe.html)、[kcctl](https://github.com/kcctl/kcctl)のようなツールが自動化プロセスの助けになる。


## インテグレーションの魔法


Apache Kafka® Connectのダークマジックを理解することは、初見では圧倒されるかもしれない。しかし、そのエコシステムを閲覧し、様々なコネクタのドキュメントを読み、上記のヒントに耳を傾けることで、高速でスケーラブルかつ弾力性のあるストリーミングデータパイプラインを構築するための新しいウィザードリーを使い始めることができる。


もっと多くのリソースがあります：


* [Aiven for Apache Kafka® Connect](https://aiven.io/kafka-connect): Kafka Connectクラスタのセットアップに時間を取られず、統合の作成に集中しましょう。
* [Source](https://docs.aiven.io/docs/products/kafka/kafka-connect/howto/list-source-connectors.html)と[Sink](https://docs.aiven.io/docs/products/kafka/kafka-connect/howto/list-sink-connectors.html)のHow Toガイド。コネクター: すべての主要なコネクターについて、事前に構築された統合例を確認する。
* [Twitterの例](https://aiven.io/blog/connecting-twitter-to-aiven-for-apache-kafka): 管理されたApache Kafka®クラスタの恩恵を受けながら、必要なコネクタを実行するためにKafka Connectクラスタをセルフホストする方法を確認してください。


#### Apache Kafka® ConnectのためのAiven

既存のデータソースとデータシンクをApache Kafka®と統合します。

[どのように機能するのか](https://aiven.io/kafka-connect)

Aivenと私たちのサービスに関する最新ニュースや、オープンソースに関するちょっとした情報を入手するには、[月刊ニュースレターを購読](https://aiven.io/newsletter)してください！Aivenに関する日々のニュースは、[LinkedIn](https://www.linkedin.com/company/aiven/)と[Twitter](https://twitter.com/aiven_io)のフィードでご覧いただけます。


サービスのアップデート情報を知りたい方は、[変更履歴](https://aiven.io/changelog)をご覧ください。