Dataproc에서 Apache Hive 사용하기

Last reviewed 2022-04-06 UTC

이 튜토리얼에서는 Dataproc에서 효율적이고 유연한 방식으로 Apache Hive를 사용하여 Hive 데이터를 Cloud Storage에 저장하고 Hive 메타스토어를 Cloud SQLMySQL 데이터베이스에 저장하는 방법을 보여줍니다. 컴퓨팅 리소스와 스토리지 리소스를 분리하면 다음과 같은 장점이 있습니다.

  • 유연성과 민첩성: 특정 Hive 워크로드에 맞게 클러스터 구성을 맞춤화하고 필요에 따라 각 클러스터를 독립적으로 확장 및 축소할 수 있습니다.
  • 비용 절감: Hive 작업을 실행해야 할 때 임시 클러스터를 가동하고 작업이 완료되면 삭제할 수 있습니다. 작업에 필요한 리소스는 사용 중에만 활성화되므로 사용한 만큼만 지불하면 됩니다. 선점형 VM을 사용하여 중요하지 않은 데이터를 처리하거나 총 비용을 낮추면서 매우 큰 클러스터를 만들 수도 있습니다.

Hive는 Apache Hadoop을 기반으로 구축된 널리 사용되는 오픈소스 데이터 웨어하우스입니다. Hive가 제공하는 HiveQL이라는 SQL 스타일의 쿼리 언어를 사용하여 구조화된 대규모 데이터 세트를 분석할 수 있습니다. Hive 메타스토어는 Hive 테이블에 대한 스키마, 위치 등의 메타데이터를 보유합니다. MySQL이 Hive 메타스토어의 백엔드로 흔히 사용되는 경우 Cloud SQL을 사용하면 Google Cloud에서 관계형 데이터베이스를 손쉽게 설정, 유지, 관리할 수 있습니다.

목표

  • Cloud SQL에 Hive 메타스토어에 사용할 MySQL 인스턴스를 만듭니다.
  • Dataproc에 Hive 서버를 배포합니다.
  • Dataproc 클러스터 인스턴스에 Cloud SQL 프록시를 설치합니다.
  • Cloud Storage에 Hive 데이터를 업로드합니다.
  • 여러 Dataproc 클러스터에서 Hive 쿼리를 실행합니다.

비용

이 튜토리얼에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

  • Dataproc
  • Cloud Storage
  • Cloud SQL

가격 계산기를 사용하여 예상 사용량을 기준으로 예상 비용을 산출할 수 있습니다.

Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

새 프로젝트 만들기

  1. Google Cloud Console에서 프로젝트 선택기 페이지로 이동합니다.

    프로젝트 선택기로 이동

  2. Google Cloud 프로젝트를 선택하거나 만듭니다.

결제 사용 설정

환경 초기화

  1. Cloud Shell 인스턴스를 시작합니다.

    Cloud Shell로 이동

  2. Cloud Shell에서 기본 Compute Engine 영역을 Dataproc 클러스터를 만들려는 영역으로 설정합니다.

    export PROJECT=$(gcloud info --format='value(config.project)')
    export REGION=REGION
    export ZONE=ZONE
    gcloud config set compute/zone ${ZONE}

    다음을 바꿉니다.

    • REGION: us-central1과 같은 클러스터를 만들려는 리전입니다.
    • ZONE: us-central1-a와 같은 클러스터를 만들려는 영역입니다.
  3. Cloud Shell에서 다음 명령어를 실행하여 Dataproc 및 Cloud SQL Admin API를 사용 설정합니다.

    gcloud services enable dataproc.googleapis.com sqladmin.googleapis.com

참조 아키텍처

이 튜토리얼에서는 편의상 모든 컴퓨팅 및 스토리지 서비스를 동일한 Google Cloud 리전에 배포하여 네트워크 지연 시간과 네트워크 전송 비용을 최소화합니다. 그림 1은 이 튜토리얼의 아키텍처를 보여줍니다.

단일 리전 아키텍처의 다이어그램
그림 1. 단일 리전 Hive 아키텍처의 예시

이 아키텍처에서 Hive 쿼리의 수명 주기는 다음과 같은 단계를 따릅니다.

  1. Hive 클라이언트에서 임시 Dataproc 클러스터에서 실행되는 Hive 서버로 쿼리를 제출합니다.
  2. 서버는 쿼리를 처리하고 메타스토어 서비스에 메타데이터를 요청합니다.
  3. 메타스토어 서비스는 Cloud SQL 프록시를 통해 Cloud SQL에서 Hive 메타데이터를 가져옵니다.
  4. 서버는 Cloud Storage의 지역 내 버킷에 위치한 Hive 웨어하우스에서 데이터를 로드합니다.
  5. 서버가 클라이언트로 결과를 반환합니다.

다중 지역 아키텍처의 고려 사항

이 튜토리얼에서는 단일 지역 아키텍처에 중점을 둡니다. 그러나 여러 지리적 장소에서 Hive 서버를 실행해야 하는 경우 멀티 리전 아키텍처를 고려할 수 있습니다. 이 경우 메타스토어 서비스를 전담하여 호스팅하고 Cloud SQL 인스턴스와 동일한 리전에 있는 별도의 Dataproc 클러스터를 만들어야 합니다. 메타스토어 서비스는 때때로 MySQL 데이터베이스에 대용량 요청을 보낼 수 있으므로, 성능 저하를 최소화하기 위해 메타스토어 서비스를 MySQL 데이터베이스에 지리적으로 가까이 두는 것이 중요합니다. 일반적으로 Hive 서버가 메타스토어 서비스로 보내는 요청은 이보다 훨씬 적습니다. 따라서 Hive 서버와 메타스토어 서비스가 서로 다른 리전에 있어도 지연 시간은 증가하지만 크게 문제가 되지 않을 가능성이 높습니다.

메타스토어 서비스는 워커 노드가 아닌 Dataproc 마스터 노드에서만 실행될 수 있습니다. Dataproc은 표준 클러스터 및 고가용성 클러스터에 최소 2개의 워커 노드를 의무적으로 둡니다. 사용하지 않는 워커 노드로 인한 리소스 낭비를 방지하려면 메타스토어 서비스용으로 단일 노드 클러스터를 만들면 됩니다. 가용성을 높이려는 경우 단일 노드 클러스터를 여러 개 만들 수 있습니다.

메타스토어 서비스 클러스터만 Cloud SQL 인스턴스에 직접 연결하면 되므로 메타스토어 서비스 클러스터에만 Cloud SQL 프록시를 설치하면 됩니다. 그런 다음 Hive 서버가 메타스토어 서비스 클러스터를 가리키도록 hive.metastore.uris 속성을 쉼표로 구분된 URI 목록으로 설정합니다. 예를 들면 다음과 같습니다.

thrift://metastore1:9083,thrift://metastore2:9083

여러 장소에 위치한 Hive 서버에서 Hive 데이터에 액세스해야 하는 경우 이중 리전 또는 멀티 리전 버킷 사용을 고려할 수도 있습니다. 여러 다른 버킷 위치 유형 중에서 선택할 때는 사용 사례를 고려해야 합니다. 지연 시간, 가용성, 비용의 균형점을 찾아야 합니다.

그림 2에서는 다중 지역 아키텍처의 예를 보여줍니다.

멀티 리전 Hive 아키텍처의 다이어그램
그림 2. 멀티 리전 Hive 아키텍처의 예시

위에서 볼 수 있듯이 멀티 리전 시나리오는 약간 더 복잡합니다. 이 가이드에서는 편의상 단일 위치 아키텍처를 사용합니다.

(선택사항) 웨어하우스 버킷 만들기

Hive 데이터를 저장할 Cloud Storage 버킷이 없으면 웨어하우스 버킷을 만들고(Cloud Shell에서 다음 명령어 실행) BUCKET_NAME을 고유한 버킷 이름으로 바꿉니다.

export WAREHOUSE_BUCKET=BUCKET_NAME
gsutil mb -l ${REGION} gs://${WAREHOUSE_BUCKET}

Cloud SQL 인스턴스 만들기

이 섹션에서는 이후에 Hive 메타스토어를 호스팅하는 데 사용될 새 Cloud SQL 인스턴스를 만듭니다.

Cloud Shell에서 새 Cloud SQL 인스턴스를 만듭니다.

gcloud sql instances create hive-metastore \
    --database-version="MYSQL_5_7" \
    --activation-policy=ALWAYS \
    --zone ${ZONE}

이 명령어를 완료하는 데 몇 분이 걸릴 수 있습니다.

Dataproc 클러스터 만들기

첫 번째 Dataproc 클러스터를 만들고 CLUSTER_NAMEhive-cluster와 같은 이름으로 바꿉니다.

gcloud dataproc clusters create CLUSTER_NAME \
    --scopes sql-admin \
    --region ${REGION} \
    --initialization-actions gs://goog-dataproc-initialization-actions-${REGION}/cloud-sql-proxy/cloud-sql-proxy.sh \
    --properties "hive:hive.metastore.warehouse.dir=gs://${WAREHOUSE_BUCKET}/datasets" \
    --metadata "hive-metastore-instance=${PROJECT}:${REGION}:hive-metastore" \
    --metadata "enable-cloud-sql-proxy-on-workers=false"

참고:

  • 클러스터 인스턴스가 Cloud SQL Admin API에 액세스할 수 있도록 sql-admin 액세스 범위를 제공합니다.
  • Cloud Storage 버킷에 저장하는 스크립트에 초기화 작업을 넣고 --initialization-actions 플래그를 사용하여 해당 버킷을 참조합니다. 자세한 내용은 초기화 작업 - 중요 고려사항 및 가이드라인을 참조하세요.
  • hive:hive.metastore.warehouse.dir 속성의 Hive 웨어하우스 버킷에 URI를 제공합니다. 이렇게 하면 Hive 서버가 올바른 위치에서 읽고 쓰도록 구성됩니다. 이 속성에는 디렉터리가 최소 한 개(예: gs://my-bucket/my-directory) 이상 포함되어야 합니다. 이 속성이 디렉터리 없는 버킷 이름(예: gs://my-bucket)에 설정되어 있으면 Hive가 적절하게 작동하지 않습니다
  • Cloud SQL 프록시가 마스터 노드에서만 실행되도록 enable-cloud-sql-proxy-on-workers=false를 지정합니다. 이는 Hive 메타스토어 서비스가 작동하는 데 충분하며 Cloud SQL에서 불필요한 부하를 방지합니다.
  • Dataproc이 모든 클러스터 인스턴스에서 자동으로 실행하는 Cloud SQL 프록시 초기화 작업을 제공합니다. 이 작업은 다음을 수행합니다.

    • Cloud SQL 프록시를 설치합니다.
    • hive-metastore-instance 메타데이터 매개변수에 지정된 Cloud SQL 인스턴스에 대한 보안 연결을 설정합니다.
    • hive 사용자 및 Hive 메타스토어의 데이터베이스를 만듭니다.

    GitHub에서 Cloud SQL 프록시 초기화 작업의 전체 코드를 확인할 수 있습니다.

  • 이 튜토리얼에서는 편의상 마스터 인스턴스를 하나만 사용합니다. 프로덕션 워크로드에서는 장애 복구성을 높이기 위해 Dataproc의 고가용성 모드를 사용하여 마스터 인스턴스가 3개인 클러스터를 만드는 것이 좋습니다.

  • 이 튜토리얼에서는 공개 IP 주소와 함께 Cloud SQL 인스턴스를 사용합니다. 대신 비공개 IP 주소만 있는 인스턴스를 사용할 경우에는 --metadata "use-cloud-sql-private-ip=true" 매개변수를 전달하여 프록시가 비공개 IP 주소를 사용하도록 강제할 수 있습니다.

Hive 테이블 만들기

이 섹션에서는 웨어하우스 버킷에 샘플 데이터세트를 업로드하고, 새 Hive 테이블을 만들고, 해당 데이터세트에서 몇 가지 HiveQL 쿼리를 실행합니다.

  1. 샘플 데이터세트를 웨어하우스 버킷에 복사합니다.

    gsutil cp gs://hive-solution/part-00000.parquet \
    gs://${WAREHOUSE_BUCKET}/datasets/transactions/part-00000.parquet

    샘플 데이터베이스는 Parquet 형식으로 압축되어 있으며 세 개의 열(날짜, 금액, 거래 유형)이 있는 수천 개의 가상적인 은행 거래 기록을 포함합니다.

  2. 데이터세트에 사용할 외부 Hive 테이블을 만듭니다.

    gcloud dataproc jobs submit hive \
        --cluster CLUSTER_NAME \
        --region ${REGION} \
        --execute "
          CREATE EXTERNAL TABLE transactions
          (SubmissionDate DATE, TransactionAmount DOUBLE, TransactionType STRING)
          STORED AS PARQUET
          LOCATION 'gs://${WAREHOUSE_BUCKET}/datasets/transactions';"

Hive 쿼리 실행

Dataproc 내에서 다양한 도구를 사용하여 Hive 쿼리를 실행할 수 있습니다. 이 섹션에서는 다음 도구를 사용하여 쿼리를 수행하는 방법을 알아봅니다.

  • Dataproc의 Hive jobs API
  • SQLLine에 기초한 널리 사용되는 명령줄 클라이언트인 Beeline
  • 구조화된 데이터를 쿼리하는 Apache Spark의 API인 SparkSQL

각 섹션에서 샘플 쿼리를 실행합니다.

Dataproc Jobs API로 Hive 쿼리

다음과 같은 간단한 HiveQL 쿼리를 실행하여 parquet 파일이 Hive 테이블에 올바르게 연결되었는지 확인합니다.

gcloud dataproc jobs submit hive \
    --cluster CLUSTER_NAME \
    --region ${REGION} \
    --execute "
      SELECT *
      FROM transactions
      LIMIT 10;"

출력은 다음과 같습니다.

+-----------------+--------------------+------------------+
| submissiondate  | transactionamount  | transactiontype  |
+-----------------+--------------------+------------------+
| 2017-12-03      | 1167.39            | debit            |
| 2017-09-23      | 2567.87            | debit            |
| 2017-12-22      | 1074.73            | credit           |
| 2018-01-21      | 5718.58            | debit            |
| 2017-10-21      | 333.26             | debit            |
| 2017-09-12      | 2439.62            | debit            |
| 2017-08-06      | 5885.08            | debit            |
| 2017-12-05      | 7353.92            | authorization    |
| 2017-09-12      | 4710.29            | authorization    |
| 2018-01-05      | 9115.27            | debit            |
+-----------------+--------------------+------------------+

Beeline으로 Hive 쿼리

  1. Dataproc의 마스터 인스턴스(CLUSTER_NAME-m)로 SSH 세션을 엽니다.

    gcloud compute ssh CLUSTER_NAME-m
  2. 마스터 인스턴스의 명령 프롬프트에서 Beeline 세션을 엽니다.

    beeline -u "jdbc:hive2://localhost:10000"

    참고:

    • 마스터 인스턴스의 이름을 localhost 대신 호스트로 참조할 수도 있습니다.

      beeline -u "jdbc:hive2://CLUSTER_NAME-m:10000"
    • 마스터가 3개인 고가용성 모드를 사용하는 경우 다음 명령어를 대신 사용해야 합니다.

      beeline -u "jdbc:hive2://CLUSTER_NAME-m-0:2181,CLUSTER_NAME-m-1:2181,CLUSTER_NAME-m-2:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2"
  3. Beeline 프롬프트가 표시되면 다음 HiveQL 쿼리를 실행합니다.

    SELECT TransactionType, AVG(TransactionAmount) AS AverageAmount
    FROM transactions
    WHERE SubmissionDate = '2017-12-22'
    GROUP BY TransactionType;

    출력은 다음과 같습니다.

    +------------------+--------------------+
    | transactiontype  |   averageamount    |
    +------------------+--------------------+
    | authorization    | 4890.092525252529  |
    | credit           | 4863.769269565219  |
    | debit            | 4982.781458176331  |
    +------------------+--------------------+
  4. Beeline 세션을 닫습니다.

    !quit
  5. SSH 연결을 닫습니다.

    exit

SparkSQL로 Hive 쿼리

  1. Dataproc의 마스터 인스턴스로 SSH 세션을 엽니다.

    gcloud compute ssh CLUSTER_NAME-m
  2. 마스터 인스턴스의 명령 프롬프트에서 새 PySpark 셸 세션을 엽니다.

    pyspark
  3. PySpark 셸 프롬프트가 표시되면 다음 Python 코드를 입력합니다.

    from pyspark.sql import HiveContext
    hc = HiveContext(sc)
    hc.sql("""
    SELECT SubmissionDate, AVG(TransactionAmount) as AvgDebit
    FROM transactions
    WHERE TransactionType = 'debit'
    GROUP BY SubmissionDate
    HAVING SubmissionDate >= '2017-10-01' AND SubmissionDate < '2017-10-06'
    ORDER BY SubmissionDate
    """).show()

    출력은 다음과 같습니다.

    +-----------------+--------------------+
    | submissiondate  |      avgdebit      |
    +-----------------+--------------------+
    | 2017-10-01      | 4963.114920399849  |
    | 2017-10-02      | 5021.493300510582  |
    | 2017-10-03      | 4982.382279569891  |
    | 2017-10-04      | 4873.302702503676  |
    | 2017-10-05      | 4967.696333583777  |
    +-----------------+--------------------+
  4. PySpark 세션을 닫습니다.

    exit()
  5. SSH 연결을 닫습니다.

    exit

Hive 메타스토어 검사

이제 Cloud SQL의 Hive 메타스토어에 transactions 테이블에 대한 정보가 포함되어 있는지 확인합니다.

  1. Cloud Shell에서 Cloud SQL 인스턴스로 새 MySQL 세션을 엽니다.

    gcloud sql connect hive-metastore --user=root

    root 사용자 비밀번호를 입력하라는 메시지가 표시되면 아무 것도 입력하지 말고 RETURN 키를 누릅니다. 이 튜토리얼에서는 편의상 root 사용자의 비밀번호를 설정하지 않았습니다. 비밀번호를 설정하여 메타스토어 데이터베이스의 보호를 강화하는 방법은 Cloud SQL 문서를 참조하세요. Cloud SQL 프록시 초기화 작업은 암호화를 통한 비밀번호 보호 메커니즘도 제공합니다. 자세한 내용은 작업의 코드 저장소를 참조하세요.

  2. MySQL 명령 프롬프트에서 hive_metastore를 나머지 세션의 기본 데이터베이스로 설정합니다.

    USE hive_metastore;
  3. 메타스토어에 웨어하우스 버킷의 위치가 기록되어 있는지 확인합니다.

    SELECT DB_LOCATION_URI FROM DBS;

    출력 형식은 다음과 같습니다.

    +-------------------------------------+
    | DB_LOCATION_URI                     |
    +-------------------------------------+
    | gs://[WAREHOUSE_BUCKET]/datasets   |
    +-------------------------------------+
  4. 메타스토어에서 테이블이 올바르게 참조되었는지 확인합니다.

    SELECT TBL_NAME, TBL_TYPE FROM TBLS;

    출력 형식은 다음과 같습니다.

    +--------------+----------------+
    | TBL_NAME     | TBL_TYPE       |
    +--------------+----------------+
    | transactions | EXTERNAL_TABLE |
    +--------------+----------------+
  5. 테이블의 열도 올바르게 참조되었는지 확인합니다.

    SELECT COLUMN_NAME, TYPE_NAME
    FROM COLUMNS_V2 c, TBLS t
    WHERE c.CD_ID = t.SD_ID AND t.TBL_NAME = 'transactions';

    출력 형식은 다음과 같습니다.

    +-------------------+-----------+
    | COLUMN_NAME       | TYPE_NAME |
    +-------------------+-----------+
    | submissiondate    | date      |
    | transactionamount | double    |
    | transactiontype   | string    |
    +-------------------+-----------+
  6. 입력 형식 및 위치도 올바르게 참조되었는지 확인합니다.

    SELECT INPUT_FORMAT, LOCATION
    FROM SDS s, TBLS t
    WHERE s.SD_ID = t.SD_ID AND t.TBL_NAME = 'transactions';

    출력 형식은 다음과 같습니다.

    +---------------------------------------------------------------+------------------------------------------------+
    | INPUT_FORMAT                                                  | LOCATION                                       |
    +---------------------------------------------------------------+------------------------------------------------+
    | org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat | gs://[WAREHOUSE_BUCKET]/datasets/transactions |
    +---------------------------------------------------------------+------------------------------------------------+
    
  7. MySQL 세션을 종료합니다.

    exit

다른 Dataproc 클러스터 만들기

이 섹션에서는 Hive 데이터와 Hive 메타스토어를 여러 클러스터에서 공유할 수 있는지 확인하기 위해 다른 Dataproc 클러스터를 만듭니다.

  1. 새 Dataproc 클러스터를 만듭니다.

    gcloud dataproc clusters create other-CLUSTER_NAME \
        --scopes cloud-platform \
        --image-version 2.0 \
        --region ${REGION} \
        --initialization-actions gs://goog-dataproc-initialization-actions-${REGION}/cloud-sql-proxy/cloud-sql-proxy.sh \
        --properties "hive:hive.metastore.warehouse.dir=gs://${WAREHOUSE_BUCKET}/datasets" \
        --metadata "hive-metastore-instance=${PROJECT}:${REGION}:hive-metastore"\
        --metadata "enable-cloud-sql-proxy-on-workers=false"
  2. 새 클러스터에서 데이터에 액세스할 수 있는지 확인합니다.

    gcloud dataproc jobs submit hive \
        --cluster other-CLUSTER_NAME \
        --region ${REGION} \
        --execute "
          SELECT TransactionType, COUNT(TransactionType) as Count
          FROM transactions
          WHERE SubmissionDate = '2017-08-22'
          GROUP BY TransactionType;"

    출력은 다음과 같습니다.

    +------------------+--------+
    | transactiontype  | count  |
    +------------------+--------+
    | authorization    | 696    |
    | credit           | 1722   |
    | debit            | 2599   |
    +------------------+--------+

수고하셨습니다. 튜토리얼을 완료했습니다.

정리

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

이 튜토리얼에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 안내를 따르세요.

  • 이후에 요금이 청구되지 않도록 생성한 리소스를 모두 삭제합니다. 비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.
  • 개별 리소스를 삭제할 수도 있습니다.

프로젝트 삭제

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

개별 리소스 삭제

Cloud Shell에서 다음 명령어를 실행하여 전체 프로젝트를 삭제하는 대신 개별 리소스를 삭제합니다.

gcloud dataproc clusters delete CLUSTER_NAME --region ${REGION} --quiet
gcloud dataproc clusters delete other-CLUSTER_NAME --region ${REGION} --quiet
gcloud sql instances delete hive-metastore --quiet
gsutil rm -r gs://${WAREHOUSE_BUCKET}/datasets

다음 단계

  • 확장성과 경제성이 뛰어난 Google의 서버리스 엔터프라이즈 데이터 웨어하우스인 BigQuery 사용해 보기
  • Hadoop 워크로드를 Google Cloud로 마이그레이션하는 방법에 대한 이 가이드 참조하기
  • 초기화 작업을 통해 Dataproc에서 Hive HCatalog를 사용하는 자세한 방법 확인하기
  • 고가용성을 위해 Cloud SQL을 구성하여 서비스 안정성을 높이는 방법을 알아봅니다.
  • Google Cloud에 대한 참조 아키텍처, 다이어그램, 권장사항을 살펴봅니다. Cloud 아키텍처 센터를 확인하세요.