Dataproc Metastore でトランザクション テーブルを使用する

ACID セマンティクスを使用したトランザクションは、Dataproc Metastore の Apache Hive メタストアでサポートされています。詳細については、Hive トランザクションをご覧ください。これらのトランザクションは、Hive 3 ではデフォルトで有効になっています。

設定

トランザクションのサポートを有効にするには、サーバー側とクライアント側の構成を設定する必要があります。

サーバー側の構成

Dataproc Metastore によるサービス作成時には、デフォルトで次のサーバー側の構成が設定されます。[Metastore config overrides] に上書きする「Key」と「Value」の値を入力して、それをオーバーライドすることもできます。

  • metastore.compactor.initiator.on - Dataproc Metastore サービスでイニシエータ スレッドおよびクリーナー スレッドを実行するかどうか。

    true に設定すると、イニシエータが有効になります。

  • metastore.compactor.worker.threads - Dataproc メタストアで実行するコンパクタ ワーカー スレッドの数。

    コンパクタを有効にするには、正の数に設定します。この値を大きくすると、サービスのパフォーマンスに影響する可能性があります(特に Developer 階層の場合)。この数を微調整する必要がある場合は、8 などの小さい値を使用することをおすすめします。

  • hive.metastore.event.db.notification.api.auth - Dataproc Metastore サービスで、データベース通知関連の API を承認するかどうか。

    false に設定します。true に設定すると、プロキシ設定のスーパーユーザーだけに権限が割り当てられます。スーパーユーザー プロキシ権限の詳細については、Metastore notification API のセキュリティをご覧ください。

クライアント側の構成

クライアント側の構成は、トランザクションの検証で説明されているように Hive クライアントに設定されます。

  • hive.support.concurrency - true に設定すると、トランザクションの挿入、更新、削除がサポートされます。

  • hive.exec.dynamic.partition.mode - 厳格モードでは、すべてのパーティションが誤って上書きされる場合に備えて、静的パーティションを少なくとも 1 つ指定する必要があります。非厳格モードでは、すべてのパーティションを動的パーティションにできます。

    nonstrict に設定すると、トランザクションの挿入、更新、削除がサポートされます。

  • hive.txn.manager - org.apache.hadoop.hive.ql.lockmgr.DbTxnManager に設定します。

トランザクションを検証する

Hive トランザクションは、Hive 3 で Dataproc Metastore サービスを使用する Dataproc クラスタを使用して検証できます。

Dataproc クラスタは、Dataproc Metastore サービスと同じプロジェクトに、Hive 3 を使用して作成する必要があります。Dataproc 2.0 イメージ、2.0-ubuntu18、2.0-debian10 は、Hive 3 とトランザクションをサポートしています。フラグ --image-version を使用して、2.0 イメージを設定できます。 次に例を示します。

gcloud dataproc clusters create DATAPROC_CLUSTER_ID \
   --dataproc-metastore=projects/PROJECT_ID/locations/LOCATION/services/SERVICE \
   --region=REGION \
   --image-version 2.0-debian10

次の手順では、Dataproc クラスタで使用される Dataproc Metastore サービスのトランザクションを検証する方法を説明します。

  1. Dataproc クラスタに SSH で接続します。これは、ブラウザまたはコマンドラインから行えます。

  2. hive コマンドを実行して、Hive クライアントを起動します。

    $> hive
    
  3. クライアント側の構成を設定し、Hive クライアント セッションでトランザクションに対して Hive ACID サポートを有効にする:

    SET hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
    SET hive.support.concurrency=true;
    SET hive.exec.dynamic.partition.mode=nonstrict;
    
  4. 挿入および更新を行うトランザクション テーブルを作成します。次に例を示します。

    1. トランザクション テーブルを作成する:

      create table student (id int, name string, age int)
      STORED AS ORC TBLPROPERTIES ('transactional' = 'true');
      
    2. テーブルがトランザクションかどうかを確認する:

      describe formatted <tableName>;
      

      テーブルのプロパティの一覧が出力されます。トランザクション テーブルでは、テーブル パラメータに transactional=true が含まれています。

    3. テーブルにデータを挿入する:

      INSERT INTO student VALUES
      (1, 'Alice', 10),
      (2, 'Bob', 10),
      (3, 'Charlie', 10);
      
      1. サービスのウェアハウス ディレクトリにある student ディレクトリの中に作成された差分フォルダを確認します。複数の insert や update ステートメントを実行すると、差分フォルダが複数作成されます。
    4. 実行中のコンパクションとそのステータスを表示します。Hive メタストアは、5 分ごとにイニシエータというスレッドを実行してコンパクション予定のテーブルを確認し、テーブルのコンパクションをリクエストします。

      show compactions;
      
      1. 手動でコンパクションを開始(マイナーまたはメジャー)する:

          ALTER TABLE student COMPACT 'minor';
          ALTER TABLE student COMPACT 'major';
        

次のステップ