Unity Catalogと従来のHive metastoreとの連携
この記事では、Databricksワークスペースが Unity Catalogに対して有効になっている場合に、従来のワークスペースごとの Hiveメタストアを引き続き使用するための 1つの方法について説明します。
ワークスペースが Unity Catalogに対して有効になる前にサービスに含まれていた場合は、引き続き使用するデータを含む組み込み Hive metastore がある可能性があります。 この記事では、 Hive metastoreに登録されているテーブルを引き続き操作する方法について説明します。
ワークスペースごとの Hive metastore は従来の機能であり、この記事で説明する手順は従来のワークフローを表しています。
Hive metastore内のテーブルは、組み込み監査、リネージ、アクセス制御など、Unity Catalogによって提供されるセキュリティ機能とガバナンス機能の完全なセットの恩恵を受けません。Databricks では、これらのテーブルとそれらを参照するワークロードを Unity Catalog に移行し、 Hive metastoreへの直接アクセスを無効にすることをお勧めします。
次の 2 つの移行パスを使用できます。
-
Hive metastoreに登録されているすべてのテーブルを Unity Catalogにアップグレードします。Hive テーブルとビューを Unity Catalog にアップグレードするとUCX ユーティリティを使用してワークスペースを Unity Catalog にアップグレードするを参照してください。
-
Hiveメタストアフェデレーション を使用してHiveメタストアをUnity Catalog にフェデレーションし、より段階的なアプローチを実現します。Hive metastoreフェデレーションは、Hiveメタストア をミラーリングするフォーリンカタログをUnity Catalogに作成します。
Unity CatalogでHiveメタストアをクエリする
Unity Catalogメタストアは付加的であるため、Databricks のワークスペースごとのHiveメタストアと共に使用できます。Hive metastoreは、3 レベルの名前空間に hive_metastore
という最上位のカタログとして表示されます。
たとえば、レガシ Hive metastore のsales
スキーマで sales_raw
というテーブルを参照するには、次の表記を使用します。
- SQL
- Python
- R
- Scala
SELECT * from hive_metastore.sales.sales_raw;
display(spark.table("hive_metastore.sales.sales_raw"))
library(SparkR)
display(tableToDF("hive_metastore.sales.sales_raw"))
display(spark.table("hive_metastore.sales.sales_raw"))
USE
ステートメントでカタログとスキーマを指定することもできます。
- SQL
- Python
- R
- Scala
USE hive_metastore.sales;
SELECT * from sales_raw;
spark.sql("USE hive_metastore.sales")
display(spark.table("sales_raw"))
library(SparkR)
sql("USE hive_metastore.sales")
display(tableToDF("sales_raw"))
spark.sql("USE hive_metastore.sales")
display(spark.table("sales_raw"))
レガシーなHiveメタストアと比較したUnity Catalogのアクセス制御
Hiveメタストアで レガシー テーブルアクセスコントロールを設定した場合、 Databricksは、標準アクセスモードで実行されているクラスターにおいては、hive_metastore
カタログ内のデータに対して、これらのアクセス制御を引き続き適用します。
Unity Catalog のアクセス モデルは、従来のアクセス制御とは少し異なります。
- メタストア : Unity Catalog はアカウント レベルのオブジェクトであり、 Hive metastore はワークスペース レベルのオブジェクトです。
hive_metastore
カタログ内で定義された権限は、常にワークスペース内のローカルユーザーとグループを参照します。 - アカウント グループ : Access control ポリシー in Unity Catalog はアカウント グループに適用され、 Hive metastore のアクセス制御ポリシー はワークスペース-local グループに適用されます。 「グループソース」を参照してください。
- カタログまたはスキーマ内のオブジェクトに対するすべての操作には、カタログとスキーマに対する
USE CATALOG
およびUSE SCHEMA
のパーミッションが必要です 。テーブルに対するプリンシパルの権限に関係なく、プリンシパルは、スキーマにアクセスするための親カタログに対するUSE CATALOG
権限と、スキーマ内のオブジェクトにアクセスするためのUSE SCHEMA
権限も必要です。一方、ワークスペース レベルのテーブルアクセスコントロールでは、ルート カタログでUSAGE
を付与すると、すべてのデータベースに対するUSAGE
が自動的に付与されますが、ルート カタログでのUSAGE
は必要ありません。 - ビュー : Unity Catalog では、ビューの所有者は、ビューの参照されるテーブルとビューの所有者である必要はありません。
SELECT
権限があれば、ビューの親スキーマのUSE SCHEMA
と親カタログのUSE CATALOG
とともに十分です。ワークスペースレベルのテーブルアクセスコントロールでは、ビューの所有者は、参照されるすべてのテーブルとビューの所有者である必要があります。 ANY FILE
またはANONYMOUS FUNCTION
のサポートなし : Unity Catalog には、特権のないユーザーが特権コードを実行できるようにするANY FILE
またはANONYMOUS FUNCTION
のセキュリティ保護可能なオブジェクトの概念はありません。DENY
はサポートされていません : Unity Catalog 特権モデルは、最小特権の原則に基づいて構築されています。付与されていない特権は、暗黙的に拒否されます。READ_METADATA
権限なし : Unity Catalog は、メタデータを表示するためのアクセスを別の方法で管理します。Unity Catalog の特権とセキュリティ保護可能なオブジェクトを参照してください。
Unity CatalogオブジェクトとHive metastoreオブジェクト間の結合
3 レベルの名前空間表記を使用すると、 Unity Catalog メタストアのデータを従来の Hive metastoreのデータと結合できます。
レガシ Hive metastore のデータとの結合は、そのデータが存在するワークスペースでのみ機能します。 このような結合を別のワークスペースで実行しようとすると、エラーが発生します。 Databricks では、従来のテーブルとビューを Unity Catalog にアップグレード することをお勧めします。
次の例では、order_id
フィールドが等しい場合に、レガシ Hive metastore メタストアの sales_current
テーブルと Unity Catalog メタストアの sales_historical
テーブルを結合します。
- SQL
- Python
- R
- Scala
SELECT * FROM hive_metastore.sales.sales_current
JOIN main.shared_sales.sales_historical
ON hive_metastore.sales.sales_current.order_id = main.shared_sales.sales_historical.order_id;
dfCurrent = spark.table("hive_metastore.sales.sales_current")
dfHistorical = spark.table("main.shared_sales.sales_historical")
display(dfCurrent.join(
other = dfHistorical,
on = dfCurrent.order_id == dfHistorical.order_id
))
library(SparkR)
dfCurrent = tableToDF("hive_metastore.sales.sales_current")
dfHistorical = tableToDF("main.shared_sales.sales_historical")
display(join(
x = dfCurrent,
y = dfHistorical,
joinExpr = dfCurrent$order_id == dfHistorical$order_id))
val dfCurrent = spark.table("hive_metastore.sales.sales_current")
val dfHistorical = spark.table("main.shared_sales.sales_historical")
display(dfCurrent.join(
right = dfHistorical,
joinExprs = dfCurrent("order_id") === dfHistorical("order_id")
))
デフォルトカタログ
デフォルト カタログは、 Unity Catalogが有効になっているワークスペースごとに構成されます。
データ操作を実行するときに最上位のカタログ名を省略すると、デフォルトのカタログが想定されます。
ワークスペースに対して最初に構成されたデフォルト カタログは、ワークスペースが Unity Catalogに対してどのように有効にされたかによって異なります。
- ワークスペースが自動的に Unity Catalog 有効になっている場合、 ワークスペース カタログ はデフォルト カタログとして設定されています。 Unity Catalog の自動有効化を参照してください。
- ワークスペースで手動で Unity Catalog が有効になっている場合、
hive_metastore
カタログはデフォルト カタログとして設定されています。
既存のワークスペース内で Hive メタストア から Unity Catalog に移行する場合は、完全に移行を完了していない場合は、 Hive メタストア を参照する既存のコードに影響を与えないように、hive_metastore
をデフォルト カタログとして使用するのが合理的です。
デフォルト カタログを取得して切り替える方法については、「 デフォルト カタログの管理」を参照してください
クラスター スコープのデータ アクセス権限
Hive metastore を Unity Catalogと共に使用すると、クラスターに関連付けられたデータ アクセス資格情報は、Hive metastoreデータへのアクセスに使用されますが、Unity Catalogに登録されているデータへのアクセスには使用されません。
ユーザーが Unity Catalog の外部にあるパス (テーブルまたは外部ロケーションとして登録されていないパスなど) にアクセスする場合は、クラスターに割り当てられたアクセス資格情報が使用されます。
「 Amazon S3 への接続」を参照してください。