連線至 Apache Spark

身為 BigQuery 管理員,您可以建立連線,讓資料分析師執行 Apache Spark 的已儲存程序

事前準備

位置注意事項

選擇資料的位置時,請考慮下列事項:

多區域

您必須指定位於相同大地理區域的 Google Cloud 資源:

  • BigQuery US 多區域中的連線可以參照美國地理區域中任何單一區域的 Spark 記錄伺服器 Dataproc Metastore,例如 us-central1us-east4us-west2

  • BigQuery 歐盟多區域中的連線可以參照歐盟成員國 (例如 europe-north1europe-west3) 中的 Spark 記錄伺服器或 Dataproc Metastore。

單一地區

單一區域中的連線只能參照同區域的 Google Cloud資源。舉例來說,單一區域 us-east4 中的連線只能參照 us-east4 中的 Spark History Server 或 Dataproc Metastore。

建立連線

選取下列選項之一:

控制台

  1. 前往「BigQuery」頁面

    前往 BigQuery

  2. 在「Explorer」窗格中,按一下 「Add data」

    「Add data」對話方塊隨即開啟。

  3. 在「Filter By」窗格中的「Data Source Type」部分,選取「Databases」

    或者,您也可以在「Search for data sources」欄位中輸入 Spark

  4. 在「精選資料來源」部分,按一下「Apache Spark」

  5. 按一下「Apache Spark: BigQuery Federation」解決方案資訊卡。

  6. 在「外部資料來源」窗格中,輸入以下資訊:

    • 在「Connection type」清單中,選取「Apache Spark」

    • 在「連線 ID」欄位中,輸入連線的名稱,例如 spark_connection

    • 在「資料位置」清單中選取區域。

    您可以在支援 BigQuery 的地區和多區域中建立連線。詳情請參閱「位置注意事項」。

  7. 點選「建立連線」

  8. 按一下「前往連線」

  9. 在「連線資訊」窗格中,複製服務帳戶 ID,以便在後續步驟中使用。

bq

  1. 在指令列環境中,使用 bq mk 指令建立連線:

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

    更改下列內容:

    • PROPERTIES:鍵/值組合,可用 JSON 格式提供連線專屬參數

      例如:

      --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,因為您在其他步驟中會用到這個 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,則需要為服務帳戶授予 Dataproc Metastore 的 metastore.services.get 權限,才能讓 BigQuery 擷取中繼資料庫設定的詳細資料。

    預先定義的 roles/metastore.metadataViewer 角色包含服務帳戶需要的權限,才能擷取元資料儲存庫設定的詳細資料。

    您還需要授予服務帳戶 Cloud Storage 值區的 roles/storage.objectAdmin 角色,讓儲存程序可以存取 Dataproc Metastore (hive.metastore.warehouse.dir) 的 Hive 倉庫目錄。如果儲存程序在元資料庫上執行作業,您可能需要提供額外權限。如要進一步瞭解 Dataproc Metastore 中的身分與存取權管理角色和權限,請參閱「Dataproc Metastore 預先定義的角色和權限」。

  • 如果您在建立連線時指定 Dataproc 永久記錄伺服器,則需要將下列角色授予服務帳戶:

    • Dataproc 永久記錄伺服器上的 roles/dataproc.viewer 角色,包含 dataproc.clusters.get 權限。
    • 建立 Dataproc 永久記錄伺服器時,您為屬性 spark:spark.history.fs.logDirectory 指定的 Cloud Storage 值區的 roles/storage.objectAdmin 角色。

    詳情請參閱「Dataproc 永久記錄伺服器」和「Dataproc 角色和權限」。

與使用者分享連線

您可以授予下列角色,讓使用者查詢資料及管理連線:

  • roles/bigquery.connectionUser:可讓使用者使用連線連結外部資料來源,並對這些資料來源執行查詢。

  • roles/bigquery.connectionAdmin:讓使用者管理連線。

如要進一步瞭解 BigQuery 中的 IAM 角色和權限,請參閱「預先定義的角色與權限」一文。

選取下列選項之一:

主控台

  1. 前往「BigQuery」頁面

    前往 BigQuery

    連線會列在專案中,位於名為「External connections」的群組中。

  2. 在「Explorer」窗格中,依序點選「專案名稱」>「外部連線」>「連線」

  3. 在「Details」窗格中,按一下「Share」,即可分享連線。接著,按照下列步驟操作:

    1. 在「Connection permissions」對話方塊中,新增或編輯主體,與其他主體共用連線。

    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");
    }
  }
}

後續步驟