【问题标题】:Cassandra: Issue with blob creation for large fileCassandra:大文件的 blob 创建问题
【发布时间】:2016-12-07 22:54:45
【问题描述】:

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

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

它是一个单节点开发数据库。任何提示或支持将不胜感激。

【问题讨论】:

    标签: cassandra blob


    【解决方案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 中,只需将文件名存储为对其的引用。

    【讨论】:

    • 感谢克里斯的意见。我能够从 system.log 中找到错误并更改配置以使其正常工作。将 commitlog_segment_size_in_mb 增加为文件大小的两倍。
    • 您的基于块的方法几乎没问题,但有一些缺陷。例如,不能保证 SELECT 调用会返回所有块。如果你有太多的块(例如,100K)并且你不知道你可能有多少 - 你有很大的麻烦,因为你不能设置 LIMIT。顺便说一下,更新的faq链接是:cassandra.apache.org/doc/3.9/faq/…
    • 如果同时使用 quorum(或本地 q)进行读/写,则将返回所有块。您可以设置获取大小(默认为 5000,在这种情况下应该更低),然后当您在客户端迭代驱动程序页面时,它不会一次全部提取它们。
    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 2020-01-22
    • 1970-01-01
    相关资源
    最近更新 更多