Hologres は、PostgreSQL プロトコルと互換性のあるワンストップのリアルタイムデータウェアハウスエンジンです。リアルタイムシナリオとオフラインシナリオの両方で、大量のデータ量の書き込み、更新、クエリをサポートします。このトピックでは、Spark から Hologres へのバッチ書き込みの性能テスト結果に基づき、さまざまなシナリオに最適な書き込みモードの選択に役立つ情報を提供します。
リアルタイムのデータ書き込みと更新については、「データ書き込み、更新、ポイントクエリのストレステスト」をご参照ください。
バッチ書き込みモードの比較
Hologres は、従来の COPY モード、COPY プロトコルに基づく FIXED COPY ストリーミングインポートモード、およびバッチインポートをストリーミング書き込みに変換する INSERT INTO VALUES モードなど、複数のバッチ書き込みモードをサポートしています。
次の表では、3 つの書き込みモードを詳細に比較しています。
|
特徴 |
COPY |
FIXED COPY |
INSERT INTO VALUES |
|
|
説明 |
プライマリキーのないテーブルへのバッチインポート |
プライマリキーのあるテーブルへのバッチインポート |
COPY プロトコルに基づくストリーミングインポートモード |
基本的なストリーミングインポートモード |
|
ユースケース |
|
|
|
|
|
ロックの粒度 |
行ロック |
行ロック |
行ロック |
行ロック |
|
データの可視性 |
COPY 操作の完了後に表示 |
COPY 操作の完了後に表示 |
リアルタイムで表示 |
リアルタイムで表示 |
|
パフォーマンス |
高 |
高 |
中 |
中 |
|
Hologres のリソース消費量 |
低 |
低 |
高 |
高 |
|
クライアントのリソース消費量 |
低 |
高 |
低 |
中 |
|
サポートされているプライマリキーの競合ポリシー |
該当なし |
|
|
|
バッチ書き込みモードの選択
バッチ書き込みシナリオでは、3 つのモードには次の機能があります。
-
COPY モード:従来の COPY モードは、Hologres のリソース消費を最小限に抑え、最高の書き込みパフォーマンスを発揮します。
-
FIXED COPY モード:COPY プロトコルに基づくストリーミングインポートモードです。行ロックのみを生成し、リアルタイムデータ可視性を提供します。
-
INSERT INTO VALUES モード:このモードはバッチインポートを従来のストリーミング書き込みに変換するため、バッチ書き込みシナリオでは大きな利点はありません。
説明INSERT INTO VALUES モードに明確な利点がないのは、バッチ書き込みシナリオの場合のみです。ただし、このモードはデータ撤回 (削除) をサポートする唯一のモードであり、バイナリログデータの書き込みといったユースケースで必要となります。
リアルタイムデータ可視性、ロックの粒度 (テーブルロックは同時書き込みタスクを妨げます)、またはデータソースの負荷に関する特定の要件がない限り、バッチ書き込みには COPY モードを使用することを推奨します。
-
Spark からのバッチ書き込みの場合:Hologres インスタンスを V2.2.25 以降にアップグレードし、コネクターの 書き込みパラメーター
write.modeをauto(デフォルト値) に設定することを推奨します。これにより、システムが最適なバッチ書き込みモードを自動的に選択します。 -
Flink からのバッチ書き込みの場合:まず、以下の決定木を使用して COPY モードまたは FIXED COPY モードのいずれかを選択します。次に、以下のパラメーターを設定します。
-
jdbccopywritemode:
TRUEに設定します。これにより、INSERT INTO VALUES モードの使用を防ぎます。 -
bulkload:要件に応じて、COPY モードの場合は
TRUEに、FIXED COPY モードの場合はFALSEに設定します。
-
次の決定木を使用して、シナリオに適したバッチ書き込みモードを選択してください。
バッチ書き込みの性能テスト
このテストでは、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.xJAR ファイルをダウンロードします。
次の表は、性能テストに使用した環境を示しています。
|
サービス |
バージョン |
仕様 |
|
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 |
該当なし |
テストデータの準備
-
ソースデータを準備します。
-
EMR Spark クラスターのマスターノードにログオンします。詳細については、「ECS インスタンスへの接続」をご参照ください。
-
TPC-H_Tools_v3.0.0.zip TPC-H ツールパッケージをダウンロードしてマスターノードの ECS インスタンスにコピーし、解凍してから
TPC-H_Tools_v3.0.0/TPC-H_Tools_v3.0.0/dbgenディレクトリに移動します。 -
dbgenディレクトリで次のコマンドを実行し、1 TB のテストデータセットとしてcustomer.tblファイルを生成します。./dbgen -s 1000 -T c次の表は、1 TB TPC-H データセット内の customer テーブルについて説明します。
項目
説明
フィールド数
8
フィールドタイプ
INT、BIGINT、TEXT、DECIMAL
行数
150,000,000
シャード数
40
-
-
テストデータを Spark にインポートします。
次のコマンドを実行して、customer.tbl ファイルを Spark クラスターにアップロードします。
hadoop fs -put customer.tbl <spark_resource>コマンド内の spark_resource は、EMR Spark クラスターの作成時に設定した [クラスターのルートストレージディレクトリ] を指します。
-
行-列ハイブリッドストレージ
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' );
パフォーマンス テスト
テスト設定
このトピックでは、さまざまなモードでのインポートパフォーマンスをテストします。
-
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ファイルを含むディレクトリです。 -
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:プライマリキーの競合が発生した場合、データは無視されます。パラメーターの詳細については、「パラメーター」をご参照ください。
-
テストシナリオ
|
テストシナリオ |
オプション |
|
テーブルストレージフォーマット |
|
|
データ更新方法 |
|
|
書き込みモード |
|
テスト結果
テスト結果には次のフィールドが含まれます。
|
フィールド |
説明 |
|
ジョブの合計実行時間 |
Spark ジョブの合計実行時間です。 この値は、EMR Spark クラスター ノード上の Spark SQL インタラクティブシェルで INSERT 操作を実行するのにかかった時間です。この時間はシェル出力の
|
|
平均データ書き込み時間 |
Spark クラスターのスケジューリング、データ読み取り、またはデータリシャッフルにかかった時間を除いた、書き込みジョブ自体の平均実行時間です。 Hologres コンソールの HoloWeb ページで、次の SQL ステートメントを実行して、シャードの同時実行数 (
次の表では、パラメーターについて説明します。
|
|
Hologres のロード |
Hologres インスタンスの CPU 使用率です。 CPU 使用率は、Hologres コンソールのインスタンスのMonitoring Information ページで確認できます。 |
|
Spark のロード |
EMR ノードのロードです。 EMR on ECS コンソールで、お使いのクラスターの[モニタリングと診断] >[メトリックモニタリング] タブに移動し、以下の設定を行います。
次に、[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 インポート