执行大量写入时Cassandra的问题

时间:2017-03-01 15:08:47

标签: cassandra datastax-enterprise datastax-startup datastax-php-driver

我们正试图将大量记录(一次超过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

1 个答案:

答案 0 :(得分:1)

2gb(实际上是4gb)甚至不是Cassandra在开发或生产中推荐的最低值。可以运行它,但它需要更多的调整,因为它低于默认值的调整。即使经过调整,你也不应期望在开始遇到问题之前获得很多性能(你得到错误)并且你需要添加更多节点。

https://docs.datastax.com/en/landing_page/doc/landing_page/planning/planningHardware.html

  • 生产:32 GB至512 GB;对于Cassandra,最小值为8 GB,对于DataStax Enterprise分析和搜索节点,最小值为32 GB。
  • 在非加载测试环境中开发:不低于4 GB。
  • DSE图表:除了您的DSE搜索或DSE Analytics的特定组合之外,还有2到4 GB。如果您需要大型专用图缓存,请添加更多RAM。

此外,您的垃圾邮件还会使用executeAsync写入,而不会应用任何背压。最终你会超出任何这样的系统。您需要添加某种限制,反馈或仅使用同步请求。