3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Unity Catalogを使い始める

Last updated at Posted at 2022-03-12

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アカウントを有効化するには、以下の手順を踏んでください。

  1. Unity CatalogがあなたのAWSアカウントにデータを格納、アクセスできるようにS3バケットとIAMロールを設定します。

  2. 皆様の企業が利用しているリージョンのそれぞれにメタストアを作成します。このメタストアは、Unity Catalogのすべてのデータに対するトップレベルのコンテナとして動作します。

    メタストアの作成者として、あなたはオーナーでありメタストアの管理者となります。

  3. メタストアにワークスペースをアタッチします。それぞれのワークスペースでは、Unity Catalogで管理するデータに対して同じビューを持つことになります。

  4. Databricksアカウントにユーザー、グループ、サービスプリンシパルを追加します。

    既存のDatabricksアカウントにおいては、これらのIDは既に表示されます。

  5. (オプション)メタストア管理者のロールをグループに移譲します。

ユーザーに対するデータアクセスをセットアップするには、以下の手順を踏みます。

  1. ワークスペースで少なくとも1つの計算資源、クラスターかSQLウェアハウスを作成します。

    Unity Catalogによって保護されるデータオブジェクトに対するgrant文を含み、クエリーやコマンドの実行にこの計算資源を使用します。

  2. 少なくとも1つのカタログを作成します。

    カタログはあなたが操作するテーブルを保持するスキーマ(データベース)を保持します。

  3. 少なくとも1つのスキーマを作成します。

  4. テーブルを作成します。

データ階層のそれぞれのレベル(カタログ、スキーマ、テーブル)において、ユーザー、グループ、サービスプリンシパルに対して権限を付与します。また、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オブジェクトを作成します。

  1. DatabricksアカウントIDを特定します。

    1. Databricksアカウントコンソールにログインします。
    2. User Profileをクリックします。
    3. ポップアップから、Account IDの隣の値をコピーします。
  2. AWSでS3バケットを作成します。

    このバケットは、Unity Catalogにおけるマネージドテーブルのルートストレージロケーションとなります。メタストアごとに専用のS3バケットを使用し、データにアクセスしたいワークスペースと同じリージョンに配置してください。s3://で始まるS3バケットのパスをメモしておきます。

    このデフォルトストレージロケーションはカタログ、スキーマレベルで上書きされます。

    重要!
    バケット名にはドットを含めないでください(例:incorrect.bucket.name.notation)。バケットの命名に関するガイドについては、AWS bucket naming rulesをご覧ください。

    S3バケットでKMSの暗号化を有効化する場合には、KMS暗号化キーの名前をメモしておきます。

  3. 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>"
            }
          }
        }
      ]
    }
    
  4. 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ではGetLifecycleConfigurationPutLifecycleConfigurationを使用します。
  5. IAMロールにIAMポリシーをアタッチします。

    IAMロールのPermissionタブで、上で作成したIAMポリシーをアタッチします。

初めてのメタストアを作成し、ワークスペースにアタッチする

Unity Catalogを使うにはメタストアを作成する必要があります。メタストアはUnity Catalogにおけるデータに対するトップレベルのコンテナとなります。それぞれのメタストアは、データを構成するための3レベルの名前空間(catalog.schema.table)を提供します。

あなたの組織で使用しているリージョンのそれぞれに対してメタストアを作成します。これらのリージョンごとのメタストアを同じリージョンの任意の数のワークスペースにリンクすることができます。

リンクされたそれぞれのワークスペースはメタストアのデータに対して一貫性のあるビューを持ち、ワークスペース横断でアクセス制御を行うことができます。

Delta Sharingを用いてメタストアを越えてデータにアクセスすることができます。

メタストアを作成するには以下を実行します。

  1. アカウントコンソールにログインします。

  2. Dataをクリックします。

  3. Create Metastoreをクリックします。

    以下を入力します。

    • メタストアの名前。

    • メタストアをデプロイするリージョン。

      データにアクセスするワークスペースと同じリージョンでなくてはなりません。上で作成したストレージバケット同じリージョンであることを確認してください。

    • AWSにおけるストレージバケットとIAMロールの設定で作成したS3バケットのパス(s3://は含めなくても大丈夫です)とIAMロールの名前。

  4. Createをクリックします。

  5. プロンプトが表示されたら、メタストアにリンクするワークスペースを選択します。
    メタストアへのワークスペースの割り当てに関する詳細については、Enable a workspace for Unity Catalogをご覧ください。

メタストアを作成したユーザーがメタストア管理者とも呼ばれるオーナーになります。メタストア管理者はカタログの様なメタストアのトップレベルのオブジェクトを作成でき、テーブルやその他のオブジェクトへのアクセスを管理することができます。メタストア管理者のロールをグループに再割り当てすることをお勧めします。メタストアを作成した後にオーナーシップを変更するには、(推奨)メタストアのオーナーシップをグループに転送するをご覧ください。

ユーザー、グループの追加

Unity Catalogのメタストアは複数のDatabricksワークスペースで共有することができます。Databricksが全てのワークスペースに対して一貫性のあるユーザー、グループのビューを持てるように、アカウントレベルのIDとなるユーザー、グループを作成することができます。このステップでは、アカウントコンソールでユーザーやグループを作成し、これらのIDがアクセスできるワークスペースを選択します。

注意

アカウントコンソールでユーザーやグループを追加するには以下を実施します。

  1. Accountコンソールにログインします(アカウント管理者である必要があります)。

  2. Users managementをクリックします。

  3. ユーザーを追加するには以下を実行します。

    1. Usersをクリックします。
    2. Add Userをクリックします。
    3. ユーザーのメールアドレスを入力します。
    4. Send Inviteをクリックします。
  4. グループを追加するには以下を実行します。

    1. Groupsをクリックします。
    2. Add Groupをクリックします。
    3. グループ名を入力します。
    4. Confirmをクリックします。
    5. プロンプトが表示されたら、グループにユーザーを追加します。
  5. ユーザーやグループを、Unity Catalogによって管理されるデータを用いてデータサイエンス、データエンジニアリング、データ分析タスクを行うワークスペースに追加します。

    1. サイドバーでWorkspacesをクリックします。
    2. PermissionsタブでAdd permissionsをクリックします。
    3. ユーザーやグループを検索し、権限レベル(ワークスペースUserあるいはAdmin)を選択しSaveをクリックします。

使い始めるには、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にアクセスできるクラスターを作成するには、以下を実行します。

  1. ワークスペースの管理者あるいはクラスター作成権限を持つユーザーとしてワークスペースにログインします。
  2. Computeをクリックします。
  3. Create clusterをクリックします。
    1. クラスターの名前を入力します。

    2. Access modeSingle userに設定します。

      Single userSharedアクセスモードのみがUnity Catalogをサポートしています。

    3. Databricks runtime versionRuntime: 11.1 (Scala 2.12, Spark 3.2.1) 以降に設定します。

  4. Create Clusterをクリックします。

固有の設定オプションに関しては、Databricksにおけるクラスター作成をご覧ください。

SQLウェアハウスの作成

SQLウェアハウスではデフォルトでUnity Catalogをサポートしており、追加の設定は不要です。

SQLウェアハウスを作成するには以下の手順を踏みます。

  1. ワークスペースの管理者あるいはクラスター作成権限を持つユーザーとしてワークスペースにログインします。
  2. ペルソナスイッチャーでSQLを選択します。
  3. Createをクリックし、SQL Warehouseを選択します。
  4. Advanced SettingsChannelCurrentに設定します。

固有の設定オプションに関しては、SQLウェアハウスの作成をご覧ください。

初めてのテーブルの作成

Unity Catalogでは、メタストアにはスキーマ(データベース)を格納するカタログが保持され、いつでもスキーマにテーブルを作成することができます。

3レベルの記述を用いて、以下の文法でテーブルを参照することができます。

SQL
<catalog>.<schema>.<table>

新規作成されたメタストアには、defaultという名前の空のスキーマを含むmainというカタログが含まれています。この例では、mainカタログのdefaultスキーマにdepartmentというテーブルを作成します。

テーブルを作成するには、親のスキーマに対するCREATE権限と、親のカタログとスキーマのUSAGE権限を持っている必要があります。メタストア管理者はデフォルトでこれらの権限を持っています。

カタログmainとスキーマmain.defaultに関しては、すべてのユーザーがUSAGE権限を最初から持っています。あなたがメタストア管理者ではない場合、メタストア管理者やスキーマのオーナーが、main.defaultスキーマに対するCREATE権限を付与することができます。

手動でテーブルを作成するには以下のステップを踏みます。カタログ、スキーマ、テーブルを作成し、これらに対するアクセス権を管理するサンプルノートブックをインポートすることもできます。

  1. ノートブックを作成し、クラスターあるいはSQLウェアハウスの作成で作成したData Science & Engineeringクラスターにアタッチします。

    ノートブックの言語は、使用する言語に応じてSQLPythonRScalaを選択します。

  2. defaultスキーマに対してテーブルを作成する権限を付与します。

    テーブルを作成するには、ユーザーにはカタログにおけるUSAGE権限に加え、スキーマに対するCREATEUSAGE権限が必要となります。メタストアが作成された場合、全てのユーザーにはmainカタログとmain.defaultスキーマに対するUSAGE権限が与えられます。

    メタストア管理者、main.defaultスキーマのオーナーが、ユーザーあるいはグループにCREATE権限をGRANTするための以下のコマンドを実行することができます。

    SQL
    GRANT CREATE ON SCHEMA <catalog-name>.<schema-name> TO `<EMAIL_ADDRESS>`;
    
    Python
    spark.sql("GRANT CREATE ON SCHEMA <catalog-name>.<schema-name> TO `<EMAIL_ADDRESS>`")
    
    R
    library(SparkR)
    
    sql("GRANT CREATE ON SCHEMA <catalog-name>.<schema-name> TO `<EMAIL_ADDRESS>`")
    
    Scala
    spark.sql("GRANT CREATE ON SCHEMA <catalog-name>.<schema-name> TO `<EMAIL_ADDRESS>`")
    

    例えば、グループdata-consumersに対してmain.defaultにテーブルを作成するのを許可するには以下を実行します。

    SQL
    GRANT CREATE ON SCHEMA main.default to `data-consumers`;
    
    Python
    spark.sql("GRANT CREATE ON SCHEMA main.default to `data-consumers`")
    
    R
    library(SparkR)
    
    sql("GRANT CREATE ON SCHEMA main.default TO `data-consumers`")
    
    Scala
    spark.sql("GRANT CREATE ON SCHEMA main.default to `data-consumers`")
    

    セルを実行します。

  3. ノートブックに新規セルを追加します。カラムを指定してdepartment という新規テーブルを作成し、5行を追加するする以下のSQLを貼り付けます。

    SQL
    CREATE 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');
    
    Python
    from 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"
    )
    
    R
    library(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"
    )
    
    Scala
    import 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")
    

    セルを実行します。

  4. テーブルに対してクエリーを実行します。ノートブックにセルを追加します。以下のSQLを貼り付けてせるを実行します。

    SQL
    SELECT * from main.default.department;
    
    Python
    display(spark.table("main.default.department"))
    
    R
    display(tableToDF("main.default.department"))
    
    Scala
    display(spark.table("main.default.department"))
    
  5. アカウントレベルのユーザー、グループの追加で作成したdata-consumersグループに対して、テーブルを読み取る権限を許可します。ノートブックにセルを追加し、以下のSQLを貼り付け、セルを実行します。

    SQL
    GRANT SELECT ON main.default.department TO `data-consumers`;
    
    Python
    spark.sql("GRANT SELECT ON main.default.department TO `data-consumers`")
    
    R
    sql("GRANT SELECT ON main.default.department TO `data-consumers`")
    
    Scala
    spark.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を使うには以下の手順を踏んでください。

  1. CLIをセットアップします。
  2. 認証設定を行います。
  3. オプションで、CLIを使うための接続プロファイルを1つ以上作成します。
  4. 一般的なDatabricks CLIの使い方を学びます。
  5. Unity Catalog CLIを使い始めます。

次のステップ

Databricks 無料トライアル

Databricks 無料トライアル

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?