連線至 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」(資料來源類型) 區段中,選取「Databases」(資料庫)

    或者,您也可以在「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角色會建立 Dataproc 持續性記錄伺服器。spark:spark.history.fs.logDirectory

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

與使用者共用連線

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

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

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

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

選取下列選項之一:

主控台

  1. 前往「BigQuery」頁面

    前往 BigQuery

    連線會列在專案的「External connections」(外部連線) 群組中。

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

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

後續步驟