我们正在尝试将大量记录(一次超过 500 万条)写入 Cassandra。这些是从制表符分隔的文件中读取的,并正在使用 executeAsync 导入 Cassandra。我们一直在使用更小得多的数据集(约 33 万条记录),这将更常见。直到最近,我们的脚本一直在默默地停止导入大约 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);
我们曾尝试使用批处理方法,但认为这里不合适,因为它会导致 Cassandra 进程以较高的 CPU 使用率 (~85%) 运行。
我们正在使用存储库中提供的最新版本的 DSE/Cassandra。
Cassandra 3.0.11.1564 | DSE 5.0.6