すべてのプロダクト
Search
ドキュメントセンター

Hologres:Hologres へのバッチ書き込み

最終更新日:Jun 22, 2026

Hologres は、PostgreSQL プロトコルと互換性のあるワンストップのリアルタイムデータウェアハウスエンジンです。リアルタイムシナリオとオフラインシナリオの両方で、大量のデータ量の書き込み、更新、クエリをサポートします。このトピックでは、Spark から Hologres へのバッチ書き込みの性能テスト結果に基づき、さまざまなシナリオに最適な書き込みモードの選択に役立つ情報を提供します。

リアルタイムのデータ書き込みと更新については、「データ書き込み、更新、ポイントクエリのストレステスト」をご参照ください。

バッチ書き込みモードの比較

Hologres は、従来の COPY モード、COPY プロトコルに基づく FIXED COPY ストリーミングインポートモード、およびバッチインポートをストリーミング書き込みに変換する INSERT INTO VALUES モードなど、複数のバッチ書き込みモードをサポートしています。

次の表では、3 つの書き込みモードを詳細に比較しています。

特徴

COPY

FIXED COPY

INSERT INTO VALUES

説明

プライマリキーのないテーブルへのバッチインポート

プライマリキーのあるテーブルへのバッチインポート

COPY プロトコルに基づくストリーミングインポートモード

基本的なストリーミングインポートモード

ユースケース

  • Spark からのバッチインポート

  • Apache Flink からのバッチインポート

  • Flink からのインポート

  • DataWorks Data Integration からのインポート

  • Spark からのストリーミングインポート

  • Flink からのインポート

  • DataWorks Data Integration からのインポート

  • Spark からのストリーミングインポート

ロックの粒度

行ロック

行ロック

行ロック

行ロック

データの可視性

COPY 操作の完了後に表示

COPY 操作の完了後に表示

リアルタイムで表示

リアルタイムで表示

パフォーマンス

Hologres のリソース消費量

クライアントのリソース消費量

サポートされているプライマリキーの競合ポリシー

該当なし

  • NONE

  • UPDATE:V3.0.4 以降では行全体の更新をサポートし、V3.1.1 以降では部分更新をサポートします。

  • IGNORE:V3.0.4 以降でサポートします。

  • NONE (競合が発生した場合はエラーを返します)

  • UPDATE

  • IGNORE

  • NONE (競合が発生した場合はエラーを返します)

  • UPDATE

  • IGNORE

バッチ書き込みモードの選択

バッチ書き込みシナリオでは、3 つのモードには次の機能があります。

  • COPY モード:従来の COPY モードは、Hologres のリソース消費を最小限に抑え、最高の書き込みパフォーマンスを発揮します。

  • FIXED COPY モード:COPY プロトコルに基づくストリーミングインポートモードです。行ロックのみを生成し、リアルタイムデータ可視性を提供します。

  • INSERT INTO VALUES モード:このモードはバッチインポートを従来のストリーミング書き込みに変換するため、バッチ書き込みシナリオでは大きな利点はありません。

    説明

    INSERT INTO VALUES モードに明確な利点がないのは、バッチ書き込みシナリオの場合のみです。ただし、このモードはデータ撤回 (削除) をサポートする唯一のモードであり、バイナリログデータの書き込みといったユースケースで必要となります。

リアルタイムデータ可視性、ロックの粒度 (テーブルロックは同時書き込みタスクを妨げます)、またはデータソースの負荷に関する特定の要件がない限り、バッチ書き込みには COPY モードを使用することを推奨します。

  • Spark からのバッチ書き込みの場合:Hologres インスタンスを V2.2.25 以降にアップグレードし、コネクターの 書き込みパラメーター write.modeauto (デフォルト値) に設定することを推奨します。これにより、システムが最適なバッチ書き込みモードを自動的に選択します。

  • Flink からのバッチ書き込みの場合:まず、以下の決定木を使用して COPY モードまたは FIXED COPY モードのいずれかを選択します。次に、以下のパラメーターを設定します。

    • jdbccopywritemode: TRUE に設定します。これにより、INSERT INTO VALUES モードの使用を防ぎます。

    • bulkload:要件に応じて、COPY モードの場合は TRUE に、FIXED COPY モードの場合は FALSE に設定します。

次の決定木を使用して、シナリオに適したバッチ書き込みモードを選択してください。

image

バッチ書き込みの性能テスト

このテストでは、Hologres のオープンソースの Hologres-Spark-Connector を使用します。

前提条件

環境のセットアップ

開始する前に、次の環境がセットアップ済みであることを確認してください。

重要

Hologres インスタンスと EMR Spark クラスターは、同じリージョンにあり、同じ VPC を使用している必要があります。

  • V2.2.25 以降の Hologres インスタンスをプロビジョニングして、データベースを作成します。

  • Spark 3.3.0 以降を実行する EMR Spark クラスターを作成します。詳細については、「クラスターの作成」をご参照ください。

  • Spark-Connector パッケージをダウンロードします。

    Spark から Hologres への読み取りと書き込みを有効にするには、Maven 中央リポジトリから hologres-connector-spark-3.x JAR ファイルをダウンロードします。

次の表は、性能テストに使用した環境を示しています。

サービス

バージョン

仕様

Hologres

V3.0.30

64 コア、256 GB (1 CU = 1 コア、4 GB)

EMR Spark

EMR-5.18.1、Spark-3.5.3

8 コア、32 GB × 8 (マスターノード 1 台、コアノード 7 台)

重要

OSS-HDFS サービスを有効にする必要があります。

Spark-Connector

1.5.2

該当なし

テストデータの準備

  1. ソースデータを準備します。

    1. EMR Spark クラスターのマスターノードにログオンします。詳細については、「ECS インスタンスへの接続」をご参照ください。

    2. TPC-H_Tools_v3.0.0.zip TPC-H ツールパッケージをダウンロードしてマスターノードの ECS インスタンスにコピーし、解凍してから TPC-H_Tools_v3.0.0/TPC-H_Tools_v3.0.0/dbgen ディレクトリに移動します。

    3. dbgen ディレクトリで次のコマンドを実行し、1 TB のテストデータセットとして customer.tbl ファイルを生成します。

      ./dbgen -s 1000 -T c

      次の表は、1 TB TPC-H データセット内の customer テーブルについて説明します。

      項目

      説明

      フィールド数

      8

      フィールドタイプ

      INT、BIGINT、TEXT、DECIMAL

      行数

      150,000,000

      シャード数

      40

  2. テストデータを Spark にインポートします。

    次のコマンドを実行して、customer.tbl ファイルを Spark クラスターにアップロードします。

    hadoop fs -put customer.tbl <spark_resource>

    コマンド内の spark_resource は、EMR Spark クラスターの作成時に設定した [クラスターのルートストレージディレクトリ] を指します。

  3. 行-列ハイブリッドストレージ

    CREATE TABLE test_table_mixed (
        C_CUSTKEY BIGINT PRIMARY KEY,
        C_NAME TEXT,
        C_ADDRESS TEXT,
        C_NATIONKEY INT,
        C_PHONE TEXT,
        C_ACCTBAL DECIMAL(15, 2),
        C_MKTSEGMENT TEXT,
        C_COMMENT TEXT
    )
    WITH (
        orientation = 'column,row'
    );

    列指向ストレージ (プライマリキーあり)

    CREATE TABLE test_table_column (
        C_CUSTKEY BIGINT PRIMARY KEY,
        C_NAME TEXT,
        C_ADDRESS TEXT,
        C_NATIONKEY INT,
        C_PHONE TEXT,
        C_ACCTBAL DECIMAL(15, 2),
        C_MKTSEGMENT TEXT,
        C_COMMENT TEXT
    )
    WITH (
        orientation = 'column'
    );

    列指向ストレージ (プライマリキーなし)

    CREATE TABLE test_table_column_no_pk (
        C_CUSTKEY BIGINT,
        C_NAME TEXT,
        C_ADDRESS TEXT,
        C_NATIONKEY INT,
        C_PHONE TEXT,
        C_ACCTBAL DECIMAL(15, 2),
        C_MKTSEGMENT TEXT,
        C_COMMENT TEXT
    )
    WITH (
        orientation = 'column'
    );

    行指向ストレージ (プライマリキーあり)

    CREATE TABLE test_table_row (
        C_CUSTKEY BIGINT PRIMARY KEY,
        C_NAME TEXT,
        C_ADDRESS TEXT,
        C_NATIONKEY INT,
        C_PHONE TEXT,
        C_ACCTBAL DECIMAL(15, 2),
        C_MKTSEGMENT TEXT,
        C_COMMENT TEXT
    )
    WITH (
        orientation = 'row'
    );

    行指向ストレージ (プライマリキーなし)

    CREATE TABLE test_table_row_no_pk (
        C_CUSTKEY BIGINT,
        C_NAME TEXT,
        C_ADDRESS TEXT,
        C_NATIONKEY INT,
        C_PHONE TEXT,
        C_ACCTBAL DECIMAL(15, 2),
        C_MKTSEGMENT TEXT,
        C_COMMENT TEXT
    )
    WITH (
        orientation = 'row'
    );

パフォーマンス テスト

テスト設定

このトピックでは、さまざまなモードでのインポートパフォーマンスをテストします。

  1. EMR Spark クラスターのマスターノードにログオンします。詳細については、「ECS インスタンスへの接続」をご参照ください。ダウンロードした Spark-Connector パッケージをアップロードし、次のコマンドを実行して Spark SQL 対話型シェルに入ります。

    説明

    この例では、spark.executor.instances パラメーターによって同時実行数が 40 に設定されています。読み取りの並列処理をさらに細かく制御するには、spark.sql.files.maxPartitionBytes パラメーターで HDFS ファイルのパーティションサイズを調整します。

    # Spark SQL 対話型シェルに入ります。
    spark-sql --jars <path>/hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar \
    --conf spark.executor.instances=40 \
    --conf spark.executor.cores=1 \
    --conf spark.executor.memory=4g \
    --conf spark.sql.files.maxPartitionBytes=644245094

    コマンドの path は、hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar ファイルを含むディレクトリです。

  2. Spark SQL 対話型シェルで、次の SQL 文を実行して一時ビューを作成し、データを書き込みます。

    このテストでは、さまざまなモードでの書き込みパフォーマンスを評価する際のパラメーター調整を容易にするために、一時ビューを使用します。

    説明

    実際には、カタログを使用して Hologres テーブルを直接ロードすることもできます。

    -- CSV 形式の一時ビューを作成します。
    CREATE TEMPORARY VIEW csvtable (
      c_custkey BIGINT,
      c_name STRING,
      c_address STRING,
      c_nationkey INT,
      c_phone STRING,
      c_acctbal DECIMAL(15, 2),
      c_mktsegment STRING,
      c_comment STRING)
    USING csv OPTIONS (
      path "<spark_resources>/customer.tbl", sep "|"
    );
    CREATE TEMPORARY VIEW hologresTable (
      c_custkey BIGINT,
      c_name STRING,
      c_address STRING,
      c_nationkey INT,
      c_phone STRING,
      c_acctbal DECIMAL(15, 2),
      c_mktsegment STRING,
      c_comment STRING)
    USING hologres OPTIONS (
      jdbcurl "jdbc:postgresql://<hologres_vpc_endpoint>/<database_name>",
      username "<accesskey_id>", 
      password "<accesskey_secret>", 
      table "<table_name>",
      direct_connect "false",
      write.mode "auto",
      write.insert.thread_size "3",
      write.insert.batch_size "2048"
    );
    INSERT INTO hologresTable SELECT * FROM csvTable;

    次の表にパラメーターを示します。

    パラメーター

    説明

    spark_resources

    EMR Spark クラスターの作成時に設定する[クラスターのルートストレージパス]です。

    このパスは、EMR on ECS コンソールのクラスターの Basic Information ページの [Cluster Information] セクションにあります。

    hologres_vpc_endpoint

    Hologres インスタンスの VPC ドメイン名 です。

    Hologres コンソールにログオンし、ターゲットインスタンスの ID をクリックして、インスタンス詳細ページのネットワーク情報セクションで指定された VPC のエンドポイントを見つけます。たとえば、中国 (杭州) リージョンの VPC エンドポイントの形式は <Instance ID>-cn-hangzhou-vpc-st.hologres.aliyuncs.com:80 です。

    database_name

    Hologres インスタンス内のデータベースの名前です。

    accesskey_id

    指定された Hologres データベースへの書き込み権限を持つ AccessKey ID です。

    accesskey_secret

    指定された Hologres データベースへの書き込み権限を持つ AccessKey Secret です。

    table_name

    宛先の Hologres テーブルの名前です。

    write.mode

    書き込みモードです。有効な値:

    • auto :デフォルト値。コネクターが最適なモードを自動的に選択します。

    • insert :INSERT INTO VALUES 文を使用してデータを書き込みます。

    • stream :FIXED COPY を使用してストリーミング書き込みを実行します。

    • bulk_load :COPY を使用して、プライマリキーのないテーブルに一括インポートを実行します。

    • bulk_load_on_conflict :COPY を使用して、プライマリキーのあるテーブルに一括インポートを実行します。

    write.insert.thread_size

    書き込み同時実行数です。このパラメーターは insert モードにのみ適用されます。

    write.insert.batch_size

    書き込みバッチサイズです。このパラメーターは insert モードにのみ適用されます。

    write.on_conflict_action

    INSERT_OR_REPLACE (デフォルト):プライマリキーの競合が発生した場合、データは更新されます。

    INSERT_OR_IGNORE :プライマリキーの競合が発生した場合、データは無視されます。

    パラメーターの詳細については、「パラメーター」をご参照ください。

テストシナリオ

テストシナリオ

オプション

テーブルストレージフォーマット

  • 行指向ストレージ

  • 列指向ストレージ

  • 行と列のハイブリッドストレージ

データ更新方法

  • プライマリキーがないテーブルへの追加のみの書き込み

  • プライマリキーのある空のテーブルへの初期書き込み

  • プライマリキーのあるテーブルへの行全体の更新

書き込みモード

  • insert (INSERT INTO VALUES)

  • ストリーム (FIXED COPY)

  • bulk_load (プライマリキーのないテーブルへの COPY インポート)

  • bulk_load_on_conflict (プライマリキーのあるテーブルへの COPY インポート)

テスト結果

テスト結果には次のフィールドが含まれます。

フィールド

説明

ジョブの合計実行時間

Spark ジョブの合計実行時間です。

この値は、EMR Spark クラスター ノード上の Spark SQL インタラクティブシェルで INSERT 操作を実行するのにかかった時間です。この時間はシェル出力の Time taken 行に表示されます。

spark-sql (default)> insert into hologresTable select * from csvTable;
25/04/11 15:05:51 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:05:52 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:05:52 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:02 WARN [main] PGStream: create socket to
25/04/11 15:06:02 WARN [main] JDBCUtil$: could not connect directly
25/04/11 15:06:03 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:04 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:04 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:05 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:05 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:06 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:06 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:07 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:07 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:09 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:09 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:10 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:10 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:11 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:11 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:12 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:12 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:13 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
Time taken: 228.901 seconds

平均データ書き込み時間

Spark クラスターのスケジューリング、データ読み取り、またはデータリシャッフルにかかった時間を除いた、書き込みジョブ自体の平均実行時間です。

Hologres コンソールの HoloWeb ページで、次の SQL ステートメントを実行して、シャードの同時実行数 (COUNT(*) の値) と平均データ書き込み時間 (avg_duration_ms) をミリ秒単位で取得します。

SELECT
    COUNT(*), AVG(duration) AS avg_duration_ms
FROM
    hologres.hg_query_log
WHERE
    query_start >= '<start_time>' AND query_start <= '<end_time>'
    AND query LIKE '%<hologres_table_name>%' AND command_tag = 'COPY';

次の表では、パラメーターについて説明します。

  • start_time:データ書き込み操作の開始時刻です (2024-04-11 15:00:00 など)。

  • end_time:データ書き込み操作の終了時刻です (2024-04-11 15:10:00 など)。

  • hologres_table_name:宛先の Hologres テーブルの名前です (your_table_name など)。

Hologres のロード

Hologres インスタンスの CPU 使用率です。

CPU 使用率は、Hologres コンソールのインスタンスのMonitoring Information ページで確認できます。

Spark のロード

EMR ノードのロードです。

EMR on ECS コンソールで、お使いのクラスターの[モニタリングと診断] >[メトリックモニタリング] タブに移動し、以下の設定を行います。

  • [ダッシュボード]: HOST を選択します。

  • [nodeGroupId]: クラスターのコアノードグループの ID を選択します。

  • [ホスト名]: コアノードを選択します。

  • [時間を選択]: Spark データ書き込み操作を含む時間範囲を選択します。

次に、[CPU 使用率] メトリックをクエリして、Spark の負荷を表示します。

次の表は、詳細なテスト結果を示しています。

ストレージフォーマット

プライマリキー

書き込みモード

ジョブの合計実行時間

平均書き込み時間

Hologres のロード

Spark のロード

列指向ストレージ

プライマリキーなし

insert

241.61 s

232.70 s

92%

15%

stream

228.11 s

222.34 s

100%

36%

bulk_load

88.72 s

57.16 s

97%

47%

プライマリキーあり

ignore

insert

190.96 s

172.60 s

90%

14%

stream

149.60 s

142.16 s

100%

14%

bulk_load_on_conflict

115.96 s

42.92 s

60%

75%

プライマリキーあり

replace

insert

600.40 s

574.31 s

91%

5%

stream

550.29 s

540.32 s

100%

5%

bulk_load_on_conflict

188.05 s

109.77 s

93%

78%

行指向ストレージ

プライマリキーなし

insert

132.38 s

123.79 s

94%

22%

stream

114.41 s

103.81 s

100%

17%

bulk_load

68.20 s

41.22 s

98%

32%

プライマリキーあり

ignore

insert

190.48 s

170.49 s

89%

15%

stream

185.46 s

172.48 s

85%

14%

bulk_load_on_conflict

117.81 s

47.69 s

58%

75%

プライマリキーあり

replace

insert

177.97 s

170.78 s

93%

15%

stream

142.44 s

130.16 s

100%

20%

bulk_load_on_conflict

137.69 s

65.18 s

92%

78%

行列ハイブリッドストレージ

プライマリキーあり

ignore

insert

172.19 s

158.74 s

86%

16%

stream

150.63 s

149.76 s

100%

12%

bulk_load_on_conflict

128.83 s

42.09 s

59%

79%

プライマリキーあり

replace

insert

690.37 s

662.00 s

92%

5%

stream

625.84 s

623.08 s

100%

4%

bulk_load_on_conflict

202.07 s

121.58 s

93%

80%

説明

書き込みモードは次の操作に対応します。

  • insert:INSERT INTO VALUES

  • stream:ストリームモードでの COPY

  • bulk_load:プライマリキーのないテーブルへの COPY インポート

  • bulk_load_on_conflict:プライマリキーのあるテーブルへの COPY インポート