カフカコネクタの紹介

Kafkaコネクタの概要

1. 概要

ApacheKafka®は分散ストリーミングプラットフォームです。 前のチュートリアルで implement Kafka consumers and producers using Springの方法について説明しました。

このチュートリアルでは、Kafkaコネクタの使用方法を学習します。

以下を見ていきます。

  • さまざまなタイプのKafkaコネクタ

  • KafkaConnectの機能とモード

  • プロパティファイルとRESTAPIを使用したコネクタ構成

2. KafkaConnectおよびKafkaコネクタの基本

いわゆるConnectorsを使用した、データベース、Key-Valueストア、検索インデックス、ファイルシステムなどのKafka Connect is a framework for connecting Kafka with external systems

Kafkaコネクタはすぐに使用できるコンポーネントであり、 外部システムからKafkaトピックにデータをインポートし、  export data from Kafka topics into external systems。 一般的なデータソースとシンクに既存のコネクタ実装を使用することも、独自のコネクタを実装することもできます。

source connectorは、システムからデータを収集します。 ソースシステムは、データベース全体、ストリームテーブル、またはメッセージブローカーにすることができます。 ソースコネクタは、アプリケーションサーバーからKafkaトピックにメトリックを収集し、データを低遅延でストリーム処理に利用できるようにすることもできます。

sink connectorは、Kafkaトピックから他のシステム(Elasticsearchなどのインデックス、Hadoopなどのバッチシステム、または任意の種類のデータベース)にデータを配信します。

一部のコネクタはコミュニティによって維持されていますが、その他のコネクタはConfluentまたはそのパートナーによってサポートされています。 実際、ほんの数例を挙げると、S3、JDBC、Cassandraなどの最も一般的なシステム用のコネクタを見つけることができます。

3. 特徴

Kafka Connectの機能は次のとおりです。

  • 外部システムをKafkaに接続するためのフレームワーク–it simplifies the development, deployment, and management of connectors

  • 分散モードとスタンドアロンモード–it helps us to deploy large clusters by leveraging the distributed nature of Kafka, as well as setups for development, testing, and small production deployments

  • RESTインターフェース– REST APIを使用してコネクターを管理できます

  • 自動オフセット管理–Kafka Connect helps us to handle the  *オフセットコミットプロセス*。これにより、コネクタ開発のこのエラーが発生しやすい部分を手動で実装する手間が省けます。

  • デフォルトで分散およびスケーラブル–Kafka Connect uses the existing group management protocol; we can add more workers to scale up a Kafka Connect cluster

  • ストリーミングとバッチ統合– Kafka Connectは、Kafkaの既存の機能に関連してストリーミングとバッチデータシステムをブリッジするための理想的なソリューションです

  • 変換-これらにより、個々のメッセージに簡単で軽量な変更を加えることができます。

4. セットアップ

プレーンなKafkaディストリビューションを使用する代わりに、Kafkaの背後にある会社であるConfluent、Inc。が提供するKafkaディストリビューションであるConfluentPlatformをダウンロードします。 Confluent Platformには、プレーンなKafkaと比較して、いくつかの追加のツールとクライアント、およびいくつかの追加のビルド済みコネクタが付属しています。

私たちの場合、Confluent’s siteにあるOpenSourceエディションで十分です。

5. クイックスタートKafkaConnect

手始めに、Kafka Connectの原理であるusing its most basic Connectors, which are the file source connector and the file sink connectorについて説明します。

便利なことに、Confluent Platformにはこれらのコネクタとリファレンス構成の両方が付属しています。

5.1. ソースコネクタの構成

ソースコネクタの場合、参照構成は$CONFLUENT_HOME/etc/kafka/connect-file-source.propertiesで利用できます。

name=local-file-source
connector.class=FileStreamSource
tasks.max=1
topic=connect-test
file=test.txt

この構成には、すべてのソースコネクタに共通するいくつかのプロパティがあります。

  • nameは、コネクタインスタンスのユーザー指定の名前です

  • connector.classは、実装クラス、基本的にはコネクタの種類を指定します

  • tasks.maxは、ソースコネクタのインスタンスをいくつ並列実行するかを指定します。

  • topicは、コネクタが出力を送信するトピックを定義します

この場合、コネクタ固有の属性もあります。

  • fileは、コネクタが入力を読み取るファイルを定義します。

これを機能させるために、いくつかのコンテンツを含む基本的なファイルを作成しましょう。

echo -e "foo\nbar\n" > $CONFLUENT_HOME/test.txt

作業ディレクトリは$ CONFLUENT_HOMEであることに注意してください。

5.2. シンクコネクタの構成

シンクコネクタには、$CONFLUENT_HOME/etc/kafka/connect-file-sink.propertiesの参照構成を使用します。

name=local-file-sink
connector.class=FileStreamSink
tasks.max=1
file=test.sink.txt
topics=connect-test

論理的には、まったく同じパラメーターthough this time connector.class specifies the sink connector implementation, and file is the location where the connector should write the content.が含まれています

5.3. ワーカー構成

最後に、Connectワーカーを構成する必要があります。これにより、2つのコネクタが統合され、ソースコネクタからの読み取りとシンクコネクタへの書き込みが行われます。

そのために、$CONFLUENT_HOME/etc/kafka/connect-standalone.propertiesを使用できます。

bootstrap.servers=localhost:9092
key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schemas.enable=false
value.converter.schemas.enable=false
offset.storage.file.filename=/tmp/connect.offsets
offset.flush.interval.ms=10000
plugin.path=/share/java

plugin.pathは、コネクタの実装が利用可能なパスのリストを保持できることに注意してください

Kafkaにバンドルされているコネクタを使用するため、plugin.path$CONFLUENT_HOME/share/javaに設定できます。 Windowsを使用する場合、ここに絶対パスを指定する必要があります。

他のパラメーターについては、デフォルト値のままにしておくことができます。

  • bootstrap.serversはカフカのブローカのアドレスを含む。

  • key.convertervalue.converterは、データがソースからKafkaに流れ、次にKafkaからシンクに流れるときにデータをシリアル化および逆シリアル化するコンバータークラスを定義します。

  • key.converter.schemas.enablevalue.converter.schemas.enableはコンバータ固有の設定です

  • offset.storage.file.filenameは、Connectをスタンドアロンモードで実行する場合の最も重要な設定です。Connectがオフセットデータを格納する場所を定義します。

  • offset.flush.interval.msは、ワーカーがタスクのオフセットをコミットしようとする間隔を定義します。

また、パラメータのリストはかなり成熟しているため、完全なリストについてはofficial documentationを確認してください。

5.4. スタンドアロンモードでのKafkaConnect

これで、最初のコネクタのセットアップを開始できます。

$CONFLUENT_HOME/bin/connect-standalone \
  $CONFLUENT_HOME/etc/kafka/connect-standalone.properties \
  $CONFLUENT_HOME/etc/kafka/connect-file-source.properties \
  $CONFLUENT_HOME/etc/kafka/connect-file-sink.properties

まず、コマンドラインを使用してトピックの内容を検査できます。

$CONFLUENT_HOME/bin/kafka-console-consumer --bootstrap-server localhost:9092 --topic connect-test --from-beginning

ご覧のとおり、ソースコネクタはtest.txtファイルからデータを取得し、それをJSONに変換して、Kafkaに送信しました。

{"schema":{"type":"string","optional":false},"payload":"foo"}
{"schema":{"type":"string","optional":false},"payload":"bar"}

また、フォルダ$CONFLUENT_HOMEを見ると、ファイルtest.sink.txt がここに作成されていることがわかります。

cat $CONFLUENT_HOME/test.sink.txt
foo
bar

シンクコネクタがpayload属性から値を抽出して宛先ファイルに書き込むと、test.sink.txtのデータには元のtest.txt ファイルの内容が含まれます。

それでは、test.txt.にさらに行を追加しましょう

そうすると、ソースコネクタがこれらの変更を自動的に検出することがわかります。

最後に改行を挿入するだけで済みます。そうしないと、ソースコネクタは最後の行を考慮しません。

この時点で、接続プロセスを停止しましょう。数行でdistributed mode秒で接続を開始します。

6. ConnectのRESTAPI

これまで、コマンドラインを介してプロパティファイルを渡すことにより、すべての構成を行いました。 However, as Connect is designed to run as a service, there is also a REST API available.

デフォルトでは、http://localhost:8083で使用できます。 いくつかのエンドポイントは次のとおりです。

  • GET /connectors –使用中のすべてのコネクタのリストを返します

  • GET /connectors/{name} –特定のコネクタに関する詳細を返します

  • POST /connectors –新しいコネクタを作成します。リクエストの本文は、文字列名フィールドと、コネクタ構成パラメータを含むオブジェクト構成フィールドを含むJSONオブジェクトである必要があります

  • GET /connectors/{name}/status –コネクタの現在のステータス(実行中、失敗、一時停止のいずれか)、割り当てられているワーカー、失敗した場合のエラー情報、すべてのタスクの状態を返します。

  • DELETE /connectors/{name} –コネクタを削除し、すべてのタスクを正常に停止して、その構成を削除します

  • GET /connector-plugins – は、KafkaConnectクラスターにインストールされているコネクタープラグインのリストを返します

official documentationは、すべてのエンドポイントを含むリストを提供します。

次のセクションでは、RESTAPIを使用して新しいコネクタを作成します。

7. 分散モードのKafkaConnect

スタンドアロンモードは、開発とテスト、および小規模なセットアップに最適です。 However, if we want to make full use of the distributed nature of Kafka, we have to launch Connect in distributed mode.

これにより、コネクタ設定とメタデータはファイルシステムではなくKafkaトピックに保存されます。 その結果、ワーカーノードは本当にステートレスです。

7.1. Connectの開始

分散モードの参照構成は、$ CONFLUENT_HOME/etc/kafka/connect-distributed.properties.にあります。

パラメータは、スタンドアロンモードの場合とほとんど同じです。 いくつかの違いがあります:

  • group.idは、Connectクラスターグループの名前を定義します。 この値は、コンシューマグループIDとは異なる必要があります

  • offset.storage.topicconfig.storage.topic、およびstatus.storage.topicは、これらの設定のトピックを定義します。 トピックごとに、複製係数を定義することもできます

繰り返しになりますが、official documentationは、すべてのパラメータを含むリストを提供します。

次のようにConnectを分散モードで開始できます。

$CONFLUENT_HOME/bin/connect-distributed $CONFLUENT_HOME/etc/kafka/connect-distributed.properties

7.2. REST APIを使用したコネクタの追加

現在、スタンドアロンの起動コマンドと比較して、コネクタ構成を引数として渡していません。 代わりに、REST APIを使用してコネクタを作成する必要があります。

前の例を設定するには、次のJSON構造体を含む2つのPOSTリクエストをhttp://localhost:8083/connectorsに送信する必要があります。

まず、ソースコネクタPOSTの本文をJSONファイルとして作成する必要があります。 ここでは、これをconnect-file-source.jsonと呼びます。

{
    "name": "local-file-source",
    "config": {
        "connector.class": "FileStreamSource",
        "tasks.max": 1,
        "file": "test-distributed.txt",
        "topic": "connect-distributed"
    }
}

これが、最初に使用した参照構成ファイルと非常によく似ていることに注意してください。

そして、それを投稿します:

curl -d @"$CONFLUENT_HOME/connect-file-source.json" \
  -H "Content-Type: application/json" \
  -X POST http://localhost:8083/connectors

次に、シンクコネクタに対して同じことを行い、ファイルconnect-file-sink.jsonを呼び出します。

{
    "name": "local-file-sink",
    "config": {
        "connector.class": "FileStreamSink",
        "tasks.max": 1,
        "file": "test-distributed.sink.txt",
        "topics": "connect-distributed"
    }
}

前と同じようにPOSTを実行します。

curl -d @$CONFLUENT_HOME/connect-file-sink.json \
  -H "Content-Type: application/json" \
  -X POST http://localhost:8083/connectors

必要に応じて、このセットアップが正しく機能していることを確認できます。

$CONFLUENT_HOME/bin/kafka-console-consumer --bootstrap-server localhost:9092 --topic connect-distributed --from-beginning
{"schema":{"type":"string","optional":false},"payload":"foo"}
{"schema":{"type":"string","optional":false},"payload":"bar"}

また、フォルダ$CONFLUENT_HOMEを見ると、ファイルtest-distributed.sink.txt がここに作成されていることがわかります。

cat $CONFLUENT_HOME/test-distributed.sink.txt
foo
bar

分散セットアップをテストした後、2つのコネクタを取り外してクリーンアップしましょう。

curl -X DELETE http://localhost:8083/connectors/local-file-source
curl -X DELETE http://localhost:8083/connectors/local-file-sink

8. データの変換

8.1. サポートされている変換

変換により、個々のメッセージに簡単で軽量な変更を加えることができます。

Kafka Connectは、次の組み込み変換をサポートしています。

  • InsertField –静的データまたはレコードメタデータのいずれかを使用してフィールドを追加します

  • ReplaceField –フィールドをフィルタリングまたは名前変更します

  • MaskField –フィールドをタイプの有効なnull値(ゼロや空の文字列など)に置き換えます

  • HoistField –イベント全体を構造体またはマップ内の単一のフィールドとしてラップします

  • ExtractField –構造体とマップから特定のフィールドを抽出し、このフィールドのみを結果に含めます

  • SetSchemaMetadata –スキーマ名またはバージョンを変更します

  • TimestampRouter –元のトピックとタイムスタンプに基づいてレコードのトピックを変更します

  • RegexRouter –元のトピック、置換文字列、および正規表現に基づいてレコードのトピックを変更します

変換は、次のパラメーターを使用して構成されます。

  • transforms –変換のエイリアスのコンマ区切りリスト

  • transforms.$alias.type –変換のクラス名

  • transforms.$alias.$transformationSpecificConfig –それぞれの変換の構成

8.2. トランスフォーマーの適用

いくつかの変換機能をテストするために、次の2つの変換を設定しましょう。

  • まず、メッセージ全体をJSON構造体としてラップしましょう

  • その後、その構造体にフィールドを追加しましょう

変換を適用する前に、connect-distributed.propertiesを変更して、スキーマレスJSONを使用するようにConnectを構成する必要があります。

key.converter.schemas.enable=false
value.converter.schemas.enable=false

その後、再び分散モードでConnectを再起動する必要があります。

$CONFLUENT_HOME/bin/connect-distributed $CONFLUENT_HOME/etc/kafka/connect-distributed.properties

繰り返しますが、ソースコネクタPOSTの本文をJSONファイルとして作成する必要があります。 ここでは、connect-file-source-transform.json.と呼びます。

既知のパラメーターに加えて、2つの必要な変換に数行を追加します。

{
    "name": "local-file-source",
    "config": {
        "connector.class": "FileStreamSource",
        "tasks.max": 1,
        "file": "test-transformation.txt",
        "topic": "connect-transformation",
        "transforms": "MakeMap,InsertSource",
        "transforms.MakeMap.type": "org.apache.kafka.connect.transforms.HoistField$Value",
        "transforms.MakeMap.field": "line",
        "transforms.InsertSource.type": "org.apache.kafka.connect.transforms.InsertField$Value",
        "transforms.InsertSource.static.field": "data_source",
        "transforms.InsertSource.static.value": "test-file-source"
    }
}

その後、POSTを実行しましょう。

curl -d @$CONFLUENT_HOME/connect-file-source-transform.json \
  -H "Content-Type: application/json" \
  -X POST http://localhost:8083/connectors

test-transformation.txtにいくつかの行を書いてみましょう。

Foo
Bar

ここでconnect-transformationトピックを調べると、次の行が表示されます。

{"line":"Foo","data_source":"test-file-source"}
{"line":"Bar","data_source":"test-file-source"}

9. レディコネクタの使用

これらの単純なコネクタを使用した後、すぐに使用できるより高度なコネクタとそのインストール方法を見てみましょう。

9.1. コネクタの場所

構築済みのコネクタは、さまざまなソースから入手できます。

  • いくつかのコネクタは、プレーンなApache Kafka(ファイルおよびコンソールのソースとシンク)にバンドルされています

  • さらにいくつかのコネクタがConfluent Platformにバンドルされています(ElasticSearch、HDFS、JDBC、およびAWS S3)

  • また、Kafkaコネクタのアプリストアの一種であるConfluent Hubも確認してください。 提供されるコネクタの数は継続的に増加しています。

    • Confluentコネクタ(Confluentで開発、テスト、文書化され、完全にサポートされています)

    • 認定コネクタ(サードパーティによって実装され、Confluentによって認定されています)

    • コミュニティが開発およびサポートするコネクタ

  • それ以外に、ConfluentはConnectors Pageも提供します。いくつかのコネクタは、Confluentハブでも利用できますが、さらにいくつかのコミュニティコネクタもあります。

  • そして最後に、製品の一部としてコネクタを提供するベンダーもあります。 たとえば、LandoopはLensesと呼ばれるストリーミングライブラリを提供します。これには、最大25個のオープンソースコネクタのセットも含まれています(それらの多くは他の場所でもクロスリストされています)

9.2. Confluentハブからのコネクタの取り付け

Confluentのエンタープライズバージョンは、Confluent Hubからコネクタおよびその他のコンポーネントをインストールするためのスクリプトを提供します(スクリプトはオープンソースバージョンには含まれていません)。 エンタープライズバージョンを使用している場合は、次のコマンドを使用してコネクタをインストールできます。

$CONFLUENT_HOME/bin/confluent-hub install confluentinc/kafka-connect-mqtt:1.0.0-preview

9.3. コネクタの手動インストール

Confluent Hubで利用できないコネクタが必要な場合、またはConfluentのオープンソースバージョンがある場合は、必要なコネクタを手動でインストールできます。 そのためには、コネクタをダウンロードして解凍し、含まれているライブラリをplugin.path.として指定されたフォルダに移動する必要があります。

各コネクタのアーカイブには、興味深い2つのフォルダーが含まれている必要があります。

  • libフォルダには、kafka-connect-mqtt-1.0.0-preview.jarなどのコネクタjarと、コネクタに必要なその他のjarが含まれています。

  • etcフォルダーには、1つ以上の参照構成ファイルが保持されます

libフォルダを$CONFLUENT_HOME/share/javaに移動するか、connect-standalone.propertiesconnect-distributed.propertiesplugin.pathとして指定したパスに移動する必要があります。 そうすることで、フォルダの名前を意味のある名前に変更することも意味があります。

スタンドアロンモードで起動するときに参照することでetcの構成ファイルを使用するか、プロパティを取得してそこからJSONファイルを作成することができます。

10. 結論

このチュートリアルでは、KafkaConnectをインストールして使用する方法を確認しました。

ソースとシンクの両方のコネクタのタイプを調べました。 また、Connectを実行できるいくつかの機能とモードについても説明しました。 次に、変圧器を確認しました。 そして最後に、カスタムコネクタの入手先とインストール方法を学びました。

いつものように、設定ファイルはon GitHubにあります。