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 サービスのトランザクションを検証する方法を説明します。
Dataproc クラスタに SSH で接続します。これは、ブラウザまたはコマンドラインから行えます。
hive
コマンドを実行して Hive クライアントを開きます。$> hive
クライアント側の構成を設定し、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;
挿入および更新を行うトランザクション テーブルを作成します。次に例を示します。
トランザクション テーブルを作成する:
create table student (id int, name string, age int) STORED AS ORC TBLPROPERTIES ('transactional' = 'true');
テーブルがトランザクションかどうかを確認する:
describe formatted <tableName>;
テーブルのプロパティの一覧が出力されます。トランザクション テーブルでは、テーブル パラメータに
transactional=true
が含まれています。テーブルにデータを挿入する:
INSERT INTO student VALUES (1, 'Alice', 10), (2, 'Bob', 10), (3, 'Charlie', 10);
- サービスのウェアハウス ディレクトリにある
student
ディレクトリの中に作成された差分フォルダを確認します。複数の insert や update ステートメントを実行すると、差分フォルダが複数作成されます。
- サービスのウェアハウス ディレクトリにある
実行中のコンパクションとそのステータスを表示します。Hive メタストアは、5 分ごとにイニシエータというスレッドを実行してコンパクション予定のテーブルを確認し、テーブルのコンパクションをリクエストします。
show compactions;
手動でコンパクションを開始(マイナーまたはメジャー)する:
ALTER TABLE student COMPACT 'minor'; ALTER TABLE student COMPACT 'major';