【问题标题】:How do I load a lot of data at once in a Cassandra "cluster" of one node?如何在一个节点的 Cassandra“集群”中一次加载大量数据?
【发布时间】:2016-08-09 21:51:06
【问题描述】:

我正在开发一个使用 Cassandra 处理所有数据需求的多网站系统。

当我第一次安装一个网站时,它添加了 3918 个页面(并且还在增长),其中包含许多字段、JS 文件等附件、页面之间的链接等。

在某些时候,我的测试“集群”(一个节点)决定数据很快就会超时,或者最糟糕的是,Cassandra 由于内存不足 (OOM) 而“崩溃”。或多或少,据我所见,Cassandra 分配的 2Gb RAM 被填满,然后,Cassandra 通常无法控制其可用 RAM 并获得 OOM。当我没有收到 OOM 时,我会超时。

C/C++ 驱动程序中是否有调用以了解“集群”是否慢,这样我就可以等待一段时间,而不是像疯了一样推送更多数据?

此时,我唯一能看到的是我正在写 (INSERT INTO ...) 并收到超时错误。更准确地说,这个错误:CASS_ERROR_SERVER_WRITE_TIMEOUT。我发现等到我收到这样的错误才开始调整我的INSERTs 以管理负载是相当难看的。这是唯一的方法吗?!


更新:我能够避免 OOM,但只能通过减少在第一次创建网站时安装的插件数量(我不需要一次安装所有插件)。如果你问我,这不是一个好的解决方案,因为 Cassandra 节点不应该像那样崩溃。这可能(可能确实发生在许多人身上)发生在生产中,并且一旦负载在一分钟内变得有点太高,认为任何时候都可能发生这种情况是无法容忍的......

【问题讨论】:

    标签: c++ cassandra cassandra-3.0


    【解决方案1】:

    我个人加载大量数据的方法是使用异步查询(这在 Python 中,但我认为您可以在 C++ 中做同样的事情)。我以异步方式插入数据,并将响应放入列表中。

    当我达到某个数字(在我的情况下为 1000)时,我浏览我的列表并调用我所有响应的结果以同步阻止,直到我的所有查询都通过。

    这样,我可以发送大量查询而不会使集群过载。不知道这是否是最有效的方法,但效果很好。

    【讨论】:

    • 您是说异步查询在节点未 100% 完成之前不会被标记为“完成”?这将是一个有趣的副作用......我原以为同步查询会完全像那样工作?
    • 不,是异步的效果。如果您必须等待节点的确认,它将是同步的。异步的好处是您不必等待,因此可以节省一些时间。但它可能会使节点过载,并使用列表来防止这种情况:当您询问未来时,大多数查询已经完成,您只需等待最后一个查询完成。
    • 对于在写入负载下出现 OOM 的用例,触发 1k 异步查询可能会使事情变得更糟,而不是更好。
    【解决方案2】:

    单节点集群是非典型的(它们不是反模式,但它们不是主要用例)。您必须解决一些传统行为。

    1) 使用同步查询而不是异步查询。

    2) 确保即使在单个节点上也使用真正的一致性级别 (QUORUM),因为使用 ANY 会让您不知所措。

    3) 衡量您自己的查询延迟。如果延迟增加超过某个点(没有完全超时),则降低插入率(人为睡眠)。

    4) 调整连接的 cassandra 端。 2GB 非常小,要有效地运行它,您需要进行一些调整。您可能需要调整 memtable 刷新阈值以鼓励更频繁地刷新,并且可能需要根据初始文档集的大小显式配置 memtable 大小。

    【讨论】:

    • 嗯...我成功了,但这只是因为我发现我试图一次安装的插件比我需要的更多。删除这些额外内容修复了崩溃问题,尽管显然 Cassandra 崩溃的可能性仍然很大......所以实际上我向 Cassandra 发送的数据要少得多,并且没有得到 OOM。
    【解决方案3】:

    请参阅 Cassandra Loader 将海量数据摄取到 Cassandra。

    【讨论】:

    • 这对我们不起作用,因为我们没有可以上传的 CVS。密钥因每次安装而异,时间也不同...
    猜你喜欢
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 2018-07-19
    相关资源
    最近更新 更多