はじめに
ClickHouseにはClickHouse間でデータをコピーしたり、リモートのClickHouseのデータをセレクトできるremote
と呼ばれる機能があります。
このremote
でClickHouse間を通信する際に、データの圧縮が行われているのか気になったのが今回の検証の動機です。
結論
サーバー間での通信に使用されるデータ圧縮は、デフォルトではLZ4でnetwork_compression_method
でセッティングできる。
例えば、圧縮アルゴリズムをZSTDにしたい場合は以下のように設定する。
set network_compression_method='ZSTD'
zstdが指定されている場合、network_zstd_compression_level
で圧縮レベルを指定できる。
検証
LZ4の場合(デフォルト)
圧縮方法の確認
SELECT name, value FROM system.settings WHERE name = 'network_compression_method'
┌─name───────────────────────┬─value─┐
│ network_compression_method │ LZ4 │
└────────────────────────────┴───────┘
クエリ実行
select 0 from remote('xxxx', system,numbers_mt, 'xxx', 'xxxx') limit 1e7 format Null;
0 rows in set. Elapsed: 0.032 sec. Processed 10.01 million rows, 80.06 MB (312.97 million rows/s., 2.50 GB/s.)
numbers_mt
については以下を参照。
ZSTDの場合
圧縮方法の確認
set network_compression_method='ZSTD';
SELECT name, value FROM system.settings WHERE name = 'network_compression_method'
┌─name───────────────────────┬─value─┐
│ network_compression_method │ ZSTD │
└────────────────────────────┴───────┘
クエリ実行
select 0 from remote('xxxx', system,numbers_mt, 'xxx', 'xxxx') limit 1e7 format Null;
0 rows in set. Elapsed: 0.016 sec. Processed 10.01 million rows, 80.06 MB (639.86 million rows/s., 5.12 GB/s.)
圧縮設定をしない場合
圧縮方法の確認
set network_compression_method='none';
SELECT name, value FROM system.settings WHERE name = 'network_compression_method'
┌─name───────────────────────┬─value─┐
│ network_compression_method │ none │
└────────────────────────────┴───────┘
クエリ実行
select 0 from remote('xxxx', system,numbers_mt, 'xxx', 'xxxx') limit 1e7 format Null;
0 rows in set. Elapsed: 0.091 sec. Processed 10.01 million rows, 80.06 MB (109.75 million rows/s., 877.98 MB/s.)
結果
それぞれの圧縮が効いていそうなことが分かりました。
圧縮方法 | パフォーマンス |
---|---|
LZ4(デフォルト) | 312.97 million rows/s., 2.50 GB/s. |
ZSTD | 639.86 million rows/s., 5.12 GB/s. |
圧縮なし | 109.75 million rows/s., 877.98 MB/s. |
参考