执行大量写入时Cassandra的问题

执行大量写入时Cassandra的问题,cassandra,datastax-enterprise,datastax-startup,datastax-php-driver,Cassandra,Datastax Enterprise,Datastax Startup,Datastax Php Driver,我们正试图将大量记录(一次超过500万条)写入卡桑德拉。这些文件是从制表符分隔的文件中读取的,并使用executeAsync导入Cassandra。 我们一直在使用更小的数据集(约330k条记录),这将更加常见。直到最近,我们的脚本一直在默默地停止导入大约65k条记录。自从将RAM从2Gb升级到4Gb以来,导入的记录数量增加了一倍,但我们仍然没有成功导入所有记录 这是我们目前正在运行的流程的一个示例: $cluster = \Cassandra::cluster()->withContac

我们正试图将大量记录(一次超过500万条)写入卡桑德拉。这些文件是从制表符分隔的文件中读取的,并使用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);
我们曾尝试使用批处理方法,但认为它在这里不合适,因为它会导致Cassandra进程在高CPU使用率(约85%)下运行

我们正在使用存储库中提供的最新版本的DSE/Cassandra

Cassandra 3.0.11.1564 | DSE 5.0.6
2gb(实际上是4gb)甚至不是卡桑德拉在开发或生产中的最低建议。在它上面运行是可能的,但是它需要更多的调整,因为它低于默认值。即使进行了调整,您也不应该期望在它开始出现问题之前有多大的性能保持(您得到的错误),并且您需要添加更多节点

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

此外,您的垃圾邮件使用executeAsync写入,并且不施加任何反压力。最终你会超越任何一个这样的系统。您要么需要添加某种限制、反馈,要么只使用同步请求。

谢谢@Chris,我们的构建现在运行良好。关于节流,DataStax php驱动程序中是否内置了可用于此目的的任何东西?不,我对php不够熟悉,不知道处理异步方法的任何好方法。可能把期货放在一张名单上,如果名单>1000或者什么的话,先把第一张名单拿出来,然后做一个
get
,所以你一直都有大约1000张在飞行中。可以根据一些性能数据调整这个数字(在这样小的系统中可能会很低)。非常感谢Chris,这非常有帮助。