Lakebase に接続
Structured Streamingを使用して、組み込みのバッチ処理、自動再試行、ワークスペース管理型認証を備えた Lakebase または外部の PostgreSQL データベースに書き込みます。
Lakebase シンクはいつ使用しますか?
Lakebase シンクを使用して、Lakebase または外部の PostgreSQL データベースへの低レイテンシのストリーミング書き込みを行います。このシンクでは、バッチ処理、接続管理、エラー処理を処理するためにカスタムの foreach 関数を実装する必要はありません。
ユースケースの例:
- 運用ダッシュボードまたは顧客向け機能のために、アプリケーションデータベースをリアルタイムで更新します。
- 集計またはフィルター処理されたストリーミング結果など、継続的に変化するデータをトランザクションデータベースに同期します。
- 構造化ストリーミングのクエリの出力を、1秒未満のレイテンシでリアルタイムモードを使用してLakebaseテーブルに書き込みます。
要件
-
- 外部の PostgreSQL 接続および間隔データ型を使用するには、Databricks Runtime 19 以降が必要です。
-
専用または標準アクセスモードのクラシックコンピュート、あるいはノートブックやジョブ向けのServerlessコンピュート。サーバーレスコンピュート上で、
Trigger.AvailableNow()を使用します。Serverlessコンピュートでのストリーミングを参照してください。 -
Lakebase データベース、または外部 PostgreSQL データベースへの Unity Catalog 接続。
Identifier requirements
すべてのターゲットについて、Databricks では、文字またはアンダースコアで始まり、文字、数字、およびアンダースコアのみを含むスキーマ、テーブル、列、および主キー列の名前を使用することをお勧めします。シンクは、Lakebase テーブルを自動的に作成するときに、これらの要件を強制します。これらの要件を満たさない識別子を使用するには、クエリーを開始する前にターゲットテーブルを作成してください。
データベースに接続します
Lakebase sink は次の接続メソッドをサポートしています。
Unity Catalogに登録されていないLakebaseテーブル
Unity Catalogに登録されていないLakebaseテーブルの場合、コネクタが認証情報を自動的に管理し、クエリを実行しているユーザーまたはDatabricksサービスプリンシパルのIDを使用します。テーブルが存在しない場合、コネクタがテーブルを作成します。
Lakebase テーブルに書き込むには、endpoint および dbtable オプションを使用します。
- Python
- Scala
(df.writeStream
.format("postgresql")
.outputMode("update")
.option("endpoint", "<project-id>.<branch-id>.<endpoint-id>")
.option("database", "<database>") # Optional. Defaults to databricks_postgres.
.option("dbtable", "<schema>.<table>")
.option("upsertkey", "<primary-key-columns>") # Optional
.option("checkpointLocation", "/Volumes/<catalog>/<schema>/<volume>/<checkpoint-name>")
.start()
)
df.writeStream
.format("postgresql")
.outputMode("update")
.option("endpoint", "<project-id>.<branch-id>.<endpoint-id>")
.option("database", "<database>") // Optional. Defaults to databricks_postgres.
.option("dbtable", "<schema>.<table>")
.option("upsertkey", "<primary-key-columns>") // Optional
.option("checkpointLocation", "/Volumes/<catalog>/<schema>/<volume>/<checkpoint-name>")
.start()
次のプレースホルダーを置き換えます。
<project-id>.<branch-id>.<endpoint-id>Lakebaseエンドポイントです。 「コンピュート」タブの「IDの取得」メニューにある「リソース名」で、 の形式の3つの値をすべて見つけてください。projects/<project-id>/branches/<branch-id>/endpoints/<endpoint-id>コンピュート識別子を参照してください。<database>: オプション。ターゲットのPostgreSQLデータベースの名前。default はdatabricks_postgresです。詳細については、データベースの管理を参照してください。<schema>.<table>:schema.table形式のターゲットテーブル。スキーマを省略した場合、シンクはpublicスキーマを使用します。自動テーブル作成の場合は、文字またはアンダースコアで始まり、文字、数字、アンダースコアのみを含む識別子を使用します。<primary-key-columns>: 省略可能です。ターゲットテーブルの主キーに含まれるすべての列のコンマ区切りリスト(例:idやuser_id,event_type)。アップサートの動作を参照してください。/Volumes/<catalog>/<schema>/<volume>/<checkpoint-name>: クエリがチェックポイントを格納するUnity Catalogボリュームパス。クラウドオブジェクトストレージURIを使用することもできます。ロケーションは、ローカルディスクではなく書き込み可能なストレージである必要があり、各ストリーミングクエリに対して一意である必要があります。これはターゲットテーブルとは無関係です。構造化ストリーミングのチェックポイントを参照してください。
batchsizeやbatchintervalなどのオプションの構成については、構成オプションを参照してください。
Unity Catalog 資格情報を使用する外部 PostgreSQL
Databricks Runtime 19以降では、Unity Catalog接続を使用して、コードに資格情報を保存せずに外部のPostgreSQLデータベースに対する認証を行います。ターゲットテーブルがすでに存在している必要があります。
タイプ POSTGRESQL の接続を作成します。接続の作成を参照してください。クエリーを実行するユーザーまたは Databricks Service Principal は、接続に対して USE CONNECTION を持っている必要があります。
PostgreSQLテーブルに書き込むには、databricks.connection、database、および dbtable オプションを使用します。
- Python
- Scala
(df.writeStream
.format("postgresql")
.outputMode("update")
.option("databricks.connection", "<connection-name>")
.option("database", "<database>")
.option("dbtable", "<schema>.<table>")
.option("upsertkey", "<primary-key-columns>") # Optional
.option("checkpointLocation", "/Volumes/<catalog>/<schema>/<volume>/<checkpoint-name>")
.start()
)
df.writeStream
.format("postgresql")
.outputMode("update")
.option("databricks.connection", "<connection-name>")
.option("database", "<database>")
.option("dbtable", "<schema>.<table>")
.option("upsertkey", "<primary-key-columns>") // Optional
.option("checkpointLocation", "/Volumes/<catalog>/<schema>/<volume>/<checkpoint-name>")
.start()
次のプレースホルダーを置き換えます。
<connection-name>: Unity Catalog接続の名前。<database>:ターゲットの PostgreSQL データベースの名前。<schema>.<table>:schema.table形式の既存のターゲットテーブル。スキーマを省略した場合、シンクはpublicスキーマを使用します。<primary-key-columns>: 省略可能です。ターゲットテーブルの主キーに含まれるすべての列のコンマ区切りリスト(例:idやuser_id,event_type)。アップサートの動作を参照してください。/Volumes/<catalog>/<schema>/<volume>/<checkpoint-name>: クエリがチェックポイントを格納するUnity Catalogボリュームパス。クラウドオブジェクトストレージURIを使用することもできます。ロケーションは、ローカルディスクではなく書き込み可能なストレージである必要があり、各ストリーミングクエリに対して一意である必要があります。これはターゲットテーブルとは無関係です。構造化ストリーミングのチェックポイントを参照してください。
PostgreSQL接続では常にTLSが使用されます。証明書の検証は、接続を作成する際に選択するUnity Catalog接続の設定に従います。
- サーバ証明書を信頼する : 選択すると、接続では
sslmode=requireが使用され、サーバ証明書を検証せずに接続が暗号化されます。 - ユーザー提供のサーバー証明書 : 「サーバー証明書を信頼する」 が選択されていないときに
sslmode=verify-fullを使用するには、PEM エンコードされたサーバー証明書を提供します。証明書を指定しない場合、接続では JVM の default トラストストアとともにsslmode=verify-fullが使用されます。
構成オプション
シンクは認識できないオプション、JDBC_STREAMING_SINK_INVALID_OPTIONSに対してエラーを返します。
次のオプションは、すべての接続方法に適用されます。
キー | デフォルト | 説明 |
|---|---|---|
|
| オプション。フラッシュする前にバッファ内で行を保持する最大時間。たとえば、 |
|
| オプション。各データベーストランザクションの最大行数。 |
| なし | 必須。Unity Catalog ボリューム( |
| なし | オプション。ターゲットテーブルの主キーに含まれるすべての列名のコンマ区切りリスト(例: |
Lakebase の Unity Catalog に登録されていないテーブル
次のオプションは、Unity Catalog に登録されていない Lakebase テーブルに接続する場合に適用されます:
キー | デフォルト | 説明 |
|---|---|---|
|
| オプション。ターゲットの PostgreSQL データベース名。 |
| なし | 必須。 |
| なし | 必須。 |
Unity Catalog 資格情報を使用した外部 PostgreSQL
Unity Catalogの資格情報を使用して外部のPostgreSQLデータベースに接続する場合、以下のオプションが適用されます。
キー | デフォルト | 説明 |
|---|---|---|
| なし | 必須。ターゲットの PostgreSQL データベース名。 |
| なし | 必須。外部 PostgreSQL への Unity Catalog 管理型認証のための Unity Catalog 接続名。 |
| なし | 必須。 |
データ型のマッピング
シンクは、既存の Lakebase または外部の PostgreSQL テーブルに書き込む前に、各 DataFrame カラムが対応するターゲットカラムと互換性があることを確認します。
次の表には、Databricks Runtime 18 LTS 以降でサポートされている型が含まれています。
Spark 型 | 自動的に作成される Lakebase テーブルのタイプ | 既存の PostgreSQL テーブル内の互換性のある型 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
次の表は、Databricks Runtime 19以降でサポートされているタイプを示しています。
Spark 型 | 自動的に作成される Lakebase テーブルのタイプ | 既存の PostgreSQL テーブル内の互換性のある型 |
|---|---|---|
|
|
|
Upsert behavior
upsertkey オプションは、ターゲットテーブルの主キー列を特定します。既存のテーブルの場合、upsertkey 内の列はテーブルの主キーと完全に一致する必要があります。オプションを省略した場合、シンクはテーブルから主キーを読み込みます。シンクが作成する Lakebase テーブルの場合、upsertkey が主キーを定義します。オプションを省略した場合、シンクは主キーなしでテーブルを作成します。
ターゲットテーブルに主キーがある場合、シンクは PostgreSQL の INSERT INTO ... ON CONFLICT (<primary_key_columns>) DO UPDATE SET ... 構文を使用してアップサートを実行します。ターゲットテーブルに主キーがない場合、シンクは挿入を実行します。クエリーの出力モードはこの動作に影響しません。
すべての主キー列が DataFrame に存在し、数値型や文字列型などの比較可能な型を使用している必要があります。
パフォーマンスチューニング
バッチ処理とバックプレッシャー
フラッシュはいずれかの条件が満たされた場合にトリガーされます。
- バッファーが
batchsize行に達すると、デフォルトで1000に設定されます。 - バッファー期間が
batchintervalを超えています。デフォルトは100 millisecondsです。
データベースが流入するデータ速度に追いつけなくなると、シンクはアップストリームでバックプレッシャーをソースに伝播します。
レイテンシーとスループットのガイダンス:
- リアルタイムモードを使用する低レイテンシーのワークロードでは、フラッシュまでの最大時間を短縮するために
batchintervalを減らしてください。概念については リアルタイムモードの概念を、コード例については リアルタイムモードの例を参照してください。 - ハイスループットのワークロードでは、
batchsizeを増加させて、各トランザクションのオーバーヘッドを削減します。
接続動作
シンクはエグゼキューターで接続プールを使用します。デフォルトでは、各タスクは1つのデータベース接続を使用します。
Databricks は、接続ごとに 1 タスクのデフォルト値を使用することをお勧めします。各接続のタスク数を増やすと、接続の競合を発生させ、高スループット接続の遅延が増加する可能性があります。
タスクと接続の比率を構成するには、spark.databricks.sql.streaming.jdbc.tasksPerConnection Spark 構成を設定します。ターゲットデータベースの接続制限が低い場合、シャッフルパーティションの数を減らすか、またはspark.databricks.sql.streaming.jdbc.tasksPerConnectionを増やす必要があります。
シンクは、接続障害、デッドロック、レート制限など一時的なJDBCエラーを自動的に再試行します。シンクがすべての再試行を使い果たした場合、クエリは失敗します。
サポートされるトリガーと出力モード
トリガー
この表は、クラシックおよび Serverless コンピュートにおける Structured Streaming の Trigger 型のサポートを示しています。
トリガー | Classic Compute | Serverless コンピュート (ノートブックとジョブ) |
|---|---|---|
| はい | No |
| はい | No |
| はい | はい |
| はい。非推奨です。 | はい。非推奨です。 |
出力モード
この表は、構造化ストリーミング出力モードのサポートを示しています:
出力モード | サポートされています |
|---|---|
| はい |
| はい。動作は |
| No |
制限事項
- Unity Catalog 接続を通じて接続された外部 PostgreSQL データベースの場合、ターゲットテーブルがすでに存在している必要があります。シンクは、Lakebase 内でのみ不足しているテーブルを自動的に作成します。
- LakeFlow Pipelines はサポートされていません。