Apache Spark に接続する

BigQuery 管理者は、データ アナリストが Apache Spark 用のストアド プロシージャを実行できるように、接続を作成できます。

準備

ロケーションに関する留意事項

データのロケーションを選択するときは、次の点を考慮してください。

マルチリージョン

同じ広い地理的エリアにある Google Cloud リソースを指定する必要があります。

  • BigQuery US マルチリージョン内の接続は、米国内の任意の地理的領域(us-central1us-east4us-west2 など)内の単一リージョン内の Spark History Server または Dataproc Metastore を参照できます。

  • BigQuery EU マルチリージョン内の接続は、EU(europe-north1europe-west3)の加盟国にある Dataproc Metastore を参照できます。

単一リージョン

単一リージョン内の接続では、同じリージョン内の Google Cloud リソースのみを参照できます。たとえば、単一リージョン us-east4 の接続は、us-east4 の Spark 履歴サーバーまたは Dataproc Metastore のみを参照できます。

接続を作成する

次のオプションのいずれかを選択します。

コンソール

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. 接続を作成するには、[ データを追加] をクリックし、続いて [外部データソースへの接続] をクリックします。

  3. [接続タイプ] リストで、[Apache Spark] を選択します。

  4. [接続 ID] に、接続の名前を入力します(例: spark_connection)。

  5. [データのロケーション] リストでリージョンを選択します。

    接続は、BigQuery をサポートするリージョンとマルチリージョンで作成できます。詳しくは、ロケーションに関する留意事項をご覧ください。

  6. 省略可: [Metastore サービス] リストから [Dataproc Metastore] を選択します。

  7. 省略可: [履歴サーバー クラスタ] に、Dataproc の永続履歴サーバーを入力します。

  8. [接続を作成] をクリックします。

  9. [接続へ移動] をクリックします。

  10. [接続情報] ペインで、次の手順で使用するサービス アカウント ID をコピーします。

bq

  1. コマンドライン環境で、bq mk コマンドを使用して接続を作成します。

    bq mk --connection --connection_type='SPARK' \
     --properties=PROPERTIES \
     --project_id=PROJECT_ID \
     --location=LOCATION
     CONNECTION_ID
    

    次のように置き換えます。

    • PROPERTIES: JSON 形式で接続固有のパラメータを指定する Key-Value ペア

      次に例を示します。

      --properties='{
      "metastoreServiceConfig": {"metastoreService": "METASTORE_SERVICE_NAME"},
      "sparkHistoryServerConfig": {"dataprocCluster": "DATAPROC_CLUSTER_NAME"}
      }'
      

      次のように置き換えます。

    • PROJECT_ID: 実際の Google Cloud プロジェクト ID

    • LOCATION: 接続を保存するロケーション(例: US

    • CONNECTION_ID: 接続 ID(例: myconnection)。

      Google Cloud コンソールで接続の詳細を表示する場合、接続 ID は接続 ID に表示される完全修飾接続 ID の最後のセクションの値です。例: projects/.../locations/.../connections/myconnection

  2. 別の手順で必要になるため、そのサービス アカウント ID を取得してコピーします。

    bq show --location=LOCATION --connection PROJECT_ID.LOCATION.CONNECTION_ID
    

    出力は次のようになります。

    Connection myproject.us.myconnection
    
           name           type                    properties
    ---------------------- ------- ---------------------------------------------------
    myproject.us.myconnection  SPARK   {"serviceAccountId": "bqserver@example.iam.gserviceaccount.com"}
    

接続を管理する方法については、接続を管理するをご覧ください。

サービス アカウントへのアクセスを許可する

Apache Spark のストアド プロシージャが Google Cloud リソースにアクセスできるようにするには、ストアド プロシージャの接続に関連付けられているサービス アカウントに、必要な IAM 権限を付与する必要があります。または、データアクセスにカスタム サービス アカウントを使用することもできます。

  • BigQuery との間でデータを読み書きするには、サービス アカウントに次の IAM 権限を付与する必要があります。

    • BigQuery テーブルに対する bigquery.tables.*
    • プロジェクトに対する bigquery.readsessions.*

    roles/bigquery.admin IAM ロールには、サービス アカウントが BigQuery との間でデータの読み書きを行うために必要な権限が含まれています。

  • Cloud Storage との間でデータの読み書きを行うには、サービス アカウントに Cloud Storage オブジェクトに対する storage.objects.* 権限を付与する必要があります。

    roles/storage.objectAdmin IAM ロールには、サービス アカウントが Cloud Storage との間でデータの読み書きを行うために必要な権限が含まれています。

  • 接続の作成時に Dataproc Metastore を指定し、BigQuery でメタストア構成の詳細を取得する場合、サービス アカウントに Dataproc Metastore に対する metastore.services.get 権限を付与する必要があります。

    事前定義の roles/metastore.metadataViewer ロールには、サービス アカウントがメタストア構成の詳細を取得するために必要な権限が含まれています。

    また、サービス アカウントに Cloud Storage バケットに対する roles/storage.objectAdmin ロールを付与して、ストアド プロシージャが Dataproc Metastore(hive.metastore.warehouse.dir)の Hive ウェアハウス ディレクトリにアクセスできるようにする必要があります。ストアド プロシージャがメタストアに対してオペレーションを実行する場合は、さらに権限の付与が必要になることがあります。Dataproc Metastore の IAM ロールと権限の詳細については、Dataproc Metastore の事前定義ロールと権限をご覧ください。

  • 接続の作成時に Dataproc 永続履歴サーバーを指定する場合は、サービス アカウントに次のロールを付与する必要があります。

    • dataproc.clusters.get 権限を含む Dataproc 永続履歴サーバーの roles/dataproc.viewer ロール。
    • Dataproc 永続履歴サーバーの作成時にプロパティ spark:spark.history.fs.logDirectory に指定した Cloud Storage バケットに対する roles/storage.objectAdmin ロール。

    詳細については、Dataproc 永続履歴サーバーDataproc のロールと権限をご覧ください。

ユーザーと接続を共有する

次のロールを付与することで、ユーザーがデータをクエリして接続を管理できます。

  • roles/bigquery.connectionUser: ユーザーが接続を使用して外部データソースに接続し、クエリを実行できるようにします。

  • roles/bigquery.connectionAdmin: ユーザーが接続を管理できるようにします。

BigQuery での IAM のロールと権限について詳しくは、事前定義ロールと権限をご覧ください。

次のオプションのいずれかを選択します。

コンソール

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

    接続は、プロジェクトで外部接続というグループに一覧表示されます。

  2. [エクスプローラ] ペインで、[プロジェクト名] > [外部接続] > [接続] の順にクリックします。

  3. [詳細] ペインで、[共有] をクリックして接続を共有します。次に、以下の操作を行います。

    1. [接続の権限] ダイアログで、プリンシパルを追加または編集して、他のプリンシパルと接続を共有します。

    2. [保存] をクリックします。

bq

bq コマンドライン ツールを使用して接続を共有することはできません。接続を共有するには、Google Cloud コンソールまたは BigQuery Connections API メソッドを使用します。

API

BigQuery Connections REST API の projects.locations.connections.setIAM メソッドを使用して、policy リソースのインスタンスを指定します。

Java

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

import com.google.api.resourcenames.ResourceName;
import com.google.cloud.bigquery.connection.v1.ConnectionName;
import com.google.cloud.bigqueryconnection.v1.ConnectionServiceClient;
import com.google.iam.v1.Binding;
import com.google.iam.v1.Policy;
import com.google.iam.v1.SetIamPolicyRequest;
import java.io.IOException;

// Sample to share connections
public class ShareConnection {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String location = "MY_LOCATION";
    String connectionId = "MY_CONNECTION_ID";
    shareConnection(projectId, location, connectionId);
  }

  static void shareConnection(String projectId, String location, String connectionId)
      throws IOException {
    try (ConnectionServiceClient client = ConnectionServiceClient.create()) {
      ResourceName resource = ConnectionName.of(projectId, location, connectionId);
      Binding binding =
          Binding.newBuilder()
              .addMembers("group:example-analyst-group@google.com")
              .setRole("roles/bigquery.connectionUser")
              .build();
      Policy policy = Policy.newBuilder().addBindings(binding).build();
      SetIamPolicyRequest request =
          SetIamPolicyRequest.newBuilder()
              .setResource(resource.toString())
              .setPolicy(policy)
              .build();
      client.setIamPolicy(request);
      System.out.println("Connection shared successfully");
    }
  }
}

次のステップ