連線至 Apache Spark

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

事前準備

位置注意事項

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

多區域

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

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

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

單一地區

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

建立連結

選取下列選項之一:

控制台

  1. 前往「BigQuery」頁面

    前往「BigQuery」

  2. 在「Explorer」窗格中,按一下「新增資料」

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

  3. 在「Filter By」(篩選依據) 窗格的「Data Source Type」(資料來源類型) 區段中,選取「Business Applications」(商用應用程式)

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

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

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

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

    • 在「連線類型」清單中,選取「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,因為您會在另一個步驟中用到:

    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 的預存程序存取資源,您必須授予與預存程序連線相關聯的服務帳戶必要 IAM 權限。 Google Cloud或者,您也可以使用自訂服務帳戶存取資料。

  • 如要從 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 角色包含服務帳戶所需的權限,可擷取中繼資料存放區設定的詳細資料。

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

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

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

    詳情請參閱 Dataproc 持續性記錄伺服器Dataproc 角色與權限

與使用者共用連線

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

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

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

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

選取下列選項之一:

控制台

  1. 前往「BigQuery」頁面

    前往「BigQuery」

    連線會列在專案中,位於「連線」群組。

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

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

    如果沒有看到左側窗格,請按一下「展開左側窗格」圖示 開啟窗格。

  3. 按一下專案,然後依序點選「連線」和所需連線。

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

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

後續步驟