Cassandra:为大文件创建blob的问题

时间:2016-08-02 14:14:17

标签: cassandra blob

我们正在尝试将文件加载到Cassandra中的blob列。当我们加载1-2 MB文件的文件时,它会很好。在加载大文件时,比如大约50 MB,会出现以下错误:

在一致性LOCAL_QUORUM的写查询期间Cassandra失败(需要1个响应,但只有0个副本响应,1个失败)

它是单节点开发DB。任何提示或支持将不胜感激。

1 个答案:

答案 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中,只需将文件名存储为对它的引用。