【发布时间】:2016-12-07 22:54:45
【问题描述】:
我们正在尝试将文件加载到 Cassandra 中的 blob 列。当我们加载 1-2 MB 的文件时,一切正常。加载大文件时,比如大约 50 MB,出现以下错误:
在一致性 LOCAL_QUORUM 写入查询期间 Cassandra 失败(需要 1 个响应,但只有 0 个副本响应,1 个失败)
它是一个单节点开发数据库。任何提示或支持将不胜感激。
【问题讨论】:
我们正在尝试将文件加载到 Cassandra 中的 blob 列。当我们加载 1-2 MB 的文件时,一切正常。加载大文件时,比如大约 50 MB,出现以下错误:
在一致性 LOCAL_QUORUM 写入查询期间 Cassandra 失败(需要 1 个响应,但只有 0 个副本响应,1 个失败)
它是一个单节点开发数据库。任何提示或支持将不胜感激。
【问题讨论】:
50mb 对于一个单元来说是相当大的。虽然有点过时但仍然准确:http://cassandra.apache.org/doc/4.0/faq/#can-large-blob
Cassandra 中没有从单元格流出的机制,因此单元格内容需要在内存中作为单个响应序列化。您可能在某处遇到限制或错误,即抛出异常并导致查询失败(检查 cassandras system.log,可能是那里的异常,可以更好地描述发生的事情)。
如果您有 CQL 集合或记录的批次,则还有其他下限。 http://docs.datastax.com/en/cql/3.3/cql/cql_reference/refLimits.html
您可以尝试将 blob 分块。 Id 实际上推荐像 64kb,在客户端,遍历它们并生成一个流(也防止它完全加载到你这边的内存中)。
CREATE TABLE exampleblob (
blobid text,
chunkid int,
data blob,
PRIMARY KEY (blobid, chunkid));
然后只需 SELECT * FROM exampleblob WHERE blobid = 'myblob'; 并遍历结果。插入变得更加复杂,因为您必须有逻辑来拆分文件,这也可以以流方式完成,并且在您的应用程序端具有内存效率。
另一种选择是将 blob 上传到 S3 或一些分布式文件存储,使用文件的哈希作为存储桶/文件名。在 Cassandra 中,只需将文件名存储为对其的引用。
【讨论】: