Cassandra COPY 一直失败

Cassandra COPY consistently fails

我试图导入一个包含大约 2000 万行的 CSV。

我用几 100 行的 CSV 做了一个试点 运行,只是为了检查列是否按顺序排列并且没有解析错误。一切顺利。

每次我尝试导入 2000 万行 CSV 时,它都会在不同时间后失败。在我的本地机器上,它在 90 分钟后失败并出现以下错误。在服务器盒子上它在 10 分钟内失败:

Processed 4050000 rows; Write: 624.27 rows/ss
code=1100 [Coordinator node timed out waiting for replica nodes' responses] message="Operation timed out - received only 0 responses." info=

{'received_responses': 0, 'required_responses': 1, 'write_type': 0, 'consistency': 1}
Aborting import at record #4050617. Previously-inserted values still present.
4050671 rows imported in 1 hour, 26 minutes, and 43.649 seconds.

Cassandra: Coordinator node timed out waiting for replica nodes' responses(这是一个单节点集群,复制因子为 1,所以为什么要等待其他节点是另一个问题)

然后根据另一个线程中的建议,我更改了写入超时,但我不相信这是根本原因。

write_request_timeout_in_ms: 20000 

(也尝试将其更改为 300000)

但最终还是失败了。

所以现在,我已经将原始 CSV 分成许多 500,000 行 CSV。 这具有更高的成功率(与 0 相比!)。但由于各种原因,即使这样也失败了 5 次中的 2 次。

有时会出现以下错误:

Processed 460000 rows; Write: 6060.32 rows/ss
Connection heartbeat failure
Aborting import at record #443491. Previously inserted records are still present, and some records after that may be present as well.

其他时候它只是停止在控制台上更新进度,唯一的出路是使用 Ctrl+C

中止

我一天的大部分时间都是这样度过的。我的 RDBMS 运行ning 很高兴有 50 亿行。我想用 10 倍的数据测试 Cassandra,但我什至一次导入一百万行都遇到了麻烦。

关于 COPY 命令如何进行的观察是这样的:输入命令后,它开始以每秒约 10,000 行的速度写入。它保持这个速度,直到它插入了大约 80,000 行。然后有大约 30 秒的暂停,之后它消耗了另外 70,000 到 90,000 行,暂停了另外 30 秒,依此类推,直到它完成 CSV 中的所有行或中途失败并出现错误或只是挂起。

我需要找到问题的根源。我真的希望发现我在做一些愚蠢的事情,而不是我必须接受和解决的事情。

我正在使用 Cassandra 2.2.3

很多人在使用 COPY 命令时遇到问题,它似乎适用于小型数据集,但当你有大量数据时它开始失败。

documentation中,如果你有几百万行要导入,他们建议使用 SSTable 加载器,我在我的公司使用过它,但我遇到了很多一致性问题。

我已经尝试了所有方法,对我来说,将大量数据导入 cassandra 的最安全方法是编写一个小脚本来读取您的 CSV,然后执行异步查询。 Python 做得很好。

意志是正确的。 COPY 适用于小型数据集,当您开始达到数百万行时通常会遇到困难。除了 SSTable 加载器之外,还有这个实用程序:https://github.com/brianmhess/cassandra-loader 我发现它具有非常好的性能和一些额外的便利。