0

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

1 回答 1

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。
  • 非负载测试环境开发:不小于4GB。
  • DSE 图表:除了 DSE 搜索或 DSE 分析的特定组合外,还有 2 到 4 GB。如果您想要一个大型的专用图形缓存,请添加更多 RAM。

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

于 2017-03-01T15:59:29.093 回答