我们正试图将大量记录(一次超过500万)写入Cassandra。这些是从制表符分隔文件中读取的,并使用executeAsync导入到Cassandra中。 我们一直在使用更小的数据集(~330k记录),这将更常见。直到最近,我们的脚本一直默默地停止导入大约65,000条记录。自从将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
答案 0 :(得分:1)
2gb(实际上是4gb)甚至不是Cassandra在开发或生产中推荐的最低值。可以运行它,但它需要更多的调整,因为它低于默认值的调整。即使经过调整,你也不应期望在开始遇到问题之前获得很多性能(你得到错误)并且你需要添加更多节点。
https://docs.datastax.com/en/landing_page/doc/landing_page/planning/planningHardware.html
此外,您的垃圾邮件还会使用executeAsync写入,而不会应用任何背压。最终你会超出任何这样的系统。您需要添加某种限制,反馈或仅使用同步请求。