Apache Spark에 연결

BigQuery 관리자는 데이터 분석가가 Apache Spark의 저장 프로시저를 실행하도록 연결을 만들 수 있습니다.

시작하기 전에

위치 고려사항

데이터 위치를 선택할 때는 다음 사항을 고려해야 합니다.

멀티 리전

동일한 넓은 지리적 지역에 있는 Google Cloud 리소스를 지정해야 합니다.

  • BigQuery US 멀티 리전의 연결은 us-central1, us-east4, us-west2 등 미국 내 어느 단일 리전의 Spark 기록 서버 또는 Dataproc Metastore를 참조할 수 있습니다.

  • BigQuery EU 멀티 리전의 연결은 europe-north1 또는 europe-west3 등 유럽 연합 회원국의 Spark 기록 서버 또는 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 형식으로 연결별 매개변수를 제공하는 키-값 쌍입니다.

      예를 들면 다음과 같습니다.

      --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 역할에는 서비스 계정이 메타스토어 구성에 대한 세부정보를 검색하는 데 필요한 권한이 포함되어 있습니다.

    또한 저장 프로시져가 Dataproc Metastore(hive.metastore.warehouse.dir)의 Hive 웨어하우스 디렉터리에 액세스할 수 있도록 서비스 계정에 Cloud Storage 버킷에 대한 roles/storage.objectAdmin 역할을 부여해야 합니다. 저장 프로시져가 메타스토어에서 작업을 수행하는 경우 추가 권한을 부여해야 할 수 있습니다. 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 연결 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");
    }
  }
}

다음 단계