Get started using Unity Catalog | Databricks on AWS [2022/12/14時点]の翻訳です。
こちらの記事の内容は古いものとなっています。Unity Catalogの概要理解にのみご利用ください。最新のマニュアルをご覧ください。
本書では、あなたの組織でUnity Catalogをセットアップするためのステップバイステップの手順を提供します。Unity Catalogを使用するためにあなたのDatabricksアカウントでの有効化の方法と、Unity Catalogで最初のテーブルを作成する方法を説明します。
Unity Catalogセットアップの概要
このセクションでは、Unity Catalogを使用するためにどのようにDatabricksアカウントをセットアップするのか、どの様に最初のテーブルを作成するのかに関して、ハイレベルの概要を説明します。詳細なステップバイステップの指示に関しては以降のセクションをご覧ください。
Unity Catalogを使えるようにDatabricksアカウントを有効化するには、以下の手順を踏んでください。
-
Unity CatalogがあなたのAWSアカウントにデータを格納、アクセスできるようにS3バケットとIAMロールを設定します。
-
皆様の企業が利用しているリージョンのそれぞれにメタストアを作成します。このメタストアは、Unity Catalogのすべてのデータに対するトップレベルのコンテナとして動作します。
メタストアの作成者として、あなたはオーナーでありメタストアの管理者となります。
-
メタストアにワークスペースをアタッチします。それぞれのワークスペースでは、Unity Catalogで管理するデータに対して同じビューを持つことになります。
-
Databricksアカウントにユーザー、グループ、サービスプリンシパルを追加します。
既存のDatabricksアカウントにおいては、これらのIDは既に表示されます。
-
(オプション)メタストア管理者のロールをグループに移譲します。
ユーザーに対するデータアクセスをセットアップするには、以下の手順を踏みます。
-
ワークスペースで少なくとも1つの計算資源、クラスターかSQLウェアハウスを作成します。
Unity Catalogによって保護されるデータオブジェクトに対するgrant文を含み、クエリーやコマンドの実行にこの計算資源を使用します。
-
少なくとも1つのカタログを作成します。
カタログはあなたが操作するテーブルを保持するスキーマ(データベース)を保持します。
-
少なくとも1つのスキーマを作成します。
-
テーブルを作成します。
データ階層のそれぞれのレベル(カタログ、スキーマ、テーブル)において、ユーザー、グループ、サービスプリンシパルに対して権限を付与します。また、dynamic viewsを用いて行・列レベルのアクセス権を付与することができます。
要件
- Databricksのアカウント管理者である必要があります。
- DatabricksのアカウントはPremiumプランである必要があります。
- AWSにおいては、S3バケット、IAMロールとポリシー、クロスアカウントの信頼関係を作成できる必要があります。
- Unity Catalogを使用する最低1つのワークスペース。Create and manage workspaces using the account consoleをご覧ください。
AWSにおけるストレージバケットとIAMロールの設定
このステップでは、Unity CatalogがあなたのAWSアカウントにデータを格納アクセスするために必要なAWSオブジェクトを作成します。
-
DatabricksアカウントIDを特定します。
- Databricksアカウントコンソールにログインします。
- User Profileをクリックします。
- ポップアップから、Account IDの隣の値をコピーします。
-
AWSでS3バケットを作成します。
このバケットは、Unity Catalogにおけるマネージドテーブルのルートストレージロケーションとなります。メタストアごとに専用のS3バケットを使用し、データにアクセスしたいワークスペースと同じリージョンに配置してください。
s3://
で始まるS3バケットのパスをメモしておきます。このデフォルトストレージロケーションはカタログ、スキーマレベルで上書きされます。
重要!
バケット名にはドットを含めないでください(例:incorrect.bucket.name.notation
)。バケットの命名に関するガイドについては、AWS bucket naming rulesをご覧ください。S3バケットでKMSの暗号化を有効化する場合には、KMS暗号化キーの名前をメモしておきます。
-
S3バケットへのアクセスを許可するIAMロールを作成します。
Unity CatalogがDatabricksユーザーの代わりにバケットのデータにアクセスするためのロールを仮定できるように、クロスアカウントの信頼関係をセットアップします。Trust Relationshipタブに以下のポリシーJSONを貼り付けます。
- Databricksによって作成されたロールを参照している静的な値である
Principal
のロールARNは変更しないでください。 - 二つ目のロールARNは作成するロールに対する自己参照です。これは、このロールはself-assumingである必要があるためです。こちらのAmazon のブログ記事をご覧ください。
<YOUR_AWS_ACCOUNT_ID>
と<THIS_ROLE_NAME>
を実際のIAMロールの値で置き換えてください。 -
sts:ExternalId
セクションでは、<DATABRICKS_ACCOUNT_ID>
を、最初のステップで取得したお使いのDatabricksアカウントID(AWSアカウントIDではありません)で置き換えてください。
JSON{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::414351767826:role/unity-catalog-prod-UCMasterRole-14S5ZJVKOTYTL", "arn:aws:iam::<YOUR_AWS_ACCOUNT_ID>:role/<THIS_ROLE_NAME>" ] }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "<DATABRICKS_ACCOUNT_ID>" } } } ] }
- Databricksによって作成されたロールを参照している静的な値である
-
S3バケットと同じAWSアカウントでIAMポリシーを作成します。
予期しない問題を回避するために、以下のサンプルポリシーを使ってください。以下のポリシーでは、以下の値を置き換えます。
-
<BUCKET>
: 上のステップで作成したS3バケット名 -
<KMS_KEY>
: 暗号化が有効化されている場合には、S3バケットのコンテンツを暗号化するKMSキーの名前。暗号化が無効化されている場合には、IAMポリシーの最後の部分を削除します。 -
<AWS_ACCOUNT_ID>
: 現在のAWSアカウントのアカウントID(Databricksアカウントではありません) -
<AWS_IAM_ROLE_NAME>
: 上のステップで作成したAWS IAMロールの名前
JSON{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:ListBucket", "s3:GetBucketLocation", "s3:PutLifecycleConfiguration", "s3:GetLifecycleConfiguration" ], "Resource": [ "arn:aws:s3:::<BUCKET>/*", "arn:aws:s3:::<BUCKET>" ], "Effect": "Allow" }, { "Action": [ "kms:Decrypt", "kms:Encrypt", "kms:GenerateDataKey*" ], "Resource": [ "arn:aws:kms:<KMS_KEY>" ], "Effect": "Allow" }, { "Action": [ "sts:AssumeRole" ], "Resource": [ "arn:aws:iam::<AWS_ACCOUNT_ID>:role/<AWS_IAM_ROLE_NAME>" ], "Effect": "Allow" } ] }
注意
- Unity Catalogに対してより厳密なIAMポリシーを必要とする場合には、支援のためにDatabricks担当者にコンタクトしてください。
- Partner ConnectとデータアップロードUIで使用されるパーソナルステージングロケーションにおけるライフサイクルポリシーを管理するために、Databricksでは
GetLifecycleConfiguration
とPutLifecycleConfiguration
を使用します。
-
-
IAMロールにIAMポリシーをアタッチします。
IAMロールのPermissionタブで、上で作成したIAMポリシーをアタッチします。
初めてのメタストアを作成し、ワークスペースにアタッチする
Unity Catalogを使うにはメタストアを作成する必要があります。メタストアはUnity Catalogにおけるデータに対するトップレベルのコンテナとなります。それぞれのメタストアは、データを構成するための3レベルの名前空間(catalog.schema.table
)を提供します。
あなたの組織で使用しているリージョンのそれぞれに対してメタストアを作成します。これらのリージョンごとのメタストアを同じリージョンの任意の数のワークスペースにリンクすることができます。
リンクされたそれぞれのワークスペースはメタストアのデータに対して一貫性のあるビューを持ち、ワークスペース横断でアクセス制御を行うことができます。
Delta Sharingを用いてメタストアを越えてデータにアクセスすることができます。
メタストアを作成するには以下を実行します。
-
アカウントコンソールにログインします。
-
Create Metastoreをクリックします。
以下を入力します。
-
メタストアの名前。
-
メタストアをデプロイするリージョン。
データにアクセスするワークスペースと同じリージョンでなくてはなりません。上で作成したストレージバケット同じリージョンであることを確認してください。
-
AWSにおけるストレージバケットとIAMロールの設定で作成したS3バケットのパス(
s3://
は含めなくても大丈夫です)とIAMロールの名前。
-
-
Createをクリックします。
-
プロンプトが表示されたら、メタストアにリンクするワークスペースを選択します。
メタストアへのワークスペースの割り当てに関する詳細については、Enable a workspace for Unity Catalogをご覧ください。
メタストアを作成したユーザーがメタストア管理者とも呼ばれるオーナーになります。メタストア管理者はカタログの様なメタストアのトップレベルのオブジェクトを作成でき、テーブルやその他のオブジェクトへのアクセスを管理することができます。メタストア管理者のロールをグループに再割り当てすることをお勧めします。メタストアを作成した後にオーナーシップを変更するには、(推奨)メタストアのオーナーシップをグループに転送するをご覧ください。
ユーザー、グループの追加
Unity Catalogのメタストアは複数のDatabricksワークスペースで共有することができます。Databricksが全てのワークスペースに対して一貫性のあるユーザー、グループのビューを持てるように、アカウントレベルのIDとなるユーザー、グループを作成することができます。このステップでは、アカウントコンソールでユーザーやグループを作成し、これらのIDがアクセスできるワークスペースを選択します。
注意
- 既存のアカウントやワークスペースをお持ちの場合、おそらくアカウント内にユーザーやグループをお持ちなので、このステップをスキップすることができます。
- 大量のユーザー、グループを必要とする場合、あるいはDatabricks外でアイデンティティを管理したい場合、Databricksにおけるアイデンティティプロバイダーとのユーザー、グループの同期を行うことができます。
アカウントコンソールでユーザーやグループを追加するには以下を実施します。
-
Accountコンソールにログインします(アカウント管理者である必要があります)。
-
ユーザーを追加するには以下を実行します。
- Usersをクリックします。
- Add Userをクリックします。
- ユーザーのメールアドレスを入力します。
- Send Inviteをクリックします。
-
グループを追加するには以下を実行します。
- Groupsをクリックします。
- Add Groupをクリックします。
- グループ名を入力します。
- Confirmをクリックします。
- プロンプトが表示されたら、グループにユーザーを追加します。
-
ユーザーやグループを、Unity Catalogによって管理されるデータを用いてデータサイエンス、データエンジニアリング、データ分析タスクを行うワークスペースに追加します。
使い始めるには、data-consumersというグループを作成します。このウォークスルーの中でこのグループを使用します。
クラスターあるいはSQLウェアハウスの作成
Unity Catalogで定義されるテーブルは、きめ細かいアクセスコントロールで保護されます。アクセスコントロールが適用されていることを確実にするために、Unity Catalogはセキュリティ設定に準拠するクラスターを必要とします。Unity Catalogはデフォルトでセキュアなものとなっており、これに準拠していないクラスターはUnity Catalogのテーブルにアクセスできないことを意味します。
Databricksでは2種類の計算資源を提供しています。
- Data Science & EngineeringとDatabricks Machine Learningベースの環境のワークロードで使用されるクラスター
- Databricks SQLでクエリーを実行する際に用いられるSQLウェアハウス
Databricks SQLであればSQLウェアハウス、Data Science & EngineeringとDatabricks Machine Learningベースの環境であればクラスターという様に使用している環境に応じて、これらのいずれかの計算資源を用いてUnity Catalogを操作することができます。
クラスターの作成
Unity Catalogにアクセスできるクラスターを作成するには、以下を実行します。
- ワークスペースの管理者あるいはクラスター作成権限を持つユーザーとしてワークスペースにログインします。
- Computeをクリックします。
-
Create clusterをクリックします。
-
クラスターの名前を入力します。
-
Access modeをSingle userに設定します。
Single userとSharedアクセスモードのみがUnity Catalogをサポートしています。
-
Databricks runtime versionを Runtime: 11.1 (Scala 2.12, Spark 3.2.1) 以降に設定します。
-
- Create Clusterをクリックします。
固有の設定オプションに関しては、Databricksにおけるクラスター作成をご覧ください。
SQLウェアハウスの作成
SQLウェアハウスではデフォルトでUnity Catalogをサポートしており、追加の設定は不要です。
SQLウェアハウスを作成するには以下の手順を踏みます。
- ワークスペースの管理者あるいはクラスター作成権限を持つユーザーとしてワークスペースにログインします。
- ペルソナスイッチャーでSQLを選択します。
- Createをクリックし、SQL Warehouseを選択します。
- Advanced SettingsでChannelをCurrentに設定します。
固有の設定オプションに関しては、SQLウェアハウスの作成をご覧ください。
初めてのテーブルの作成
Unity Catalogでは、メタストアにはスキーマ(データベース)を格納するカタログが保持され、いつでもスキーマにテーブルを作成することができます。
3レベルの記述を用いて、以下の文法でテーブルを参照することができます。
<catalog>.<schema>.<table>
新規作成されたメタストアには、default
という名前の空のスキーマを含むmain
というカタログが含まれています。この例では、main
カタログのdefault
スキーマにdepartment
というテーブルを作成します。
テーブルを作成するには、親のスキーマに対するCREATE
権限と、親のカタログとスキーマのUSAGE
権限を持っている必要があります。メタストア管理者はデフォルトでこれらの権限を持っています。
カタログmain
とスキーマmain.default
に関しては、すべてのユーザーがUSAGE
権限を最初から持っています。あなたがメタストア管理者ではない場合、メタストア管理者やスキーマのオーナーが、main.default
スキーマに対するCREATE
権限を付与することができます。
手動でテーブルを作成するには以下のステップを踏みます。カタログ、スキーマ、テーブルを作成し、これらに対するアクセス権を管理するサンプルノートブックをインポートすることもできます。
-
ノートブックを作成し、クラスターあるいはSQLウェアハウスの作成で作成したData Science & Engineeringクラスターにアタッチします。
ノートブックの言語は、使用する言語に応じてSQL、Python、R、Scalaを選択します。
-
default
スキーマに対してテーブルを作成する権限を付与します。テーブルを作成するには、ユーザーにはカタログにおける
USAGE
権限に加え、スキーマに対するCREATE
、USAGE
権限が必要となります。メタストアが作成された場合、全てのユーザーにはmain
カタログとmain.default
スキーマに対するUSAGE
権限が与えられます。メタストア管理者、
main.default
スキーマのオーナーが、ユーザーあるいはグループにCREATE
権限をGRANT
するための以下のコマンドを実行することができます。SQLGRANT CREATE ON SCHEMA <catalog-name>.<schema-name> TO `<EMAIL_ADDRESS>`;
Pythonspark.sql("GRANT CREATE ON SCHEMA <catalog-name>.<schema-name> TO `<EMAIL_ADDRESS>`")
Rlibrary(SparkR) sql("GRANT CREATE ON SCHEMA <catalog-name>.<schema-name> TO `<EMAIL_ADDRESS>`")
Scalaspark.sql("GRANT CREATE ON SCHEMA <catalog-name>.<schema-name> TO `<EMAIL_ADDRESS>`")
例えば、グループ
data-consumers
に対してmain.default
にテーブルを作成するのを許可するには以下を実行します。SQLGRANT CREATE ON SCHEMA main.default to `data-consumers`;
Pythonspark.sql("GRANT CREATE ON SCHEMA main.default to `data-consumers`")
Rlibrary(SparkR) sql("GRANT CREATE ON SCHEMA main.default TO `data-consumers`")
Scalaspark.sql("GRANT CREATE ON SCHEMA main.default to `data-consumers`")
セルを実行します。
-
ノートブックに新規セルを追加します。カラムを指定して
department
という新規テーブルを作成し、5行を追加するする以下のSQLを貼り付けます。SQLCREATE TABLE main.default.department ( deptcode INT, deptname STRING, location STRING ); INSERT INTO main.default.department VALUES (10, 'FINANCE', 'EDINBURGH'), (20, 'SOFTWARE', 'PADDINGTON'), (30, 'SALES', 'MAIDSTONE'), (40, 'MARKETING', 'DARLINGTON'), (50, 'ADMIN', 'BIRMINGHAM');
Pythonfrom pyspark.sql.types import StructType, StructField, IntegerType, StringType schema = StructType([ \ StructField("deptcode", IntegerType(), True), StructField("deptname", StringType(), True), StructField("location", StringType(), True) ]) spark.catalog.createTable( tableName = "main.default.department", schema = schema \ ) dfInsert = spark.createDataFrame( data = [ (10, "FINANCE", "EDINBURGH"), (20, "SOFTWARE", "PADDINGTON"), (30, "SALES", "MAIDSTONE"), (40, "MARKETING", "DARLINGTON"), (50, "ADMIN", "BIRMINGHAM") ], schema = schema ) dfInsert.write.saveAsTable( name = "main.default.department", mode = "append" )
Rlibrary(SparkR) schema = structType( structField("deptcode", "integer", TRUE), structField("deptname", "string", TRUE), structField("location", "string", TRUE) ) df = createDataFrame( data = list(), schema = schema ) saveAsTable( df = df, tableName = "main.default.department" ) data = list( list("deptcode" = 10L, "deptname" = "FINANCE", "location" = "EDINBURGH"), list("deptcode" = 20L, "deptname" = "SOFTWARE", "location" = "PADDINGTON"), list("deptcode" = 30L, "deptname" = "SALES", "location" = "MAIDSTONE"), list("deptcode" = 40L, "deptname" = "MARKETING", "location" = "DARLINGTON"), list("deptcode" = 50L, "deptname" = "ADMIN", "location" = "BIRMINGHAM") ) dfInsert = createDataFrame( data = data, schema = schema ) insertInto( x = dfInsert, tableName = "main.default.department" )
Scalaimport spark.implicits._ import org.apache.spark.sql.types.StructType val df = spark.createDataFrame( new java.util.ArrayList[Row](), new StructType() .add("deptcode", "int") .add("deptname", "string") .add("location", "string") ) df.write .format("delta") .saveAsTable("main.default.department") val dfInsert = Seq( (10, "FINANCE", "EDINBURGH"), (20, "SOFTWARE", "PADDINGTON"), (30, "SALES", "MAIDSTONE"), (40, "MARKETING", "DARLINGTON"), (50, "ADMIN", "BIRMINGHAM") ).toDF("deptcode", "deptname", "location") dfInsert.write.insertInto("main.default.department")
セルを実行します。
-
テーブルに対してクエリーを実行します。ノートブックにセルを追加します。以下のSQLを貼り付けてせるを実行します。
SQLSELECT * from main.default.department;
Pythondisplay(spark.table("main.default.department"))
Rdisplay(tableToDF("main.default.department"))
Scaladisplay(spark.table("main.default.department"))
-
アカウントレベルのユーザー、グループの追加で作成した
data-consumers
グループに対して、テーブルを読み取る権限を許可します。ノートブックにセルを追加し、以下のSQLを貼り付け、セルを実行します。SQLGRANT SELECT ON main.default.department TO `data-consumers`;
Pythonspark.sql("GRANT SELECT ON main.default.department TO `data-consumers`")
Rsql("GRANT SELECT ON main.default.department TO `data-consumers`")
Scalaspark.sql("GRANT SELECT ON main.default.department TO `data-consumers`")
注意
data-consumers
だけでなく、全てのアカウントレベルユーザーに読み取りアクセス権を付与するには、account users
グループを使用します。セルを実行します。
ショートカット:カタログ、スキーマ、テーブルを作成するためにサンプルノートブックを使う
SQLでUnity Catalogテーブルの作成、管理
PythonでUnity Catalogテーブルの作成、管理
(オプション)他のワークスペースにメタストアをリンクする
Unity Catalogの大きなメリットは、単一のメタストアを同じリージョンにある複数のワークスペースで共有できることにあります。ワークスペース間でデータをコピーすることなしに、同じデータに対して異なるタイプのワークロードを実行することができます。それぞれのワークスペースには1つのUnity Catalogメタストアを割り当てることができます。
他のワークスペースにメタストアをリンクする方法に関しては、Enable a workspace for Unity Catalogをご覧ください。
(推奨)お使いのIdPとアカウントレベルのIDを同期する
Oktaのようなアイデンティティプロバイダー(IdP)をセットアップすることで、Databricksのユーザーアクセスを管理することができます。完全な手順については、Databricksにおけるアイデンティティプロバイダーとのユーザー、グループの同期をご覧ください。
(推奨)メタストアのオーナーシップをグループに転送する
Assign a metastore adminをご覧下さい。
(オプション)Unity Catalog CLIのインストール
Unity Catalog CLIはDatabricks CLIの一部です。Unity Catalog CLIを使うには以下の手順を踏んでください。
- CLIをセットアップします。
- 認証設定を行います。
- オプションで、CLIを使うための接続プロファイルを1つ以上作成します。
- 一般的なDatabricks CLIの使い方を学びます。
- Unity Catalog CLIを使い始めます。