2016-08-02 54 views
2

我們正在嘗試將文件加載到Cassandra中的blob列。當我們加載1-2 MB文件的文件時,它會很好。當裝載大文件,說大約50 MB,得到以下錯誤:在一致性LOCAL_QUORUM寫入查詢時Cassandra:爲大文件創建blob問題

卡桑德拉失敗(被要求1個答覆,但只有0副本回應,1失敗)

它是一個單節點發展D B。任何提示或支持將不勝感激。

回答

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或某些分佈式文件存儲,將文件的散列用作存儲桶/文件名。在卡桑德拉只存儲文件名作爲參考。

+0

謝謝克里斯的投入。我能夠從system.log中找到錯誤並更改配置以使其正常工作。增加commitlog_segment_size_in_mb以使文件大小加倍。 –

+0

你基於塊的方法幾乎沒有問題,但有一些pitfails。例如,不能保證SELECT調用將返回所有的塊。如果你有太多的塊(例如100K),你不知道它們可能有多少 - 你遇到了很大的麻煩,你不能設置LIMIT。順便說一下,更新的常見問題鏈接是:http://cassandra.apache.org/doc/3.9/faq/#can-i-store-large-blobs-in-cassandra –

+0

如果使用法定人數(或本地q)讀/寫所有的塊將被返回。您可以設置獲取大小(默認值5000,在這種情況下應該更低),然後當您在客戶端通過它們遍歷驅動程序頁面時,它不會一次全部提取它們。 –