Dataproc에서 BigQuery metastore 사용

이 문서에서는 Compute Engine의 Dataproc에서 BigQuery 메타스토어를 사용하는 방법을 설명합니다. 이 연결을 통해 Apache Spark와 같은 오픈소스 소프트웨어 엔진에서 작동하는 단일 공유 메타스토어를 사용할 수 있습니다.

시작하기 전에

  1. Google Cloud 프로젝트에 결제를 사용 설정합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.
  2. BigQuery 및 Dataproc API를 사용 설정합니다.

    API 사용 설정

  3. 선택사항: BigQuery 메타스토어의 작동 방식과 이를 사용해야 하는 이유를 알아봅니다.

필요한 역할

BigQuery Metastore를 메타데이터 저장소로 사용하여 Spark 및 Dataproc를 사용하는 데 필요한 권한을 얻으려면 관리자에게 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

일반 워크플로

Compute Engine에서 BigQuery 메타스토어와 함께 Dataproc를 사용하려면 다음과 같은 일반적인 단계를 따르세요.

  1. Dataproc 클러스터를 만들거나 기존 클러스터를 구성합니다.
  2. Spark와 같은 선호하는 오픈소스 소프트웨어 엔진에 연결합니다.
  3. JAR 파일을 사용하여 클러스터에 Apache Iceberg 카탈로그 플러그인을 설치합니다.
  4. 사용 중인 오픈소스 소프트웨어 엔진에 따라 필요에 따라 BigQuery 메타스토어 리소스를 만들고 관리합니다.
  5. BigQuery에서 BigQuery 메타스토어 리소스에 액세스하고 이를 사용합니다.

BigQuery 메타스토어를 Spark에 연결

다음 안내에서는 대화형 Spark SQL을 사용하여 Dataproc를 BigQuery 메타스토어에 연결하는 방법을 보여줍니다.

Iceberg 카탈로그 플러그인 다운로드

BigQuery 메타스토어를 Dataproc 및 Spark에 연결하려면 BigQuery 메타스토어 Iceberg 카탈로그 플러그인 jar 파일을 사용해야 합니다.

이 파일은 Dataproc 이미지 버전 2.2에 기본적으로 포함되어 있습니다. Dataproc 클러스터가 인터넷에 직접 액세스할 수 없는 경우 플러그인을 다운로드하여 Dataproc 클러스터가 액세스할 수 있는 Cloud Storage 버킷에 업로드해야 합니다.

BigQuery 메타스토어 Apache Iceberg 카탈로그 플러그인을 다운로드합니다.

Dataproc 클러스터 구성

BigQuery 메타스토어에 연결하기 전에 Dataproc 클러스터를 설정해야 합니다.

이렇게 하려면 새 클러스터를 만들거나 기존 클러스터를 사용하면 됩니다. 그런 다음 이 클러스터를 사용하여 대화형 Spark SQL을 실행하고 BigQuery 메타스토어 리소스를 관리합니다.

  • 클러스터가 생성된 리전의 서브넷에 비공개 Google 액세스 (PGA)가 사용 설정되어 있어야 합니다. 기본적으로 2.2 (기본값) 이상 이미지 버전으로 생성된 Dataproc 클러스터 VM에는 내부 IP 주소만 있습니다. 클러스터 VM이 Google API와 통신할 수 있도록 하려면 클러스터가 생성된 리전의 default (또는 해당하는 경우 사용자 지정 네트워크 이름) 네트워크 서브넷에서 비공개 Google 액세스를 사용 설정합니다.

  • 이 가이드의 Zeppelin 웹 인터페이스 예시를 실행하려면 Zeppelin 선택적 구성요소가 사용 설정된 Dataproc 클러스터를 사용하거나 만들어야 합니다.

새 클러스터

새 Dataproc 클러스터를 만들려면 다음 gcloud dataproc clusters create 명령어를 실행합니다. 이 구성에는 BigQuery 메타스토어를 사용하는 데 필요한 설정이 포함되어 있습니다.

gcloud dataproc clusters create CLUSTER_NAME \
  --project=PROJECT_ID \
  --region=LOCATION \
  --optional-components=ZEPPELIN \
  --enable-component-gateway \
  --single-node

다음을 바꿉니다.

  • CLUSTER_NAME: Dataproc 클러스터의 이름입니다.
  • PROJECT_ID: 클러스터를 만드는 Google Cloud 프로젝트의 ID입니다.
  • LOCATION: 클러스터를 만드는 Google Cloud 리전입니다.

기존 클러스터

기존 클러스터를 구성하려면 다음 Iceberg Spark 런타임을 클러스터에 추가합니다.

org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.5.2

다음 옵션 중 하나를 사용하여 런타임을 추가할 수 있습니다.

Spark 작업 제출

Spark 작업을 제출하려면 다음 방법 중 하나를 사용하세요.

gcloud CLI

gcloud dataproc jobs submit spark-sql \
--project=PROJECT_ID \
--cluster=CLUSTER_NAME \
--region==REGION \
--jars=https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.5.2/iceberg-spark-runtime-3.5_2.12-1.5.2.jar,gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.5.2-1.0.0-beta.jar \
--properties=spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog, \
spark.sql.catalog.CATALOG_NAME.catalog-impl=org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog, \
spark.sql.catalog.CATALOG_NAME.gcp_project=PROJECT_ID, \
spark.sql.catalog.CATALOG_NAME.gcp_location=LOCATION, \
spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_DIRECTORY \
--execute="SPARK_SQL_COMMAND"

다음을 바꿉니다.

  • PROJECT_ID: Dataproc 클러스터가 포함된 Google Cloud 프로젝트의 ID입니다.
  • CLUSTER_NAME: Spark SQL 작업을 실행하는 데 사용 중인 Dataproc 클러스터의 이름입니다.
  • REGION: 클러스터가 있는 Compute Engine 리전입니다.
  • LOCATION: BigQuery 리소스의 위치입니다.
  • CATALOG_NAME: SQL 작업과 함께 사용하는 Spark 카탈로그의 이름입니다.
  • WAREHOUSE_DIRECTORY: 데이터 웨어하우스가 포함된 Cloud Storage 폴더입니다. 이 값은 gs://로 시작합니다.
  • SPARK_SQL_COMMAND: 실행하려는 Spark SQL 쿼리입니다. 이 쿼리에는 리소스를 만드는 명령어가 포함되어 있습니다. 예를 들어 네임스페이스와 테이블을 만드는 경우

대화형 Spark

Spark에 연결하고 카탈로그 플러그인을 설치합니다.

BigQuery 메타스토어의 카탈로그 플러그인을 설치하려면 SSH를 사용하여 Dataproc 클러스터에 연결합니다.

  1. Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.
  2. Dataproc VM 인스턴스에 연결하려면 가상 머신 인스턴스 목록에서 SSH를 클릭합니다. 출력은 다음과 비슷합니다.

    Connected, host fingerprint: ssh-rsa ...
    Linux cluster-1-m 3.16.0-0.bpo.4-amd64 ...
    ...
    example-cluster@cluster-1-m:~$
    
  3. 터미널에서 다음 BigQuery 메타스토어 초기화 명령어를 실행합니다.

    spark-sql \
    --jars https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.5.2/iceberg-spark-runtime-3.5_2.12-1.5.2.jar,gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.5.2-1.0.0-beta.jar \
    --conf spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.CATALOG_NAME.catalog-impl=org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog \
    --conf spark.sql.catalog.CATALOG_NAME.gcp_project=PROJECT_ID \
    --conf spark.sql.catalog.CATALOG_NAME.gcp_location=LOCATION \
    --conf spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_DIRECTORY

    다음을 바꿉니다.

    • CATALOG_NAME: SQL 작업과 함께 사용하는 Spark 카탈로그의 이름입니다.
    • PROJECT_ID: Spark 카탈로그가 연결된 BigQuery 메타스토어 카탈로그의 Google Cloud 프로젝트 ID입니다.
    • LOCATION: BigQuery 메타스토어의 Google Cloud 위치입니다.
    • WAREHOUSE_DIRECTORY: 데이터 웨어하우스가 포함된 Cloud Storage 폴더입니다. 이 값은 gs://로 시작합니다.

    클러스터에 연결하면 Spark 터미널에 spark-sql 프롬프트가 표시됩니다.

    spark-sql (default)>
    

BigQuery metastore 리소스 관리

이제 BigQuery 메타스토어에 연결되었습니다. BigQuery 메타스토어에 저장된 메타데이터를 기반으로 기존 리소스를 보거나 새 리소스를 만들 수 있습니다.

예를 들어 대화형 Spark SQL 세션에서 다음 명령어를 실행하여 Iceberg 네임스페이스와 테이블을 만듭니다.

  • 맞춤 Iceberg 카탈로그를 사용합니다.

    USE `CATALOG_NAME`;
  • 네임스페이스를 만듭니다.

    CREATE NAMESPACE IF NOT EXISTS NAMESPACE_NAME;
  • 생성된 네임스페이스를 사용합니다.

    USE NAMESPACE_NAME;
  • Iceberg 테이블을 만듭니다.

    CREATE TABLE TABLE_NAME (id int, data string) USING ICEBERG;
  • 표 행을 삽입합니다.

    INSERT INTO TABLE_NAME VALUES (1, "first row");
  • 테이블 열을 추가합니다.

    ALTER TABLE TABLE_NAME ADD COLUMNS (newDoubleCol double);
  • 테이블 메타데이터 보기

    DESCRIBE EXTENDED TABLE_NAME;
  • 네임스페이스의 테이블을 나열합니다.

    SHOW TABLES;

Zeppelin 노트북

  1. Google Cloud 콘솔에서 Dataproc 클러스터 페이지로 이동합니다.

    Dataproc 클러스터로 이동

  2. 사용할 클러스터의 이름을 클릭합니다.

    클러스터 세부정보 페이지가 열립니다.

  3. 탐색 메뉴에서 웹 인터페이스를 클릭합니다.

  4. 구성요소 게이트웨이에서 Zeppelin을 클릭합니다. Zeppelin 노트북 페이지가 열립니다.

  5. 탐색 메뉴에서 Notebook을 클릭한 다음 +새 메모 만들기를 클릭합니다.

  6. 대화상자에 노트북 이름을 입력합니다. 기본 인터프리터로 Spark를 선택한 상태로 둡니다.

  7. 만들기를 클릭합니다. 새 메모장이 생성됩니다.

  8. 노트북에서 설정 메뉴를 클릭한 다음 해석기를 클릭합니다.

  9. Search interpreters(해석기 검색) 필드에서 Spark를 검색합니다.

  10. 수정을 클릭합니다.

  11. Spark.jars 필드에 Spark jar의 URI를 입력합니다.

    https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.5.2/iceberg-spark-runtime-3.5_2.12-1.5.2.jar,gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.5.2-1.0.0-beta.jar
    
  12. 저장을 클릭합니다.

  13. 확인을 클릭합니다.

  14. 다음 PySpark 코드를 Zeppelin 노트북에 복사합니다.

    %pyspark
    from pyspark.sql import SparkSession
    spark = SparkSession.builder \
    .appName("BigQuery Metastore Iceberg") \
    .config("spark.sql.catalog.CATALOG_NAME", "org.apache.iceberg.spark.SparkCatalog") \
    .config("spark.sql.catalog.CATALOG_NAME.catalog-impl", "org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog") \
    .config("spark.sql.catalog.CATALOG_NAME.gcp_project", "PROJECT_ID") \
    .config("spark.sql.catalog.CATALOG_NAME.gcp_location", "LOCATION") \
    .config("spark.sql.catalog.CATALOG_NAME.warehouse", "WAREHOUSE_DIRECTORY") \
    .getOrCreate()
    spark.sql("select version()").show()
    spark.sql("USE `CATALOG_NAME`;")
    spark.sql("CREATE NAMESPACE IF NOT EXISTS NAMESPACE_NAME;")
    spark.sql("USE NAMESPACE_NAME;")
    spark.sql("CREATE TABLE TABLE_NAME (id int, data string) USING ICEBERG;")
    spark.sql("DESCRIBE TABLE_NAME;").show()

    다음을 바꿉니다.

    • CATALOG_NAME: SQL 작업에 사용할 Spark 카탈로그의 이름입니다.
    • PROJECT_ID: Dataproc 클러스터가 포함된 Google Cloud 프로젝트의 ID입니다.
    • WAREHOUSE_DIRECTORY: 데이터 웨어하우스가 포함된 Cloud Storage 폴더입니다. 이 값은 gs://로 시작합니다.
    • NAMESPACE_NAME: Spark 테이블을 참조하는 네임스페이스 이름입니다.
    • WAREHOUSE_DIRECTORY: 데이터 웨어하우스가 저장된 Cloud Storage 폴더의 URI입니다.
    • TABLE_NAME: Spark 테이블의 테이블 이름입니다.
  15. 실행 아이콘을 클릭하거나 Shift-Enter 키를 눌러 코드를 실행합니다. 작업이 완료되면 상태 메시지에 'Spark Job Finished'(Spark 작업 완료됨)가 표시되고 출력에 테이블 콘텐츠가 표시됩니다.

다음 단계