メイン コンテンツをスキップする

ジョブ内のKafkaとAVRO

Talendジョブでは、AVROフォーマットのデータを(非)シリアライズするためにAVROが提供するアプローチに反映されているように、Kafkaコンポーネント(通常のKafkaコンポーネント)とAVROのKafkaコンポーネントは、AVROデータを異なる方法で処理します。
  • 通常のKafkaコンポーネントはJSON形式を読み書きします。KafkaがAVROデータを生成または消費する場合は、標準ジョブでスキーマレジストリーと共にProducerレコードとConsumerレコードを持つtKafkaInputtKafkaOutputを使用できます。
  • SparkフレームワークのKafkaコンポーネントはAVRO形式のデータを直接処理します。KafkaクラスターがAVROデータを生成し、消費する場合は、tKafkaInputAvroを使ってKafkaからデータを直接読み取り、tWriteAvroFieldsを使ってAVROデータをtKafkaOutputに送信します。

    ただし、これらのコンポーネントはavro-toolsライブラリーによって作成されたAVROデータを処理しません。これは、avro-toolsライブラリーとAVROのコンポーネントが、AVROの提供するアプローチと同じアプローチを使わないためです。

AVRO形式のデータを(逆)シリアライズするためにAVROが提供する2つのアプローチは次のとおりです。
  1. AVROファイルは、各ファイルに埋め込まれたAVROスキーマを使用して生成されます( org.apache.avro.file.{DataFileWriter/DataFileReader} )。avro-toolsライブラリーはこのアプローチを使います。
  2. AVROレコードは、各レコードにスキーマを埋め込むことなく生成されます(org.apache.avro.io.{BinaryEncoder/BinaryDecoder}を使用)。AVROのKafkaコンポーネントは、このアプローチを使います。

    この方法は、AVROでエンコードされたメッセージが常にKafkaトピックに書き込まれる場合に強く推奨されます。この方法では、すべてのメッセージにAVROスキーマを再び埋め込むためのオーバーヘッドが発生しないためです。AVROスキーマのサイズは比較的大きく、そのため、各メッセージにスキーマを埋め込むのは費用対効果が低い方法になります。他方、レコード(メッセージ)は通常小さいため、Spark Streamingを使ってデータをKafkaに読み書きする場合、これは他のアプローチに比べて大きな利点です。

2つのアプローチの出力を同じ読み書きの処理で混在させることはできません。

このページは役に立ちましたか?

このページまたはコンテンツに、タイポ、ステップの省略、技術的エラーなどの問題が見つかった場合は、お知らせください。改善に役立たせていただきます。