レイクハウスフェデレーションを用いたクエリーの実行

[Run queries using Lakehouse Federation \| Databricks on AWS](https://docs.databricks.com/query-federation/index.html) [2023/7/21時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

:::note info
**プレビュー**
本機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。
:::

本書では、複数の外部データソースに対してクエリーを実行するためにDatabricksを活用できるようにするクエリーフェデレーションプラットフォームであるレイクハウスフェデレーションを紹介します。また、お使いのUnity Catalogメタストアでどのようにレイクハウスフェデレーションの*接続*をセットアップし、どのように*外部テーブル*を作成するのかを説明します。

# レイクハウスフェデレーションとは？

レイクハウスフェデレーションは、Databricksにおけるクエリーフェデレーションプラットフォームです。*クエリーフェデレーション*という用語は、すべてのデータを統合システムに移行する必要なしに、ユーザーやシステムが複数のデータソースに対してクエリーを実行できるようにする機能のコレクションを意味します。

Databricksでは、クエリーフェデレーションの管理にUnity Catalogを活用します。Pro SQLウェアハウス、サーバレスSQLウェアハウス、Databricksランタイムクラスターに含まれているドライバーを用いて、著名なデータベースソリューションに対する読み取り専用の接続を設定することができます。Unity Catalogのデータガバナンスツールやデータリネージツールは、Databricksワークスペースでユーザーによって実行されたすべての統合クエリーに対して、データアクセスが管理され、監査されることを確実にします。

# なぜレイクハウスフェデレーションを使うのか？

レイクハウスは、データの冗長性や分断を削減するために集中管理されたストレージを重要視しますが、皆様の企業においては数多くのデータシステムがプロダクションにあり、多くの理由から接続されたシステムにあるデータにクエリーを行いたいと考えるかもしれません:

- アドホックのレポート。
- POCの取り組み。
- 新規のETLパイプラインやレポートにおける探索フェーズ。
- インクリメンタルな移行におけるサークロードのサポート。

これらのシナリオのそれぞれにおいて、クエリーフェデレーションによってその場でクエリーを行い、複雑で時間を要するETL処理を回避することができるので、皆様は迅速に洞察を得られるようになります。

簡単に言えば、レイクハウスフェデレーションは以下のようなユースケースを想定しています:

- Databricksにデータを取り込みたくない。
- 外部データベースシステムの計算資源を活用してクエリーを実行したい。
- きめ細かいアクセスコントロール、データリネージ、検索のようなUnity Catalogのインタフェースやデータガバナンスを活用したい。

このセクションでは、外部データシステムのデータにアクセスするための他のDatabricksツールとレイクハウスフェデレーションを比較します。

## レイクハウスフェデレーション vs. Delta Sharing

Delta Sharingはデータファイルを直接共有できる際には優れているものと言えます。レイクハウスフェデレーションは、直接の共有ができない際に外部システムの計算資源にアクセスできるようにします。

## レイクハウスフェデレーション vs. Unity Catalo外部テーブル

Amazon S3やGoogle Cloud Storage、Azure Data Lake Storage Gen2のようなシンプルなファイルシステムから直接アクセスできるデータに関しては、Unity Cataloで[外部テーブル](https://qiita.com/taka_yayoi/items/f23b9ee50c453bb8f8a8#%E5%A4%96%E9%83%A8%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB)を作成すべきです。しかし、複雑なクエリーを実行する必要がある、あるいは、外部データベースシステムの計算資源にアクセスししたい場合にはレイクハウスフェデレーションを使うべきです。

## レイクハウスフェデレーション vs. レガシーなクエリーフェデレーション

[Set up query federation for non\-Unity\-Catalog workspaces](https://docs.databricks.com/query-federation/non-uc.html)や[Databricksにおける外部データの取り扱い](https://qiita.com/taka_yayoi/items/09348912a92a24441c40)に記載されているようなレガシーなクエリーフェデレーションの設定では、Databricksでカタログとしてデータベース全体を利用できるようにするのではなく、個々のテーブルごとに接続を設定しなくてはなりません。これらは、レイクハウスフェデレーションのUnity Catalogによるデータガバナンスツールや、データベース全体を取り込む能力を提供しません。そして、これらはレイクハウスフェデレーションのクエリープッシュダウンやパフォーマンス機能を提供しません。

しかし、Unity Catalogを使っていない、あるいはユーザー名やパスワード以外の認証方法を用いている場合には、レガシーなクエリーフェデレーションがベストな選択肢となるかもしれません。

現在のクエリーフェデレーションの設定をレイクハウスフェデレーションに移行したいのであれば、[Migrate legacy query federation connections to Lakehouse Federation](https://docs.databricks.com/query-federation/migrate.html)をご覧ください。

# レイクハウスフェデレーションのセットアップの概要

レイクハウスフェデレーションを用いて、データセットを読み取り専用でクエリーできるようにするには、以下を作成します:

- *接続*、これは外部データベースシステムにアクセスするためのパスと資格情報を指定するUnity Catalogにおけるセキュリティ保護可能なオブジェクトです。
- *外部カタログ*、これは外部データシステムのデータベースをミラーリングするUnity Catalogにおけるセキュリティ保護可能オブジェクトであり、Unity Catalogを用いてアクセスを管理して、お使いのDatabricksワークスペースのデータシステムで読み取り専用のクエリーを実行できるようになります。

# サポートされるデータソース

レイクハウスフェデレーションは以下のデータベースタイプに対する接続をサポートしています:

- [MySQL](https://docs.databricks.com/query-federation/mysql.html)
- [PostgreSQL](https://docs.databricks.com/query-federation/postgresql.html)
- [Amazon Redshift](https://docs.databricks.com/query-federation/redshift.html)
- [Snowflake](https://docs.databricks.com/query-federation/snowflake.html)
- [Microsoft SQL Server](https://docs.databricks.com/query-federation/sql-server.html)
- [Azure SQL Data Warehouse \(SQLDW\)](https://docs.databricks.com/query-federation/sqldw.html)
- [Databricks](https://docs.databricks.com/query-federation/databricks.html)

# 始める前に

ワークスペースの要件:

- ワークスペースでUnity Catalogが有効化されている。

計算資源の要件:

- お使いのDatabricksランタイムクラスターやSQLウェアハウスからターゲットのデータベースシステムへのネットワーク接続が確立されている。[Networking recommendations for Lakehouse Federation](https://docs.databricks.com/query-federation/networking.html)をご覧ください。
- Databricksクラスターでは、Databricksランタイム13.1以降と共有クラスターアクセスモードを使用していること。
- SQLウェアハウスはProあるいはサーバレスであること。

権限の要件:

- 接続を作成するには、メタストア管理者であるか、ワークスペースにアタッチされているUnity Catalogメタストアに対する`CREATE CONNECTION`権限が付与されているユーザーである必要があります。
- 外部カタログを作成するには、メタストアに対する`CREATE CATALOG`権限を持っているか、接続のオーナーあるいは接続に対して`CREATE FOREIGN CATALOG`権限を持っている必要があります。

以降のタスクベースのセクションで、その他に必要な権限が指定されています。

# 接続の作成

接続では、外部データベースシステムにアクセスするためのパスや資格情報を指定します。接続を作成するには、データエクスプローラ、あるいはDatabricksノートブックやDatabricks SQLのクエリーエディタで`CREATE CONNECTION`SQLコマンドを使用することができます。

**必要な権限:** メタストア管理者あるいは`CREATE CONNECTION`権限を持つユーザー。

**データエクスプローラ**

1. Databricksワークスペースで![](https://docs.databricks.com/_images/data-icon.png)**Data**をクリックします。
1. 左のペーンで**External Data**メニューを展開して**Connections**を選択します。
1. **Create connection**をクリックします。
1. わかりやすい**Connection name**をクリックします。
1. **Connection type** (MySQLやPostgreSQLのようなデータベースプロバイダー)を選択します。
1. (ホスト情報、パス、アクセス資格情報のような)接続プロパティを入力します。

    それぞれの接続タイプでは、異なる接続情報が必要となります。お使いの接続タイプに関するマニュアルをご覧ください。

1. (オプション)動作を確認するために**Test connection**をクリックします。
1. (オプション)コメントを入力します。
1. **Create**をクリックします。

**SQL**

ノートブックあるいはDatabricks SQLのクエリーエディタで以下のコマンドを実行します。この例は、PostgreSQLデータベースに対する接続となっています。オプションは接続タイプごとに異なります。お使いの接続タイプに関するマニュアルをご覧ください。

```sql
CREATE CONNECTION <connection-name> TYPE postgresql
OPTIONS (
  host '<hostname>',
  port '<port>',
  user '<user>',
  password '<password>'
);
```

資格情報のようなセンシティブな値は平文ではなく、Databricks[シークレット](https://qiita.com/taka_yayoi/items/338ef0c5394fe4eb87c0)を使うことをお勧めします。

```sql
CREATE CONNECTION <connection-name> TYPE postgresql
OPTIONS (
  host '<hostname>',
  port '<port>',
  user secret ('<secret-scope>','<secret-key-user>'),
  password secret ('<secret-scope>','<secret-key-password>')
)
```

既存の接続の管理に関しては、[Manage connections for Lakehouse Federation](https://docs.databricks.com/query-federation/connections.html)をご覧ください。

# 外部カタログの作成

外部カタログは、DatabricksとUnity Catalogを用いて外部データベースにクエリーを実行したり、アクセスを管理できるように、外部データシステムのデータベースをミラーリングします。外部カタログを作成するには、定義済みのデータソースへの接続を使用します。

外部カタログを作成するには、データエクスプローラ、あるいはDatabricksノートブックやDatabricks SQLのクエリーエディタで`CREATE FOREIGN CATALOG`SQLコマンドを使用することができます。

**必要な権限:** メタストアにおける`CREATE CATALOG`権限を持ち、接続の所有者であるか、接続に対して`CREATE FOREIGN CATALOG`権限を持つユーザー。

**データエクスプローラ**

1. Databricksワークスペースで![](https://docs.databricks.com/_images/data-icon.png)**Data**をクリックします。
1. **Create Catalog**ボタンをクリックします。
1. **Create a new catalog**ダイアログで、カタログ名を入力し、**Foreign**の**Type**を選択します。
1. Unity Catalogのカタログとしてミラーしたいデータベースへのアクセスを提供する**Connection**を選択します。
1. カタログとしてミラーしたい**Database**の名前を入力します。

    データソースによって要件は異なります:
    - MySQLでは2階層の名前空間を使用するので、データベース名は不要です。
    - 他のDatabricksワークスペースのカタログに対する接続では、データベース名ではなくDatabricksの**Catalog**名を入力します。

1. **Create**をクリックします。

**SQL**

以下のSQLコマンドをノートブックかDatabricks SQLのエディタで実行します。ブラケットのアイテムはオプションです。プレースホルダーの値を置き換えてください:

- `<catalog-name>`: Databricksにおけるカタログの名称。
- `<connection-name>`: データソース、パス、アクセス資格情報を指定する[接続オブジェクト](#接続の作成)。
- `<database-name>`: Databricksのカタログとしてミラーしたいデータベース名。2階層の名前空間を使用するMySQLでは不要です。
- `<external-catalog-name>`: *Databricks-to-Databricks*のみ。ミラーリングする外部Databricksワークスペースのカタログ名。[Create a foreign catalog](https://docs.databricks.com/query-federation/databricks.html#foreign-catalog)をご覧ください。

```sql
CREATE FOREIGN CATALOG [IF NOT EXISTS] <catalog-name> USING CONNECTION <connection-name>
OPTIONS (database `<database-name>`);
```

外部カタログの管理と操作に関しては、[Manage and work with foreign catalogs](https://docs.databricks.com/query-federation/foreign-catalogs.html)をご覧ください。

# 制限

- このリリースでは、クエリーは読み取り専用です。
- 接続のスロットリングは、Databricks SQLの同時実行クエリー制限によって決定されます。接続あたりのウェアハウス数には制限はありません。
- プッシュダウンのカバー範囲は、このリリースにおいて制限がある場合があります。サポートされるプッシュダウンのリストは、それぞれの接続タイプのセットアップマニュアルを参照ください。
- 接続タイプ: Databricksでは追加の接続タイプに取り組んでいます。

    間も無く追加される接続タイプに関して知りたい場合、接続タイプのリクエストを行いたい場合には、Databricksにコンタクトしてください。

- サーバレスSQLウェアハウスにおけるPrivate Linkと静的IPレンジのサポートは、このリリースでは利用できません。サポート計画に関しては、Databricksにコンタクトしてください。
- このリリースではOauthはサポートされません。サポート計画に関しては、Databricksにコンタクトしてください。
- 外部スキーマや外部テーブルを直接作成することはできません。サポート計画に関しては、Databricksにコンタクトしてください。
- MySQLコネクターは、このリリースではケースセンシティブテーブルをサポートしません。すべてのテーブル名はUnity Catalogで小文字に変換されるので、検索の際には小文字の名称を使わなくてはならないことを意味します。サポート計画に関しては、Databricksにコンタクトしてください。
- Unity Catalogにおいて不正なテーブル名、スキーマ名はサポートされず、外部カタログ作成時にUnity Catalogによって無視されます。名前付けのルールの一覧や制限については、[Limitations](https://docs.databricks.com/data-governance/unity-catalog/index.html#limitations)をご覧ください。

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)