二人のダコヅナの戊い、たたは Cassandra 察 HBase。 ズベルバンクのチヌム経隓

これは冗談ではなく、この特定の図がこれらのデヌタベヌスの本質を最も正確に反映しおいるようで、最終的にはその理由が明らかになるでしょう。

二人のダコヅナの戊い、たたは Cassandra 察 HBase。 ズベルバンクのチヌム経隓

DB-Engines ランキングによるず、NoSQL 列型デヌタベヌスで最も人気のある XNUMX ぀は、Cassandra (以䞋、CS) ず HBase (HB) です。

二人のダコヅナの戊い、たたは Cassandra 察 HBase。 ズベルバンクのチヌム経隓

運呜の意志により、ズベルバンクのデヌタ読み蟌み管理チヌムはすでに 長いです HBず緊密に連携しおいたす。 この間、私たちはその長所ず短所をよく研究し、調理方法を孊びたした。 しかし、CS ずいう代替案の存圚により、私たちは垞に疑念を抱いお自分自身を少し苊しめざるを埗たせんでした。「私たちの遞択は正しかったのだろうか?」 さらに、結果は、 比范DataStax が実行した結果では、CS がほが圧倒的なスコアで HB を簡単に砎ったず蚀われおいたす。 䞀方、DataStax は利害関係者であるため、その蚀葉を鵜呑みにするべきではありたせん。 たた、テスト条件に関する情報がかなり少なくお混乱したため、誰が BigData NoSql の王者なのかを自分たちで調べおみるこずにしたした。埗られた結果は非垞に興味深いものでした。

ただし、実行されたテストの結果に進む前に、環境構成の重芁な偎面を説明する必芁がありたす。 実際、CS はデヌタ損倱が蚱容されるモヌドで䜿甚される可胜性がありたす。 それらの。 これは、XNUMX ぀のサヌバヌ (ノヌド) だけが特定のキヌのデヌタを担圓する堎合であり、䜕らかの理由で倱敗するず、このキヌの倀は倱われたす。 倚くのタスクでは、これは重芁ではありたせんが、銀行郚門では、これは原則ではなく䟋倖です。 私たちの堎合、信頌性の高い保管のためにデヌタのコピヌをいく぀か甚意するこずが重芁です。

したがっお、トリプル レプリケヌション モヌドの CS 動䜜モヌドのみが考慮されたした。 ケヌススペヌスの䜜成は、次のパラメヌタヌを䜿甚しお実行されたした。

CREATE KEYSPACE ks WITH REPLICATION = {'class' : 'NetworkTopologyStrategy', 'datacenter1' : 3};

次に、必芁なレベルの䞀貫性を確保するには XNUMX ぀の方法がありたす。 原則
北西 + NR > RF

぀たり、曞き蟌み時のノヌドからの確認数 (NW) ず読み取り時のノヌドからの確認数 (NR) の合蚈がレプリケヌション係数より倧きくなければなりたせん。 この堎合、RF = 3 です。これは、次のオプションが適切であるこずを意味したす。
2 + 2> 3
3 + 1> 3

デヌタをできるだけ確実に保存するこずが基本的に重芁であるため、3+1 スキヌムが遞択されたした。 さらに、HB も同様の原理で動䜜したす。 そのような比范はより公平になりたす。

DataStax は調査では逆のこずを行い、CS ず HB の䞡方に RF = 1 を蚭定したこずに泚意しおください (埌者の堎合は HDFS 蚭定を倉曎したした)。 この堎合の CS パフォヌマンスぞの圱響は非垞に倧きいため、これは非垞に重芁な偎面です。 たずえば、以䞋の図は、CS ぞのデヌタのロヌドに必芁な時間の増加を瀺しおいたす。

二人のダコヅナの戊い、たたは Cassandra 察 HBase。 ズベルバンクのチヌム経隓

ここでは、次のこずがわかりたす。競合するスレッドがデヌタを曞き蟌むほど、時間がかかりたす。 これは圓然のこずですが、RF=3 のパフォヌマンス䜎䞋が倧幅に倧きいこずが重芁です。 ぀たり、4 ぀のスレッドをそれぞれ 5 ぀のテヌブル (合蚈 20) に曞き蟌むず、RF=3 は玄 2 倍の損倱になりたす (RF=150 では 3 秒、RF=75 では 1 秒)。 しかし、それぞれ 8 ぀のスレッドを持぀ 5 ぀のテヌブル (合蚈 40) にデヌタをロヌドしお負荷を増やすず、RF=3 の損倱はすでに 2,7 倍になりたす (375 秒察 138)。

おそらくこれが、DataStax for CS によっお実行された負荷テストが成功した秘密の䞀郚です。なぜなら、私たちのスタンドの HB では、レプリケヌション係数を 2 から 3 に倉曎しおも効果がなかったからです。 それらの。 この構成では、ディスクは HB ボトルネックではありたせん。 ただし、ここには他にも倚くの萜ずし穎がありたす。なぜなら、私たちのバヌゞョンの HB にはわずかにパッチず埮調敎が加えられおいるこず、環境が完党に異なるこずなどに泚意する必芁があるからです。 おそらく私が CS を正しく準備する方法を知らないだけで、CS を䜿甚するより効果的な方法がいく぀かあるこずも泚目に倀したす。コメントで芋぀けられるこずを願っおいたす。 しかし、たず最初に。

すべおのテストは、それぞれ次の構成を持぀ 4 台のサヌバヌで構成されるハヌドりェア クラスタヌ䞊で実行されたした。

CPU: Xeon E5-2680 v4 @ 2.40GHz 64 スレッド。
ディスク: 12 個の SATA HDD
Java バヌゞョン: 1.8.0_111

CSバヌゞョン3.11.5

cassandra.ymlのパラメヌタトヌクン数: 256
hinted_handoff_enabled: true
hinted_handoff_throttle_in_kb: 1024
max_hints_delivery_threads: 2
ヒントディレクトリ: /data10/cassandra/hints
hint_flush_period_in_ms: 10000
max_hints_file_size_in_mb: 128
バッチログ_リプレむ_スロットル_in_kb: 1024
認蚌子:AllowAllAuthenticator
オヌ゜ラむザヌ:AllowAllAuthorizer
role_manager: CassandraRoleManager
ロヌル有効期限: 2000
蚱可有効期限: 2000
credentials_validity_in_ms: 2000
パヌティショナヌ: org.apache.cassandra.dht.Murmur3Partitioner
デヌタファむルディレクトリ:
- /data1/cassandra/data # 各 dataN ディレクトリは個別のディスクです
- /data2/cassandra/data
- /data3/cassandra/data
- /data4/cassandra/data
- /data5/cassandra/data
- /data6/cassandra/data
- /data7/cassandra/data
- /data8/cassandra/data
commitlog_directory: /data9/cassandra/commitlog
cdc_enabled: false
ディスク障害ポリシヌ: 停止
commit_failure_policy: 停止
prepare_statements_cache_size_mb:
thrift_prepared_statements_cache_size_mb:
key_cache_size_in_mb:
キヌキャッシュ保存期間: 14400
row_cache_size_in_mb: 0
行キャッシュ保存期間: 0
counter_cache_size_in_mb:
カりンタキャッシュ保存期間: 7200
保存されたキャッシュディレクトリ: /data10/cassandra/saved_caches
commitlog_sync: 定期的
commitlog_sync_period_in_ms: 10000
commitlog_segment_size_in_mb: 32
シヌドプロバむダヌ:
- クラス名: org.apache.cassandra.locator.SimpleSeedProvider
パラメヌタ
— シヌド: "*,*"
concurrent_reads: 256 # 詊行回数 64 - 違いは認められたせんでした
concurrent_writes: 256 # 詊行回数 64 - 違いは認められたせんでした
concurrent_counter_writes: 256 # 詊行回数 64 - 違いは認められたせんでした
concurrent_materialized_view_writes: 32
memtable_heap_space_in_mb: 2048 # 16 GB を詊したした - 遅かったです
memtable_allocation_type: heap_buffers
Index_summary_capacity_in_mb:
Index_summary_resize_interval_in_ minutes: 60
trickle_fsync: false
trickle_fsync_interval_in_kb: 10240
ストレヌゞポヌト: 7000
ssl_storage_port: 7001
リッスンアドレス: *
ブロヌドキャストアドレス: *
listen_on_broadcast_address: true
internode_authenticator: org.apache.cassandra.auth.AllowAllInternodeAuthenticator
start_native_transport: true
ネむティブトランスポヌトポヌト: 9042
start_rpc: true
rpc_アドレス: *
rpc_ポヌト: 9160
rpc_keepalive: true
rpc_server_type: 同期
thrift_framed_transport_size_in_mb: 15
増分バックアップ: false
スナップショット前の圧瞮: false
auto_snapshot: true
kb の列むンデックス サむズ: 64
column_index_cache_size_in_kb: 2
concurrent_compactors: 4
圧瞮スルヌプット_mb_per_sec: 1600
sstable_preemptive_open_interval_in_mb: 50
read_request_timeout_in_ms: 100000
range_request_timeout_in_ms: 200000
write_request_timeout_in_ms: 40000
counter_write_request_timeout_in_ms: 100000
cas_contention_timeout_in_ms: 20000
truncate_request_timeout_in_ms: 60000
request_timeout_in_ms: 200000
low_query_log_timeout_in_ms: 500
クロスノヌドタむムアりト: false
endpoint_snitch: GossipingPropertyFileSnitch
Dynamic_snitch_update_interval_in_ms: 100
Dynamic_snitch_reset_interval_in_ms: 600000
動的スニッチ䞍良閟倀: 0.1
request_scheduler: org.apache.cassandra.scheduler.NoScheduler
サヌバヌ暗号化オプション:
ノヌド間暗号化: なし
client_encryption_options:
有効: false
ノヌド間圧瞮: DC
inter_dc_tcp_nolay: false
トレヌスタむプ_ク゚リ_ttl: 86400
トレヌスタむプ_修埩_ttl: 604800
ナヌザヌ定矩関数を有効にする: false
スクリプト化されたナヌザヌ定矩関数を有効にする: false
りィンドりタむマヌ間隔: 1
透明デヌタ暗号化オプション:
有効: false
tombstone_warn_threshold: 1000
tombstone_failure_threshold: 100000
バッチサむズ譊告閟倀in_kb: 200
バッチサむズフェむル閟倀in_kb: 250
unlogged_batch_across_partitions_warn_threshold: 10
圧瞮_倧芏暡パヌティション_è­Šå‘Š_しきい倀_mb: 100
gc_warn_threshold_in_ms: 1000
back_pressure_enabled: false
Enable_materialized_views: true
Enable_sasi_indexes: true

GC 蚭定:

### CMS 蚭定-XX:+UseParNewGC
-XX:+UseConcMarkSweatGC
-XX:+CMSParallelRemarkEnabled
-XX:生存率=8
-XX:MaxTenuringThreshold=1
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSWaitDuration=10000
-XX:+CMSParallelInitialMarkEnabled
-XX:+CMSEdenChunksRecordAlways
-XX+ CMSClassUnloadingEnabled

jvm.options メモリには 16 GB が割り圓おられたした (32 GB も詊したしたが、違いは認められたせんでした)。

テヌブルは次のコマンドで䜜成されたした。

CREATE TABLE ks.t1 (id bigint PRIMARY KEY, title text) WITH compression = {'sstable_compression': 'LZ4Compressor', 'chunk_length_kb': 64};

HB バヌゞョン: 1.2.0-cdh5.14.2 (クラス org.apache.hadoop.hbase.regionserver.HRegion では、RegionServer 䞊のリヌゞョン数が 1000 を超えたずきに GC を匕き起こす MetricsRegion を陀倖したした)

デフォルト以倖の HBase パラメヌタ動物園キヌパヌ.セッション.タむムアりト: 120000
hbase.rpc.timeout: 2 分
hbase.client.scanner.timeout.period: 2 分
hbase.master.handler.count: 10
hbase.regionserver.lease.period、hbase.client.scanner.timeout.period: 2 分
hbase.regionserver.handler.count: 160
hbase.regionserver.metahandler.count: 30
hbase.regionserver.logroll.期間: 4 時間
hbase.regionserver.maxlogs: 200
hbase.hregion.memstore.flush.size: 1 GiB
hbase.hregion.memstore.block.multiplier: 6
hbase.hstore.compactionThreshold: 5
hbase.hstore.blockingStoreFiles: 200
hbase.hregion.majorcompaction: 1 日
hbase-site.xml の HBase サヌビス詳现構成スニペット (安党バルブ):
hbase.regionserver.wal.codecorg.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec
hbase.master.namespace.init.timeout3600000
hbase.regionserver.optionalcacheflushinterval18000000
hbase.regionserver.thread.compaction.large12
hbase.regionserver.wal.enablecompressiontrue
hbase.hstore.compaction.max.size1073741824
hbase.server.compactchecker.interval.multiplier200
HBase RegionalServer の Java 構成オプション:
-XX:+UseParNewGC -XX:+UseConcMarkSoupGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:ReservedCodeCacheSize=256m
hbase.snapshot.master.timeoutMillis: 2 分
hbase.snapshot.region.timeout: 2 分
hbase.snapshot.master.timeout.millis: 2 分
HBase REST サヌバヌの最倧ログ サむズ: 100 MiB
HBase REST サヌバヌの最倧ログ ファむル バックアップ: 5
HBase Thrift サヌバヌの最倧ログ サむズ: 100 MiB
HBase Thrift Server の最倧ログ ファむル バックアップ: 5
マスタヌ最倧ログ サむズ: 100 MiB
マスタヌログファむルの最倧バックアップ数: 5
リヌゞョンサヌバヌの最倧ログサむズ: 100 MiB
RegionalServer の最倧ログ ファむル バックアップ: 5
HBase アクティブ マスタヌ怜出りィンドり: 4 分
dfs.client.hedged.read.threadpool.size: 40
dfs.client.hedged.read.threshold.millis: 10 ミリ秒
hbase.rest.threads.min: 8
hbase.rest.threads.max: 150
最倧プロセス ファむル蚘述子: 180000
hbase.thrift.minWorkerThreads: 200
hbase.master.executor.openregion.threads: 30
hbase.master.executor.closeregion.threads: 30
hbase.master.executor.serverops.threads: 60
hbase.regionserver.thread.compaction.small: 6
hbase.ipc.server.read.threadpool.size: 20
リヌゞョンムヌバヌスレッド: 6
クラむアント Java ヒヌプ サむズ (バむト単䜍): 1 GiB
HBase REST サヌバヌのデフォルト グルヌプ: 3 GiB
HBase Thrift サヌバヌのデフォルト グルヌプ: 3 GiB
HBase マスタヌの Java ヒヌプ サむズ (バむト単䜍): 16 GiB
HBase RegionalServer の Java ヒヌプ サむズ (バむト単䜍): 32 GiB

+動物園の飌育員
maxClientCnxns: 601
maxSessionTimeout: 120000
テヌブルの䜜成:
hbase org.apache.hadoop.hbase.util.RegionSplitter ns:t1 UniformSplit -c 64 -f cf
alter 'ns:t1'、{NAME => 'cf'、DATA_BLOCK_ENCODING => 'FAST_DIFF'、COMPRESSION => 'GZ'}

ここで重芁な点が 64 ぀ありたす。DataStax の説明には、HB テヌブルの䜜成に䜿甚されたリヌゞョンの数が蚘茉されおいたせんが、これは倧容量の堎合には重芁です。 したがっお、テストでは数量 = 640 が遞択され、最倧 XNUMX GB、぀たり XNUMX GB たでの保存が可胜になりたす。 䞭くらいの倧きさのテヌブル。

テストの時点で、HBase には 22 のテヌブルず 67 のリヌゞョンがありたした (これは、䞊蚘のパッチがなければバヌゞョン 1.2.0 にずっお臎呜的でした)。

さお、コヌドです。 特定のデヌタベヌスに察しおどの構成がより有利であるかが明確ではなかったため、テストはさたざたな組み合わせで実行されたした。 それらの。 䞀郚のテストでは、4 ぀のテヌブルが同時にロヌドされたした (4 ぀のノヌドすべおが接続に䜿甚されたした)。 他のテストでは、8 ぀の異なるテヌブルを䜿甚したした。 バッチ サむズが 100 の堎合もあれば、200 の堎合もありたした (バッチ パラメヌタヌ - 以䞋のコヌドを参照)。 valueのデヌタサむズは10バむトたたは100バむト(dataSize)です。 合蚈で、毎回 5 䞇件のレコヌドが各テヌブルに曞き蟌たれ、読み取られたした。 同時に、5 ぀のスレッドが各テヌブル (スレッド番号 - thNum) に曞き蟌み/読み取りされ、それぞれが独自のキヌ範囲 (カりント = 1 侇) を䜿甚したした。

if (opType.equals("insert")) {
    for (Long key = count * thNum; key < count * (thNum + 1); key += 0) {
        StringBuilder sb = new StringBuilder("BEGIN BATCH ");
        for (int i = 0; i < batch; i++) {
            String value = RandomStringUtils.random(dataSize, true, true);
            sb.append("INSERT INTO ")
                    .append(tableName)
                    .append("(id, title) ")
                    .append("VALUES (")
                    .append(key)
                    .append(", '")
                    .append(value)
                    .append("');");
            key++;
        }
        sb.append("APPLY BATCH;");
        final String query = sb.toString();
        session.execute(query);
    }
} else {
    for (Long key = count * thNum; key < count * (thNum + 1); key += 0) {
        StringBuilder sb = new StringBuilder("SELECT * FROM ").append(tableName).append(" WHERE id IN (");
        for (int i = 0; i < batch; i++) {
            sb = sb.append(key);
            if (i+1 < batch)
                sb.append(",");
            key++;
        }
        sb = sb.append(");");
        final String query = sb.toString();
        ResultSet rs = session.execute(query);
    }
}

したがっお、同様の機胜が HB にも提䟛されたした。

Configuration conf = getConf();
HTable table = new HTable(conf, keyspace + ":" + tableName);
table.setAutoFlush(false, false);
List<Get> lGet = new ArrayList<>();
List<Put> lPut = new ArrayList<>();
byte[] cf = Bytes.toBytes("cf");
byte[] qf = Bytes.toBytes("value");
if (opType.equals("insert")) {
    for (Long key = count * thNum; key < count * (thNum + 1); key += 0) {
        lPut.clear();
        for (int i = 0; i < batch; i++) {
            Put p = new Put(makeHbaseRowKey(key));
            String value = RandomStringUtils.random(dataSize, true, true);
            p.addColumn(cf, qf, value.getBytes());
            lPut.add(p);
            key++;
        }
        table.put(lPut);
        table.flushCommits();
    }
} else {
    for (Long key = count * thNum; key < count * (thNum + 1); key += 0) {
        lGet.clear();
        for (int i = 0; i < batch; i++) {
            Get g = new Get(makeHbaseRowKey(key));
            lGet.add(g);
            key++;
        }
        Result[] rs = table.get(lGet);
    }
}

HB ではクラむアントがデヌタの均䞀な分散を凊理する必芁があるため、キヌの゜ルティング関数は次のようになりたす。

public static byte[] makeHbaseRowKey(long key) {
    byte[] nonSaltedRowKey = Bytes.toBytes(key);
    CRC32 crc32 = new CRC32();
    crc32.update(nonSaltedRowKey);
    long crc32Value = crc32.getValue();
    byte[] salt = Arrays.copyOfRange(Bytes.toBytes(crc32Value), 5, 7);
    return ArrayUtils.addAll(salt, nonSaltedRowKey);
}

さお、最も興味深い郚分、結果は次のずおりです。

二人のダコヅナの戊い、たたは Cassandra 察 HBase。 ズベルバンクのチヌム経隓

同じこずをグラフ圢匏で衚瀺するず、次のようになりたす。

二人のダコヅナの戊い、たたは Cassandra 察 HBase。 ズベルバンクのチヌム経隓

HB の利点は非垞に驚くべきものであるため、CS セットアップに䜕らかのボトルネックがあるのではないかず疑われるほどです。 ただし、Google で最も明癜なパラメヌタ (concurrent_writes や memtable_heap_space_in_mb など) を怜玢しおも速床は䞊がりたせんでした。 同時に、ログはクリヌンであり、䜕も悪口を蚀っおいたせん。

デヌタはノヌド党䜓に均等に分散され、すべおのノヌドからの統蚈はほが同じでした。

これは、ノヌドの XNUMX ぀からのテヌブル統蚈がどのように芋えるかです。キヌスペヌス: ks
読み取り数: 9383707
読み取りレむテンシ: 0.04287025042448576 ミリ秒
曞き蟌み数: 15462012
曞き蟌みレむテンシ: 0.1350068438699957 ミリ秒
保留䞭のフラッシュ: 0
テヌブル: t1
SSTテヌブル数16
䜿甚容量 (ラむブ): 148.59 MiB
䜿甚容量 (合蚈): 148.59 MiB
スナップショットによっお䜿甚されるスペヌス (合蚈): 0 バむト
䜿甚されおいるオフヒヌプ メモリ (合蚈): 5.17 MiB
SSTable圧瞮率: 0.5720989576459437
パヌティション数掚定3970323
Memtable セル数: 0
Memtable デヌタサむズ: 0 バむト
䜿甚されおいる Memtable オフヒヌプ メモリ: 0 バむト
Memtable スむッチ数: 5
ロヌカル読み取り数: 2346045
ロヌカル読み取りレむテンシヌ: NaN ミリ秒
ロヌカル曞き蟌み数: 3865503
ロヌカル曞き蟌みレむテンシ: NaN ミリ秒
保留䞭のフラッシュ: 0
修埩率: 0.0
ブルヌムフィルタヌの誀怜知: 25
ブルヌムフィルタヌ停率0.00000
䜿甚されるブルヌム フィルタヌ スペヌス: 4.57 MiB
ブルヌム フィルタヌ オフ ヒヌプ メモリ䜿甚量: 4.57 MiB
むンデックスの抂芁オフヒヌプ メモリ䜿甚量: 590.02 KiB
䜿甚されるヒヌプ メモリからの圧瞮メタデヌタ: 19.45 KiB
圧瞮されたパヌティションの最小バむト数: 36
圧瞮されたパヌティションの最倧バむト数: 42
圧瞮されたパヌティションの平均バむト数: 42
スラむスあたりの平均生现胞 (最埌の XNUMX 分間): NaN
スラむスあたりの最倧生现胞数 (最埌の 0 分間): XNUMX
スラむスごずの平均トゥヌムストヌン (過去 XNUMX 分間): NaN
スラむスごずの最倧トゥヌムストヌン (過去 0 分間): XNUMX
ドロップされた突然倉異: 0 バむト

バッチのサむズを枛らそうずしおも (個別に送信しおも) 効果はなく、状況は悪化するだけでした。 CS で埗られる結果は、XNUMX 秒あたり玄数十䞇回の操䜜ずいう DataStax で埗られる結果ず䌌おいるため、実際にはこれが CS の最倧パフォヌマンスである可胜性がありたす。 さらに、リ゜ヌス䜿甚率を芋るず、CS がより倚くの CPU ずディスクを䜿甚しおいるこずがわかりたす。

二人のダコヅナの戊い、たたは Cassandra 察 HBase。 ズベルバンクのチヌム経隓
この図は、䞡方のデヌタベヌスのすべおのテストを連続しお実行したずきの䜿甚率を瀺しおいたす。

HBの匷力な読みのアドバンテヌゞに぀いお。 ここでは、どちらのデヌタベヌスでも、読み取り䞭のディスク䜿甚率が非垞に䜎いこずがわかりたす (読み取りテストは各デヌタベヌスのテスト サむクルの最埌の郚分です。たずえば、CS の堎合、これは 15:20 から 15:40 たでです)。 HB の堎合、理由は明らかです。ほずんどのデヌタはメモリ内、memstore 内でハングし、䞀郚はブロックキャッシュにキャッシュされたす。 CS に関しおは、仕組みがよくわかりたせんが、ディスクのリサむクルも衚瀺されたせんが、念のため、キャッシュ row_cache_size_in_mb = 2048 を有効にしお、caching = {'keys': 'ALL', を蚭定しおみたした。 'rows_per_partition': ' 2000000'} ですが、それがさらに状況をさらに悪化させたした。

HB のリヌゞョンの数に関する重芁な点ももう䞀床蚀及する䟡倀がありたす。 この䟋では、倀は 64 に指定されたした。これを枛らしお、たずえば 4 にするず、読み取り時の速床が 2 倍䜎䞋したす。 その理由は、memstore がより早くいっぱいになり、ファむルがより頻繁にフラッシュされ、読み取り時により倚くのファむルを凊理する必芁があるためです。これは HB にずっおかなり耇雑な操䜜です。 実際の状況では、これは事前分割ず圧瞮戊略を怜蚎するこずで察凊できたす。特に、ガベヌゞを収集し、バックグラりンドで垞に HFile を圧瞮する自䜜のナヌティリティを䜿甚したす。 DataStax テストでは、テヌブルごずに 1 ぀のリヌゞョンのみが割り圓おられた可胜性が高く (これは正しくありたせん)、これにより、HB が読み取りテストでそれほど劣っおいた理由がある皋床明確になりたす。

これから以䞋の暫定的な結論が導き出されたす。 テスト䞭に倧きなミスがなかったず仮定するず、カサンドラは粘土の足を持぀巚像のように芋えたす。 正確に蚀うず、蚘事冒頭の写真のように片足でバランスをずっおいる間は比范的良い成瞟を収めおいるのですが、同じ条件で戊うず完敗しおしたいたす。 同時に、ハヌドりェアの CPU 䜿甚率が䜎いこずを考慮しお、ホストごずに XNUMX ぀の RegionServer HB を配眮するこずを孊習し、それによりパフォヌマンスが XNUMX 倍になりたした。 それらの。 リ゜ヌスの掻甚を考慮するず、CS の状況はさらに悲惚です。

もちろん、これらのテストはかなり総合的なものであり、ここで䜿甚されたデヌタの量は比范的控えめです。 テラバむトに切り替えれば状況は倉わる可胜性がありたすが、HB ではテラバむトを読み蟌むこずができたすが、CS ではこれが問題であるこずが刀明したした。 これらのボリュヌムでも、応答を埅機するためのパラメヌタヌがデフォルトのパラメヌタヌず比范しおすでに数倍増加しおいるにもかかわらず、OperationTimedOutException がスロヌされるこずがよくありたした。

共同の努力でCSのボトルネックを芋぀け、それを早めるこずができれば、最終結果に぀いおは蚘事の最埌に必ず远蚘したいず思いたす。

UPD: 仲間のアドバむスのおかげで、なんずか読むスピヌドを䞊げるこずができたした。 だった
159 オペレヌション (644 テヌブル、4 ストリヌム、バッチ 5)。
远加者
.withLoadBalancingPolicy(new TokenAwarePolicy(DCAwareRoundRobinPolicy.builder().build()))
そしおスレッドの数をいじっおみたした。 結果は次のずおりです。
4 テヌブル、100 スレッド、バッチ = 1 (ピヌスごず): 301 ops
4 テヌブル、100 スレッド、バッチ = 10: 447 オペレヌション
4 テヌブル、100 スレッド、バッチ = 100: 625 オペレヌション

埌で、他のチュヌニングのヒントを適甚し、完党なテスト サむクルを実行しお、結果を投皿の最埌に远加したす。

出所 habr.com

コメントを远加したす