Cloud Dataproc での Apache Hive の使用

このチュートリアルでは、Cloud DataprocApache Hive を効率的かつ柔軟に使用するために、Hive データを Cloud Storage に保存し、Hive メタストアを Cloud SQL 上の MySQL データベースでホストする方法を説明します。このようにコンピューティング リソースとストレージ リソースを分離すると、次のような利点があります。

  • 柔軟性と俊敏性: 特定の Hive ワークロードに合わせてクラスタ構成をカスタマイズし、必要に応じて各クラスタを個別にスケールアップまたはスケールダウンできます。
  • コストの削減: Hive ジョブを実行するときにエフェメラル クラスタを起動し、ジョブが完了したら削除できます。ジョブに必要なリソースは使用されるときにのみアクティブになるため、使用した分に限り課金されます。重要性の低いデータを処理する場合や大規模なクラスタの作成にかかる総費用を低く抑えたい場合は、プリエンプティブ VM を使用することもできます。

Hive は、Apache Hadoop 上に構築された人気のあるオープンソースのデータ ウェアハウス システムです。Hive には SQL に似た HiveQL というクエリ言語が用意されており、これを使用して大規模な構造化データセットを分析します。Hive メタストアには、Hive テーブルに関するスキーマや場所などのメタデータが格納されます。Cloud SQL を使用すると、Google Cloud Platform(GCP)上のリレーショナル データベースのセットアップ、メンテナンス、管理、運用が容易になります。Cloud SQL では、MySQL が Hive メタストアのバックエンドとしてよく使用されます。

Cloud Dataproc は、GCP 上で Apache SparkApache Hadoop のワークロードをシンプルかつ費用対効果の高い方法で実行できる、高速で使いやすいフルマネージド サービスです。Cloud Dataproc インスタンスはステートレスのままにすることができますが、Hive データは Cloud Storage、Hive メタデータは Cloud SQL 上の MySQL にそれぞれ格納することをおすすめします。

目標

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

料金

このチュートリアルでは、課金対象である以下の Google Cloud Platform コンポーネントを使用します。

  • Cloud Dataproc
  • Cloud Storage
  • Cloud SQL

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

GCP の新規ユーザーは無料トライアルの対象となる可能性があります。

始める前に

新しいプロジェクトを作成する

  1. GCP Console で、プロジェクト セレクタのページに移動します。

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

  2. GCP プロジェクトを選択または作成します。

課金を有効にする

環境を初期化する

  1. Cloud Shell インスタンスを起動します。

    Cloud Shell に移動

  2. Cloud Shell で、デフォルトの Compute Engine ゾーンを、Cloud Dataproc クラスタを作成するゾーンに設定します。このチュートリアルでは、us-central1 リージョンの us-central1-a ゾーンを使用しています。

    export REGION=us-central1
    export ZONE=us-central1-a
    gcloud config set compute/zone $ZONE
  3. Cloud Shell で次のコマンドを実行して、Cloud Dataproc と Cloud SQL Admin API を有効にします。

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

リファレンス アーキテクチャ

わかりやすくするため、このチュートリアルではすべてのコンピューティング サービスとストレージ サービスを同じ GCP リージョンにデプロイし、ネットワークのレイテンシとネットワーク転送コストを最小限に抑えます。図 1 に、このチュートリアルのアーキテクチャを示します。

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

このアーキテクチャでは、Hive クエリのライフサイクルは次のステップに従います。

  1. Hive クライアントが、エフェメラル Cloud Dataproc クラスタで動作する Hive サーバーにクエリを送信します。
  2. サーバーがクエリを処理し、メタストア サービスにメタデータをリクエストします。
  3. メタストア サービスは、Cloud SQL Proxy を介して Cloud SQL から Hive メタデータをフェッチします。
  4. サーバーが、Cloud Storage のリージョン バケットに存在する Hive ウェアハウスからデータを読み込みます。
  5. サーバーからクライアントに結果が返されます。

マルチリージョン アーキテクチャに関する考慮事項

このチュートリアルでは、シングルリージョン アーキテクチャに焦点を当てています。ただし、Hive サーバーを異なる地理的地域で実行しなければならない場合は、マルチリージョン アーキテクチャを検討できます。その場合は、Cloud SQL インスタンスと同じリージョンに、メタストア サービスのホスティング専用の Cloud Dataproc クラスタを別に作成する必要があります。メタストア サービスから MySQL データベースに送信されるリクエストの量は非常に多くなる可能性があるため、パフォーマンスへの影響を最小限に抑えるために、メタストア サービスを地理的に MySQL データベースに近づけることが重要です。それに比べて、Hive サーバーからメタストア サービスに送信されるリクエストの量は通常、はるかに少数です。したがって、たとえレイテンシが増加しても、Hive サーバーとメタストア サービスは異なるリージョンに配置してかまわない場合があります。

メタストア サービスは Cloud Dataproc マスターノードでのみ実行でき、ワーカーノードでは実行できません。Cloud Dataproc の標準クラスタおよび高可用性クラスタでは、最低 2 つのワーカーノードが強制的に作成されます。未使用のワーカーノードでリソースを無駄にするのを避けるため、代わりにメタストア サービス用の単一ノードクラスタを作成できます。高可用性を実現するため、複数の単一ノードクラスタを作成できます。

Cloud SQL インスタンスに直接接続しなければならないのはメタストア サービス クラスタだけなので、Cloud SQL Proxy はメタストア サービス クラスタにのみインストールする必要があります。Hive サーバーからアクセスするメタストア サービス クラスタを指定するには、hive.metastore.uris プロパティの値として URI のカンマ区切りリストを設定します。次に例を示します。

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

複数のロケーションにある Hive サーバーから Hive データにアクセスする必要がある場合は、マルチリージョン バケットを使用することも検討できます。リージョン バケットとマルチリージョン バケットのどちらを選ぶかは、ユースケースによります。レイテンシ、可用性、帯域幅コストのバランスをとる必要があります。詳細については、ロケーションに関する留意事項をご覧ください。

図 2 に、マルチリージョン アーキテクチャの例を示します。

マルチリージョン Hive アーキテクチャの図
図 2. マルチリージョンの Hive アーキテクチャの例

ご覧のように、マルチリージョン シナリオはやや複雑です。簡潔にするため、このチュートリアルではシングルリージョン アーキテクチャを使用します。

ウェアハウス バケットの作成

まず、Hive データをホストし、すべての Hive サーバーによって共有されるウェアハウス バケットを作成します。

ウェアハウス バケットを作成するには、Cloud Shell で次のコマンドを実行します。

export PROJECT=$(gcloud info --format='value(config.project)')
gsutil mb -l $REGION gs://$PROJECT-warehouse

Cloud SQL インスタンスの作成

このセクションでは、後で Hive メタストアのホスティングに使用する新しい Cloud SQL インスタンスを作成します。

Cloud Shell で、新しい Cloud SQL インスタンスを作成します。

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

このコマンドが完了するまで数分かかる場合があります。

Cloud Dataproc クラスタの作成

最初の Cloud Dataproc クラスタを作成します。

gcloud dataproc clusters create hive-cluster \
    --scopes sql-admin \
    --image-version 1.3 \
    --initialization-actions gs://dataproc-initialization-actions/cloud-sql-proxy/cloud-sql-proxy.sh \
    --properties hive:hive.metastore.warehouse.dir=gs://$PROJECT-warehouse/datasets \
    --metadata "hive-metastore-instance=$PROJECT:$REGION:hive-metastore"

注:

  • sql-admin アクセス スコープを指定し、クラスタ インスタンスが Cloud SQL Admin API にアクセスできるようにします。
  • クラスタ イメージのバージョン 1.3(このチュートリアルの作成時点で使用可能な最新のバージョン)を指定します。
  • hive:hive.metastore.warehouse.dir プロパティで、Hive ウェアハウス バケットの URI を指定します。これにより、Hive サーバーから読み取り / 書き込みを行う場所が正しく構成されます。
  • Cloud Dataproc がすべてのクラスタ インスタンスで自動的に実行する、Cloud SQL Proxy 初期化アクションを指定します。このアクションは次の処理を行います。

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

    この Cloud SQL Proxy 初期化アクションの完全なコードを GitHub で見ることができます。

  • わかりやすくするため、このチュートリアルではマスター インスタンスを 1 つだけ使用します。本番環境ワークロードで復元力を高めるには、Cloud Dataproc の高可用性モードを使用し、3 つのマスター インスタンスを持つクラスタを作成することを検討してください。

Hive テーブルの作成

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

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

    gsutil cp gs://hive-solution/part-00000.parquet \
    gs://$PROJECT-warehouse/datasets/transactions/part-00000.parquet

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

  2. このデータセット用の外部 Hive テーブルを作成します。

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

Hive クエリの実行

Cloud Dataproc 内のさまざまなツールを使用して Hive クエリを実行できます。 このセクションでは、次のツールを使用してクエリを実行する方法を説明します。

  • Cloud Dataproc の Hive ジョブ API
  • BeelineSQLLine に基づく、よく利用されているコマンドライン クライアント)。
  • SparkSQL(構造化データへのクエリを実行する Apache Spark の API)。

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

Cloud Dataproc Jobs API を使用した Hive のクエリ

次のシンプルな HiveQL クエリを実行して、parquet ファイルが Hive テーブルに正しくリンクされていることを確認します。

gcloud dataproc jobs submit hive \
    --cluster hive-cluster \
    --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. Cloud Dataproc のマスター インスタンスとの SSH セッションを開きます。

    gcloud compute ssh hive-cluster-m
  2. マスター インスタンスのコマンド プロンプトで、Beeline セッションを開きます。

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

    注:

    • localhost の代わりに、次のようにマスター インスタンスの名前をホストとして参照することもできます。

      beeline -u "jdbc:hive2://hive-cluster-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. Cloud Dataproc のマスター インスタンスとの SSH セッションを開きます。

    gcloud compute ssh hive-cluster-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://[PROJECT]-warehouse/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://[PROJECT]-warehouse/datasets/transactions |
    +---------------------------------------------------------------+------------------------------------------------+
    
  7. MySQL セッションを閉じます。

    exit

別の Cloud Dataproc クラスタの作成

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

  1. 新しい Cloud Dataproc クラスタを作成します。

    gcloud dataproc clusters create other-hive-cluster \
        --scopes cloud-platform \
        --image-version 1.3 \
        --initialization-actions gs://dataproc-initialization-actions/cloud-sql-proxy/cloud-sql-proxy.sh \
        --metadata  "hive-metastore-instance=$PROJECT:$REGION:hive-metastore"

    以前に最初のクラスタを作成したときに hive:hive.metastore.warehouse.dir プロパティを指定したのとは異なり、今回は Hive ウェアハウス バケットへの参照は指定しません。前のセクションで確認したように、バケットの場所は Hive メタストアにすでに記録されています。

  2. 新しいクラスタがデータにアクセスできることを確認します。

    gcloud dataproc jobs submit hive \
        --cluster other-hive-cluster \
        --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 Platform アカウントに課金されないようにする手順は次のとおりです。

このチュートリアルで使用したリソースについて GCP アカウントに課金されないようにするには:

  • 作成したすべてのリソースをクリーンアップして、これ以後リソースの料金が発生しないようにします。課金を停止する最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
  • あるいは、リソースを個別に削除することもできます。

プロジェクトの削除

  1. GCP Console で [リソースの管理] ページに移動します。

    [リソースの管理] ページに移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

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

プロジェクト全体ではなく個々のリソースを削除するには、Cloud Shell で次のコマンドを実行します。

gcloud dataproc clusters delete hive-cluster --quiet
gcloud dataproc clusters delete other-hive-cluster --quiet
gcloud sql instances delete hive-metastore --quiet
gsutil rm -r gs://$PROJECT-warehouse

次のステップ

  • Google のサーバーレス、高スケーラビリティ、低コストのエンタープライズ データ ウェアハウスである BigQuery を試す。
  • Hadoop ワークロードの GCP への移行に関するガイドを読む。
  • 初期化アクションを確認して、Cloud Dataproc で Hive HCatalog を使用する方法の詳細を確認する。
  • 高可用性対応の Cloud SQL を構成してサービスの信頼性を向上させる方法を学ぶ。
  • Google Cloud Platform のその他の機能を試す。チュートリアルをご覧ください。
このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...