連線至 Apache Spark

BigQuery 中的 Apache Spark 連線可讓使用者將 BigQuery 連結至 Managed Service for Apache Spark,以便執行 Apache Spark 預存程序。您可以建立這項連線、將必要權限授予其服務帳戶,並與使用者共用連線。

事前準備

位置注意事項

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

多區域

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

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

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

單一地區

單一區域中的連線只能參照同一區域中的 Google Cloud資源。例如,單一區域 us-east4 中的連線只能參照 us-east4 中的 Spark 記錄伺服器或 Dataproc metastore。

建立連線

選取下列選項之一:

控制台

  1. 前往「BigQuery」頁面

    前往「BigQuery」

  2. 在「Explorer」窗格中,點選「 新增資料」。

    「新增資料」對話方塊隨即開啟。

  3. 在「篩選依據」窗格的「資料來源類型」部分,選取「業務應用程式」。

    或者,您也可以在「Search for data sources」(搜尋資料來源) 欄位中輸入 Spark。

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

  5. 點選「Apache Spark: BigQuery Federation」解決方案資訊卡。

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

    • 在「Connection type」(連線類型) 清單中,選取「Apache Spark」。

    • 在「Connection ID」(連線 ID) 欄位中,輸入連線名稱,例如 spark_connection。

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

    您可以在支援 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": "MANAGED_SERVICE_FOR_APACHE_SPARK_CLUSTER_NAME"}
      }'
      

      更改下列內容:

    • PROJECT_ID:您的 Google Cloud 專案 ID

    • LOCATION:要儲存連線的位置,例如 US

    • CONNECTION_ID:連線 ID,例如 myconnection

      在 Google Cloud 控制台中查看連線詳細資料時,連線 ID 是「Connection 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,則必須在 Dataproc Metastore 上授予服務帳戶 metastore.services.get 權限,BigQuery 才能擷取 metastore 設定的詳細資料。

    預先定義的 roles/metastore.metadataViewer 角色包含服務帳戶所需的權限,可擷取 metastore 設定的詳細資料。

    您也必須為服務帳戶授予 Cloud Storage bucket 的 roles/storage.objectAdmin 角色,預存程序才能存取 Dataproc metastore (hive.metastore.warehouse.dir) 的 Hive 倉儲目錄。如果預存程序會對 metastore 執行作業,您可能需要授予其他權限。如要進一步瞭解 Dataproc Metastore 的 IAM 角色和權限,請參閱「Dataproc Metastore 預先定義的角色和權限」。

  • 如果您在建立連線時指定 Managed Service for Apache Spark 永久記錄伺服器,則須將下列角色授予服務帳戶:

    • Managed Service for Apache Spark Persistent History Server 的 roles/dataproc.viewer 角色,其中包含 dataproc.clusters.get 權限。
    • 建立 Managed Service for Apache Spark Persistent History Server 時,為 spark:spark.history.fs.logDirectory 屬性指定的 Cloud Storage bucket roles/storage.objectAdmin 角色。

    詳情請參閱「Managed Service for Apache Spark Persistent History Server」和「Managed Service for Apache Spark 角色和權限」。

與使用者共用連線

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

  • roles/bigquery.connectionUser:可讓使用者透過連線,連至外部資料來源並執行查詢。

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

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

選取下列選項之一:

控制台

  1. 前往「BigQuery」頁面。

    前往「BigQuery」

    連線會列在專案的「連線」群組中。

  2. 點選左側窗格中的 「Explorer」。

    醒目顯示的「Explorer」窗格按鈕。

    如果沒有看到左側窗格,請按一下 「Expand left pane」(展開左側窗格),開啟窗格。

  3. 依序點選專案和「連線」,然後選取連線。

  4. 在「詳細資料」窗格中,按一下「共用」即可共用連線。接著,按照下列步驟操作:

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

後續步驟