本ベンチマークテストでは、Yahoo Cloud Serving Benchmark(YCSB)を用いて、Apache HBase クラスターと Lindorm クラスターのスループット、レスポンスレイテンシー、および圧縮率を比較します。
テストワークフロー:
同一のテーブルスキーマを使用して、両クラスターにテーブルを作成します。
YCSB を使用して、20 億行のデータをロードします。
同一のスレッド数で、4 つのシナリオにおいてスループットテストを実行します。
固定の OPS 目標値で、同一の 4 つのシナリオにおいてレスポンスレイテンシーテストを実行します。
4 つのカラム数/サイズの組み合わせについて、圧縮率テストを実行します。
テーブルの作成
両クラスターとも、YCSB データに基づく 200 の事前分割パーティションを持つ同一のテーブルスキーマを使用します。
Lindorm Shell を使用してテーブルを作成する手順については、「Lindorm Shell を使用して LindormTable に接続する」をご参照ください。
Lindorm クラスター — INDEX エンコーディング(DATA_BLOCK_ENCODING を DIFF に設定することで有効化される Lindorm 専用のアルゴリズム)および Zstandard (ZSTD) 圧縮:
create 'test', {NAME => 'f', DATA_BLOCK_ENCODING => 'DIFF', COMPRESSION => 'ZSTD'}, {SPLITS => (1..199).map{|i| "user#{(i * ((2**63-1)/199)).to_s.rjust(19, "0")}"} }Apache HBase クラスター — Apache HBase の推奨に従い、DIFF エンコーディングおよび SNAPPY 圧縮を使用:
create 'test', {NAME => 'f', DATA_BLOCK_ENCODING => 'DIFF', COMPRESSION => 'SNAPPY'}, {SPLITS => (1..199).map{|i| "user#{(i * ((2**63-1)/199)).to_s.rjust(19, "0")}"} }データのロード
各テーブルには、20 億行、1 行あたり 20 カラム、1 カラムあたり 20 バイトのデータが格納されます。
YCSB プロファイル:
recordcount=2000000000
operationcount=150000000
workload=com.yahoo.ycsb.workloads.CoreWorkload
readallfields=false
fieldcount=20
fieldlength=20
readproportion=1.0
updateproportion=0.0
scanproportion=0
insertproportion=0
requestdistribution=uniformデータロードには、以下のコマンドを実行します:
bin/ycsb load hbase10 -P <workload> -p table=test -threads 200 -p columnfamily=f -sスループットテスト
スループットテストでは、両クラスターに対して同一のスレッド数で各シナリオを実行します。4 つのシナリオは互いに独立しています。
すべてのシナリオで `maxexecutiontime=1200`(20 分間実行)を指定します。読み取りシナリオでは、正式なテストの前に 20 分間のウォームアップを実行します。また、正式テスト開始前に、マジョーコンパクションを実行し、完了を待機します。
単一行読み取り
高同時実行数のポイント検索をシミュレートします。20 億行のデータセット内の 1,000 万行のクエリ範囲から、1 行ずつ読み取ります。クエリ範囲(recordcount=10000000)は、現実的なデータ量に対するホットスポット読み取りパターンをシミュレートするために、全データセットよりも小さくなっています。
| パラメーター | 値 |
|---|---|
| データセットの行数 | 20億 |
| クエリ範囲 | 1,000 万行 |
| 1 行あたりのカラム数 | 20 |
| カラムサイズ | 20 バイト |
| スレッド | 200 |
| ウォームアップ時間 | 20 分 |
| 正式テスト | 20 分 |
YCSB プロファイル:
recordcount=10000000
operationcount=2000000000
workload=com.yahoo.ycsb.workloads.CoreWorkload
readallfields=false
fieldcount=20
fieldlength=20
readproportion=1.0
updateproportion=0.0
scanproportion=0
insertproportion=0
requestdistribution=uniform負荷テストコマンド:
bin/ycsb run hbase10 -P <workload> -p table=test -threads 200 -p columnfamily=f -p maxexecutiontime=1200範囲スキャン
バッチスキャンワークロードをシミュレートします。1,000 万行のクエリ範囲から、1 回のスキャンにつき連続する 50 行を読み取ります。
| パラメーター | 値 |
|---|---|
| データセットの行数 | 20億 |
| クエリ範囲 | 1,000 万行 |
| 1 行あたりのカラム数 | 20 |
| カラムサイズ | 20 バイト |
| 1 回のスキャンあたりの行数 | 50 |
| スレッド数 | 100 |
| ウォームアップ | 20 分 |
| 正式テスト | 20 分 |
YCSB プロファイル:
recordcount=10000000
operationcount=2000000000
workload=com.yahoo.ycsb.workloads.CoreWorkload
readallfields=false
fieldcount=20
fieldlength=20
readproportion=0.0
updateproportion=0.0
scanproportion=1.0
insertproportion=0
requestdistribution=uniform
maxscanlength=50
Lindorm.usepagefilter=false負荷テストコマンド:
bin/ycsb run hbase10 -P <workload> -p table=test -threads 100 -p columnfamily=f -p maxexecutiontime=1200単一行挿入
高頻度の単一行書き込みワークロードをシミュレートします。1 回の操作で 1 カラム(20 バイト)を挿入します。
| パラメーター | 値 |
|---|---|
| 1 回の挿入あたりのカラム数 | 1 |
| カラムサイズ | 20 バイト |
| スレッド | 200 |
| テスト持続時間 | 20 分 |
YCSB プロファイル:
recordcount=2000000000
operationcount=100000000
workload=com.yahoo.ycsb.workloads.CoreWorkload
readallfields=false
fieldcount=1
fieldlength=20
readproportion=0.0
updateproportion=0.0
scanproportion=0
insertproportion=1.0
requestdistribution=uniform負荷テストコマンド:
bin/ycsb run hbase10 -P <workload> -p table=test -threads 200 -p columnfamily=f -p maxexecutiontime=1200バッチ挿入
バルク書き込みワークロードをシミュレートします。1 回の操作で 100 行分のバッチ(1 カラム/20 バイト)を挿入します。
| パラメーター | 値 |
|---|---|
| 1 回の挿入あたりのカラム数 | 1 |
| カラムサイズ | 20 バイト |
| バッチサイズ | 100 行 |
| スレッド数 | 100 |
| テスト持続時間 | 20 分 |
YCSB プロファイル:
recordcount=2000000000
operationcount=10000000
workload=com.yahoo.ycsb.workloads.CoreWorkload
fieldcount=1
fieldlength=20
cyclickey=true
readallfields=false
readproportion=0
updateproportion=0
scanproportion=0
insertproportion=0.0
batchproportion=1.0
batchsize=100
requestdistribution=uniform負荷テストコマンド:
bin/ycsb run hbase10 -P <workload> -p table=test -threads 100 -p columnfamily=f -p maxexecutiontime=1200レスポンスレイテンシーテスト
レスポンスレイテンシーテストでは、スループットテストと同じワークロード構成を使用しますが、OPS を固定値に制限するための -p target=<N> フラグを追加します。これにより、両クラスター間でロードを同一に保つため、レイテンシーの差異はロードの変動によるものではなく、クラスターのパフォーマンスによるものとなります。
単一行読み取り
| パラメーター | 値 |
|---|---|
| クエリ範囲 | 1,000 万行 |
| 1 行あたりのカラム数 | 20 |
| カラムサイズ | 20 バイト |
| スレッド数 | 200 |
| 最大 OPS | 5,000 |
| ウォームアップ | 20 分 |
| 正式テスト | 20 分 |
YCSB プロファイル:「単一行読み取りスループットテスト」と同一です。
負荷テストコマンド:
bin/ycsb run hbase10 -P <workload> -p table=test -threads 200 -p columnfamily=f -p maxexecutiontime=1200 -p target=5000範囲スキャン
| パラメーター | 値 |
|---|---|
| クエリ範囲 | 1,000 万行 |
| 1 回のスキャンあたりの行数 | 50 |
| スレッド数 | 100 |
| 最大 OPS | 5,000 |
| ウォームアップ | 20 分 |
| 正式テスト | 20 分 |
YCSB プロファイル:「範囲スキャンスループットテスト」と同一です。
負荷テストコマンド:
bin/ycsb run hbase10 -P <workload> -p table=test -threads 100 -p columnfamily=f -p maxexecutiontime=1200 -p target=5000単一行挿入
| パラメーター | 値 |
|---|---|
| 1 回の挿入あたりのカラム数 | 1 |
| カラムサイズ | 20 バイト |
| スレッド数 | 200 |
| 最大 OPS | 50,000 |
| テスト持続時間 | 20 分 |
YCSB プロファイル:「単一行挿入スループットテスト」と同一です。
負荷テストコマンド:
bin/ycsb run hbase10 -P <workload> -p table=testwrite -threads 200 -p columnfamily=f -p maxexecutiontime=1200 -p target=50000バッチ挿入
| パラメーター | 値 |
|---|---|
| 1 回の挿入あたりのカラム数 | 1 |
| カラムサイズ | 20 バイト |
| バッチサイズ | 100 行 |
| スレッド数 | 100 |
| 最大 OPS | 2,000 |
| テスト持続時間 | 20 分 |
YCSB プロファイル:「バッチ挿入スループットテスト」と同一です。
負荷テストコマンド:
bin/ycsb run hbase10 -P <workload> -p table=testwrite -threads 100 -p columnfamily=f -p maxexecutiontime=1200 -p target=2000圧縮率テスト
各圧縮率テストでは、500 万行のデータを両クラスターにロードした後、フラッシュおよびマジョーコンパクションを手動で実行します。コンパクション完了後に、両クラスターにおけるディスク上のテーブルサイズを比較します。
以下のカラム構成ごとに、このプロシージャを実行します:
| 1 行あたりのカラム数 | カラムサイズ(バイト) |
|---|---|
| 1 | 10 |
| 20 | 10 |
| 20 | 20 |
| 100 | 10 |
YCSB プロファイル(上記表の値を `<fieldcount>` および `<fieldlength>` にそれぞれ置き換えます):
recordcount=5000000
operationcount=150000000
workload=com.yahoo.ycsb.workloads.CoreWorkload
readallfields=false
fieldcount=<fieldcount>
fieldlength=<fieldlength>
readproportion=1.0
requestdistribution=uniformデータロードコマンド:
bin/ycsb load hbase10 -P <workload> -p table=test -threads 200 -p columnfamily=f -sロード後、手動でフラッシュおよびマジョーコンパクションを実行し、両クラスターのテーブルサイズを確認します。