Dataproc に Apache Hive をデプロイする

Last reviewed 2023-05-08 UTC

このドキュメントでは、Dataproc で Apache Hive を使用するでアーキテクチャをデプロイする方法について説明します。

このドキュメントは、Dataproc での Apache Hive と Cloud SQL での Hive メタストアのデプロイに関心があるクラウド アーキテクトとデータ エンジニアを対象としています。

アーキテクチャ

このデプロイガイドでは、コンピューティング サービスとストレージ サービスをすべて同じ Google Cloud リージョンにデプロイし、ネットワークのレイテンシとネットワーク転送コストを最小限に抑えています。

次の図は、Hive クエリのライフサイクルを示しています。

シングルリージョン アーキテクチャの図

この図では、Hive クライアントがクエリを送信し、クエリが処理され、フェッチされて返されます。処理は Hive サーバーで行われます。データは、Cloud Storage のリージョン バケットに保存されている Hive ウェアハウスにリクエストされ、復元されます。

目標

  • Cloud SQL 上に Hive メタストア用の MySQL インスタンスを作成します。
  • Dataproc に Hive サーバーをデプロイします。
  • Dataproc クラスタ インスタンスに Cloud SQL Proxy をインストールします。
  • Hive データを Cloud Storage にアップロードします。
  • 複数の Dataproc クラスタで Hive クエリを実行します。

費用

このデプロイでは、課金対象である次の Google Cloud コンポーネントを使用します。

  • Dataproc
  • Cloud Storage
  • Cloud SQL

料金計算ツールを使用すると、予想使用量に基づいて費用の見積もりを作成できます。

新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このデプロイの終了後は、作成したリソースを削除するとそれ以上の請求が発生しなくなります。詳細については、クリーンアップをご覧ください。

始める前に

  1. Google Cloud コンソールの [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  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

(省略可)ウェアハウス バケットの作成

Hive データを保存するための Cloud Storage バケットがない場合は、BUCKET_NAME バケットを一意のバケット名に置き換えて、ウェアハウス バケットを作成します(Cloud Shell で次のコマンドを実行できます)。

export WAREHOUSE_BUCKET=BUCKET_NAME
gcloud storage buckets create gs://${WAREHOUSE_BUCKET} --location=${REGION}

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"

注:

  • sql-admin アクセス スコープを指定し、クラスタ インスタンスが Cloud SQL Admin API にアクセスできるようにします。
  • Cloud Storage バケットに格納するスクリプトに初期化アクションを入れ、--initialization-actions フラグを使用してそのバケットを参照します。詳しくは、初期化アクション - 重要な考慮事項とガイドラインをご覧ください。
  • hive:hive.metastore.warehouse.dir プロパティで、Hive ウェアハウス バケットの URI を指定します。これにより、Hive サーバーから読み取り / 書き込みを行う場所が正しく構成されます。このプロパティには少なくとも 1 つのディレクトリ(例: gs://my-bucket/my-directory)を含めることが必須です。このプロパティをディレクトリ(例: gs://my-bucket)なしでバケット名に設定する場合、Hive が正しく機能しません。
  • Cloud SQL Proxy がマスターノードでのみ実行されるように enable-cloud-sql-proxy-on-workers=false を指定します。これにより、Hive メタストア サービスが機能し、Cloud SQL への不要な負荷を回避できます。
  • Dataproc がすべてのクラスタ インスタンスで自動的に実行する、Cloud SQL Proxy 初期化アクションを指定します。このアクションは次の処理を行います。

    • Cloud SQL Proxy をインストールします。
    • hive-metastore-instance メタデータ パラメータで指定された Cloud SQL インスタンスへの安全な接続を確立します。
    • hive ユーザーと Hive メタストアのデータベースを作成します。

    Cloud SQL Proxy 初期化アクションの完全なコードは、GitHub で確認できます。

  • このデプロイでは、パブリック IP アドレスを持つ Cloud SQL インスタンスを使用します。プライベート IP アドレスのみのインスタンスを使用する場合は、--metadata "use-cloud-sql-private-ip=true" パラメータを渡すことで、プロキシがプライベート IP アドレスを使用するように強制できます。

Hive テーブルの作成

このセクションでは、サンプル データセットをウェアハウス バケットにアップロードし、新しい Hive テーブルを作成して、そのデータセットに対する HiveQL クエリをいくつか実行します。

  1. サンプル データセットをウェアハウス バケットにコピーします。

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

    サンプル データセットは Parquet 形式で圧縮されており、日付、金額、取引タイプの 3 つの列を持つ架空の銀行取引記録が数千件含まれています。

  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
  • BeelineSQLLine に基づく、よく利用されているコマンドライン クライアント)。
  • SparkSQL(構造化データへのクエリを実行する Apache Spark の API)。

各セクションで、サンプルクエリを実行します。

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 のマスター インスタンスとの SSH セッションを開きます(CLUSTER_NAME-m)。

    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 Proxy 初期化アクションで、暗号化によってパスワードを保護するメカニズムを提供することもできます。詳細については、アクションのコード リポジトリをご覧ください。

  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 クラスタの作成

このセクションでは、別の Dataproc クラスタを作成して、Hive データと Hive メタストアを複数のクラスタ間で共有できることを確認します。

  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 プロジェクトと Apache Hive および Dataproc リソースについて、今後料金が発生しないようにする方法について説明します。

Google Cloud プロジェクトを削除する

このデプロイで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、Google Cloud プロジェクトを削除します。

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

リソースを個別に削除する

プロジェクト全体ではなく個々のリソースを削除するには、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
gcloud storage rm gs://${WAREHOUSE_BUCKET}/datasets --recursive

次のステップ

  • Google のサーバーレス、高スケーラビリティ、低コストのエンタープライズ データ ウェアハウスである BigQuery を試す。
  • Hadoop ワークロードの Google Cloud への移行に関するガイドを読む。
  • 初期化アクションを確認して、Dataproc で Hive HCatalog を使用する方法の詳細を確認する。
  • Cloud SQL を高可用性に構成してサービスの信頼性を向上させる方法を学ぶ。
  • Cloud アーキテクチャ センターで、リファレンス アーキテクチャ、図、ベスト プラクティスを確認する。