カサンドラに多数のレコード(一度に5百万件以上)を書き込もうとしています。これらはタブで区切られたファイルから読み込まれ、executeAsyncを使用してCassandraにインポートされます。 私たちはより一般的になるより小さなデータセット(〜330kレコード)を使用してきました。最近まで、私たちのスクリプトは約65kレコードでのインポートを静かに止めていました。 RAMを2Gbから4Gbにアップグレードして以来、インポートするレコードの数は倍増していますが、まだすべてのレコードを正常にインポートしていません。多数の書き込みを実行するときのカサンドラの問題
これは私たちが現在動作しているプロセスの例です:
$cluster = \Cassandra::cluster()->withContactPoints('127.0.0.1')->build();
$session = $cluster->connect('example_data');
$statement = $session->prepare("INSERT INTO example_table (example_id, column_1, column_2, column_3, column_4, column_5, column_6) VALUES (uuid(), ?, ?, ?, ?, ?, ?)");
$futures = array();
$data = array();
foreach ($results as $row) {
$data = array($row[‘column_1’], $row[‘column_2’], $row[‘column_3’], $row[‘column_4’], $row[‘column_5’], $row[‘column_6’]);
$futures = $session->executeAsync($statement, new \Cassandra\ExecutionOptions(array(
'arguments' => $data
)));
}
私たちは、これがダウンスペースが不足してヒープにあるかもしれないことを疑う:
DEBUG [SlabPoolCleaner] 2017-02-27 17:01:17,105 ColumnFamilyStore.java:1153 - Flushing largest CFS(Keyspace='dev', ColumnFamily='example_data') to free up room. Used total: 0.67/0.00, live: 0.33/0.00, flushing: 0.33/0.00, this: 0.20/0.00
DEBUG [SlabPoolCleaner] 2017-02-27 17:01:17,133 ColumnFamilyStore.java:854 - Enqueuing flush of example_data: 89516255 (33%) on-heap, 0 (0%) off-heap
私たちはテーブル挿入このデータは次のとおりです。
CREATE TABLE example_data (
example_id uuid PRIMARY KEY,
column_1 int,
column_2 varchar,
column_3 int,
column_4 varchar,
column_5 int,
column_6 int
);
CREATE INDEX column_5 ON example_data (column_5);
CREATE INDEX column_6 ON example_data (column_6);
私たちは、バッチ法が、Bを使用しようとしましたCassandraプロセスを高いCPU使用率(〜85%)で実行させるため、ここでは適切ではありません。
リポジトリから入手可能な最新バージョンのDSE/Cassandraを使用しています。
ありがとう@Chris、私たちは今すぐうまく動作しています。スロットルについては、DataStax phpドライバに組み込まれているものがありますか? – deano23
いいえ、私は十分に非同期メソッドを扱う良い方法を知っているphpに精通していません。おそらくリストに先物を入れ、リストが> 1000かそれとも最初のものを引っ張って 'get'をするのであれば、あなたは常に約1000人の飛行機を持っています。その数を微調整して、いくつかの性能数値に基づいて調整することができます(このような小型システムでは低いかもしれません)。 –
ありがとう、クリス、これはとても役に立ちます。 – deano23