Flink Bigtable コネクタ
Apache Flink は、リアルタイムでデータを操作できるストリーム処理フレームワークです。Bigtable テーブルがある場合は、Flink Bigtable コネクタを使用して、指定したデータソースから Bigtable にデータをストリーミング、シリアル化、書き込みできます。このコネクタを使用すると、Apache Flink Table API または Datastream API を使用して次の操作を行うことができます。
- パイプラインを作成する
- データソースの値を Bigtable ミューテーション エントリにシリアル化する
- これらのエントリを Bigtable テーブルに書き込む
このドキュメントでは、Flink Bigtable コネクタと、使用前に知っておくべきことについて説明します。このドキュメントを読む前に、Apache Flink、Bigtable ストレージ モデル、Bigtable 書き込みについて理解しておく必要があります。
コネクタを使用するには、データシンクとして機能する既存の Bigtable テーブルが必要です。パイプラインを開始する前に、テーブルの列ファミリーを作成する必要があります。列ファミリーは書き込み時に作成できません。詳細については、テーブルの作成と管理をご覧ください。
このコネクタは Apache Flink バージョン 2.1.0 と互換性があり、GitHub で入手できます。コネクタのインストールについては、Flink Bigtable Connector リポジトリをご覧ください。コネクタの使用方法を示すコードサンプルについては、flink-examples-gcp-bigtable ディレクトリをご覧ください。
シリアライザー
Flink コネクタには、データを Bigtable ミューテーション エントリに変換するために使用できる 3 つの組み込みシリアライザーがあります。
GenericRecordToRowMutationSerializer: AVROGenericRecordオブジェクトの場合RowDataToRowMutationSerializer: FlinkRowDataオブジェクトの場合FunctionRowMutationSerializer: 提供された関数を使用するカスタム シリアル化ロジックの場合
BaseRowMutationSerializer から継承する独自のカスタム シリアライザーを作成することもできます。
シリアル化モード
Flink コネクタを使用する場合は、2 つのシリアル化モードのいずれかを選択します。モードは、ソースデータを Bigtable テーブルの列ファミリーに書き込まれるミューテーション エントリにシリアル化する方法を指定します。どちらかのモードを使用する必要があります。
列ファミリー モード
列ファミリー モードでは、すべてのデータが指定された単一の列ファミリーに書き込まれます。ネストされたフィールドはサポートされていません。
ネストされた行モード
ネストされた行モードでは、最上位の各フィールドは列ファミリーを表します。最上位フィールド(RowKeyField)の値は別のフィールドです。このフィールドの値には、Bigtable 列ファミリーの各列の行オブジェクトがあります。ネストされた行モードでは、トップレベル フィールド以外のすべてのフィールドは行オブジェクトである必要があります。二重にネストされた行はサポートされていません。
構成オプション
コネクタのパフォーマンスと動作を構成するには、いくつかのオプションを使用できます。これらのオプションの詳細については、GitHub のコネクタのドキュメントをご覧ください。
1 回限りの処理
Apache Flink では、exactly once は、ストリーム内の各データレコードが 1 回だけ処理されることを意味します。これにより、システム障害が発生した場合でも、処理の重複やデータ損失を防ぐことができます。
Bigtable の mutateRow ミューテーションはデフォルトでべき等であるため、同じ行キー、列ファミリー、列、タイムスタンプ、値を持つ書き込みリクエストは、再試行されても新しいセルを作成しません。Apache Flink フレームワークのデータシンクとして Bigtable を使用すると、次の条件が満たされている限り、1 回限りの動作が自動的に実現されます。
- 再試行でサーバーサイドのタイムスタンプ(
-1)を使用するようにタイムスタンプを設定していません。 - パイプラインの残りの部分は exactly-once 要件を満たしています。
1 回限りのセマンティクスの詳細については、Apache Flink でのエンドツーエンドの 1 回限りの処理の概要をご覧ください。