我們正在嘗試將大量記錄(每次超過500萬個)寫入Cassandra。這些正在從製表符分隔的文件中讀取,並正在使用executeAsync導入到Cassandra中。 我們一直在使用更小的數據集(約330k條記錄),這將更常見。直到最近,我們的腳本一直在默默停止進口約65k的記錄。由於將RAM從2Gb升級到4Gb,導入的記錄數增加了一倍,但我們仍未成功導入所有記錄。Cassandra執行大量寫入操作時遇到的問題
這是我們目前運行的進程的一個例子:
$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 elieve在這裏並不合適,因爲它會導致Cassandra進程在高CPU使用率(〜85%)下運行。
我們正在使用存儲庫中提供的最新版本的DSE/Cassandra。
Cassandra 3.0.11.1564 | DSE 5.0.6
謝謝@Chris,我們的構建工作已經完成。關於節流,DataStax的PHP驅動程序中是否有內置的可用於此目的? – deano23
不,我對PHP不熟悉,不知道處理異步方法的好方法。可能會把期貨列入清單,如果清單是> 1000或者什麼東西來拉第一個,並做一個'get',那麼你就有大約1000個航班在任何時候。可以調整該數字,然後根據一些性能數字(對於這樣的小型系統可能較低)。 –
非常感謝Chris,這非常有幫助。 – deano23