我们正在尝试将文件加载到Cassandra中的blob列。当我们加载1-2 MB文件的文件时,它会很好。在加载大文件时,比如大约50 MB,会出现以下错误:
在一致性LOCAL_QUORUM的写查询期间Cassandra失败(需要1个响应,但只有0个副本响应,1个失败)
它是单节点开发DB。任何提示或支持将不胜感激。
答案 0 :(得分:2)
对于一个细胞来说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
你可以尝试将你的斑点分成几部分。我实际上推荐像64kb,在客户端,迭代它们并生成一个流(也防止将它完全加载到你身边的内存中)。
CREATE TABLE exampleblob (
blobid text,
chunkid int,
data blob,
PRIMARY KEY (blobid, chunkid));
然后只需SELECT * FROM exampleblob WHERE blobid = 'myblob';
并迭代结果。插入变得更加复杂,因为你必须有逻辑来分割你的文件,这也可以流式方式完成,并在你的应用程序端节省内存。
另一种方法是将blob上传到S3或某个分布式文件存储,使用该文件的哈希作为存储桶/文件名。在Cassandra中,只需将文件名存储为对它的引用。