JDBC Unity Catalog接続
この機能は、Databricks Runtime 17.3 以降ではベータ版です。
Databricks は、JDBC を使用した外部データベースへの接続をサポートしています。JDBC Unity Catalog接続を使用して、 SparkデータソースAPIまたはDatabricks Remote Query SQL APIでデータ ソースの読み取りと書き込みを行うことができます。 JDBC 接続は、Unity Catalog 内のセキュリティ保護可能なオブジェクトであり、外部データベースにアクセスするための JDBC ドライバー、URL パス、および資格情報を指定します。JDBC接続は、サーバレス、標準クラスター、専用クラスター、 Databricks SQLなどのUnity Catalogコンピュート タイプ全体でサポートされています。
JDBC接続を使用する利点
- JDBCとSparkデータソースAPIを使用してデータソースの読み取りと書き込みを行います。
- Remote Query SQL APIを使用してJDBCでデータソースから読み取ります。
- Unity Catalog接続を使用したデータソースへの管理されたアクセス。
- 接続を一度作成すると、 Unity Catalogコンピュート全体で再利用できます。
- Sparkおよびコンピュートのアップグレードに対して安定しています。
- 接続資格情報はクエリを実行するユーザーに対して非表示になります。
JDBC とクエリフェデレーション
JDBC はクエリ フェデレーションを補完します。Databricks では、次の理由からクエリ フェデレーションを選択することを推奨しています。
- クエリ フェデレーションは、フォーリンカタログを使用してテーブル レベルでのきめ細かいアクセス制御とガバナンスを提供します。 JDBC Unity Catalog接続は接続レベルでのみガバナンスを提供します
- クエリフェデレーションはSparkクエリをプッシュダウンし、最適なクエリパフォーマンスを実現します。
ただし、次のシナリオでは、 JDBC Unity Catalog接続を使用することを選択します。
- データベースはクエリ フェデレーションではサポートされていません。
- 特定の JDBC ドライバーを使用したい。
- Sparkを使用してデータ ソースに書き込む必要があります (クエリ フェデレーションは書き込みをサポートしていません)。
- SparkデータソースAPIオプションを使用して、さらなる柔軟性、パフォーマンス、および並列化制御が必要です。
- Spark
queryオプションを使用してクエリをプッシュダウンします。
PySparkソースではなくJDBCを使用する理由は何ですか?
PySparkデータソースは、 JDBC Sparkデータソースの代替です。
JDBC 接続を使用します。
- 組み込みの Spark JDBC サポートを使用する場合。
- すでに存在するすぐに使用可能な JDBC ドライバーを使用する場合。
- 接続レベルでの Unity Catalog ガバナンスが必要な場合。
- Unity Catalogコンピュートから接続する場合は、「サーバレス」、「標準」、「専用」、 SQL APIと入力します。
- Python 、 Scala 、 SQL APIsとの接続を使用する場合。
PySparkデータソースを使用します。
- Pythonを使用してSparkデータソースまたはデータシンクを柔軟に開発および設計したい場合。
- ノートブックまたは PySpark ワークロードでのみ使用する場合は。
- カスタム パーティション ロジックを実装する場合。
JDBCもPySparkデータソースも述語プッシュダウンをサポートしていません。 また、操作の順序を選択するのに役立つ統計をクエリ オプティマイザーに公開することもありません。
仕組み
JDBC接続を使用してデータ ソースに接続するには、 SparkコンピュートにJDBCドライバーをインストールします。 この接続により、 Sparkコンピュートからアクセスできる分離されたサンドボックスにJDBCドライバーを指定してインストールでき、 SparkセキュリティとUnity Catalogガバナンスを確保できます。 サンドボックスの詳細については、 Databricksユーザー分離をどのように強制しますか?」を参照してください。 。
始める前に
サーバレスおよび標準クラスターでSparkデータソースAPIとのJDBC接続を使用するには、まず次の要件を満たす必要があります。
ワークスペースの要件:
- Unity Catalog に対応した Databricks ワークスペース
コンピュートの要件:
- コンピュート リソースからターゲット データベース システムへのネットワーク接続。 「ネットワーク接続」を参照してください。
- Databricksコンピュートは、標準モードまたは専用アクセス モードでサーバレス、またはDatabricks Runtime 17.3 LTS以降を使用する必要があります。
- SQLはプロまたはサーバレスであり、2025.35 以降を使用する必要があります。
必要な権限:
- 接続を作成するには、メタストア管理者であるか、ワークスペースにアタッチされたメタストアに対する
CREATE CONNECTION権限を持つユーザーである必要があります。 CREATEまたは、接続作成者によるUnity CatalogボリュームへのMANAGEアクセス- 接続を照会するユーザーによるボリュームアクセス
- 追加の権限要件は、以下の各タスクベースのセクションに記載しています。
ステップ 1: ボリュームを作成し、 JDBC JARをインストールします
JDBC接続はUnity CatalogボリュームからJDBCドライバーJAR読み取ってインストールします。
-
既存のボリュームへの書き込みおよび読み取りアクセス権がない場合は、新しいボリュームを作成します。
SQLCREATE VOLUME IF NOT EXISTS my_catalog.my_schema.my_volume_JARs -
接続を照会するユーザーにボリュームの読み取りアクセス権を付与します。
SQLGRANT READ VOLUME ON VOLUME my_catalog.my_schema.my_volume_JARs TO `account users`
ステップ 2: JDBC接続を作成する
Unity Catalog 内のセキュリティ保護可能なオブジェクト。外部データベース システムにアクセスするための JDBC ドライバー、URL パス、資格情報、およびクエリを実行するユーザーが使用する許可リスト オプションを指定します。接続を作成するには、カタログ エクスプローラー、または Databricks ノートブックまたは Databricks SQL クエリ エディターのCREATE CONNECTION SQL コマンドを使用できます。
Databricks REST API または Databricks CLI を使用して接続を作成することもできます。 POST /api/2.1/unity-catalog/connections および Unity Catalog コマンドを参照してください。
必要な権限: メタストア管理者またはCREATE CONNECTION権限を持つユーザー。
対応するボリューム、URL、資格情報、およびexternalOptionsAllowListを調整しながら、ノートブックまたは SQL クエリ エディターで次のコマンドを実行します。
DROP CONNECTION IF EXISTS <JDBC-connection-name>;
CREATE CONNECTION <JDBC-connection-name> TYPE JDBC
ENVIRONMENT (
java_dependencies '["/Volumes/<catalog>/<Schema>/<volume_name>/JDBC_DRIVER_JAR_NAME.jar"]'
)
OPTIONS (
url 'jdbc:<database_URL_host_port>',
user '<user>',
password '<password>',
externalOptionsAllowList 'dbtable,query,partitionColumn,lowerBound,upperBound,numPartitions'
);
DESCRIBE CONNECTION <JDBC-connection-name>;
接続の所有者または管理者は、JDBC ドライバーでサポートされている追加オプションを接続に追加できます。
セキュリティ上の理由から、接続で定義されたオプションはクエリ時に上書きできません。ユーザーは、接続でまだ定義されていないSparkデータソース オプションのみを指定できます。
externalOptionsAllowListを使用すると、接続作成者は、ユーザーがクエリ時に指定できるSparkデータ ソース オプションを指定できます。 この例では、ユーザーは'dbtable,query,partitionColumn,lowerBound,upperBound,numPartitions'のみを使用できます。UC 接続で指定されたオプションのみが使用されるようにするには、 externalOptionsAllowList空の文字列にすることができます。URL とホストはユーザーによって指定することはできません。
接続を作成するときに必須となるオプションは URL のみです。許可リストが指定されていない場合は、 'dbtable,query,partitionColumn,lowerBound,upperBound,numPartitions'を含むデフォルトの許可リストが使用されます。
Databricks では、接続時に資格情報を指定することをお勧めします。
ステップ 3: USE権限を付与します
接続に対するUSE権限をユーザーに付与します:
GRANT USE CONNECTION ON CONNECTION <connection-name> TO <user-name>;
既存の接続の管理については、 「レイクハウスフェデレーションの接続の管理」を参照してください。
ステップ 4: データソースをクエリする
USE CONNECTION権限を持つユーザーは、 Spark経由のJDBC接続またはリモート クエリSQL APIを使用して、データ ソースをクエリできます。 ユーザーは、 JDBCドライバーでサポートされ、 JDBC接続のexternalOptionsAllowListで指定されている任意のSparkデータソース オプションを追加できます (この場合は'dbtable,query,partitionColumn,lowerBound,upperBound,numPartitions' )。 許可されるオプションを表示するには、次のクエリを実行します。
DESCRIBE CONNECTION <JDBC-connection-name>;
- Python
- SQL
df = spark.read.format('jdbc')
.option('databricks.connection', '<JDBC-connection-name>')
.option('query', 'select * from <table_name>') # query in Database native SQL language - Option specified by querying user
.load()
df.display()
SELECT * FROM
remote_query('<JDBC-connection-name>', query => 'SELECT * FROM <table>'); -- query in Database native SQL language - Option specified by querying user
移住
既存のSparkデータソースAPIワークロードから移行するには、 Databricks次のことを行うことをお勧めします。
- SparkデータソースAPIのオプションから URL と認証情報を削除します。
- SparkデータソースAPIのオプションに
databricks.connectionを追加します。 - 対応する URL と資格情報を使用して JDBC 接続を作成します。
- 接続中。静的である必要があり、クエリユーザーによって指定されるべきではないオプションを指定します。
- 接続の
externalOptionsAllowListで、クエリ時にユーザーがSparkデータ ソースAPIコードで調整または変更する必要があるデータ ソース オプションを指定します (例:'dbtable,query,partitionColumn,lowerBound,upperBound,numPartitions')。
制限事項
Spark データソース API
- URL とホストをSparkデータソースAPIに含めることはできません。
.option("databricks.connection", "<Connection_name>")が必要です。- 接続で定義されたオプションは、クエリ時にコード内のデータソースAPIで使用することはできません。
- クエリを実行するユーザーは、
externalOptionsAllowListで指定されたオプションのみを使用できます。
サポート
- Sparkデータソースはサポートされていません。
- Spark宣言型パイプラインはサポートされていません。
- 作成時の接続依存関係:
java_dependenciesは、JDBC ドライバー JAR のボリュームの場所のみをサポートします。 - クエリでの接続依存性: 接続ユーザーには、JDBC ドライバー JAR が配置されているボリュームへの
READアクセスが必要です。
認証
- 基本認証(ユーザー名とパスワード)のみがサポートされます。Unity Catalog資格情報、 OAuth 、または サービス 資格情報はサポートされていません。
ネットワーキング
- ターゲット データベース システムと Databricks ワークスペースを同じ VPC に配置することはできません。
ネットワーク接続
コンピュート リソースからターゲット データベース システムへのネットワーク接続が必要です。 一般的なネットワークのガイダンスについては、「レイクハウスフェデレーションのネットワークに関する推奨事項」を参照してください。
Classic コンピュート: 標準および専用クラスター
Databricks VPC は、Spark クラスターのみを許可するように構成されています。別のインフラストラクチャに接続するには、ターゲット データベース システムを別の VPC に配置し、VPC ピアリングを使用します。VPC ピアリングが確立されたら、クラスターまたはウェアハウス上のconnectionTest UDF との接続を確認します。
Databricks ワークスペースとターゲット データベース システムが同じ VPC 内にある場合、Databricks では次のいずれかを推奨します。
- サーバレスコンピュートを使用する
- ターゲットデータベースを設定して、ポート80と443を介したTCPおよびUDPトラフィックを許可し、接続でこれらのポートを指定します。
接続テスト
Databricksコンピュートとデータベース システムの間の接続をテストするには、次のUDFを使用します。
CREATE OR REPLACE TEMPORARY FUNCTION connectionTest(host string, port string) RETURNS string LANGUAGE PYTHON AS $$
import subprocess
try:
command = ['nc', '-zv', host, str(port)]
result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return str(result.returncode) + "|" + result.stdout.decode() + result.stderr.decode()
except Exception as e:
return str(e)
$$;
SELECT connectionTest('<database-host>', '<database-port>');