2016-08-02 6 views
2

Cassandra의 blob 열에 파일을로드하려고합니다. 1 ~ 2MB 파일의 파일을로드하면 정상적으로 진행됩니다.Cassandra : 대용량 파일에 대한 BLOB 생성 문제

그것은 하나의 노드 개발이다 일관성 LOCAL_QUORUM에서 쓰기 쿼리 동안

카산드라 실패 (1 개 응답이 필요했다 만 0 복제가 응답, 1 실패) : 큰 파일을로드하는 동안, 약 50 메가 바이트, 다음과 같은 오류가 말한다 DB. 어떠한 힌트 나 지원도 환영 할 것입니다.

답변

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

블로 브를 여러 부분으로 나누어 볼 수 있습니다. Id는 실제로 64kb와 같이 추천하고, 클라이언트 측에서, 그들을 통해 반복하고 스트림을 생성한다 (또한 당신 측의 메모리에 완전히로드하는 것을 막기 위해).

CREATE TABLE exampleblob (
    blobid text, 
    chunkid int, 
    data blob, 
    PRIMARY KEY (blobid, chunkid)); 

그러면 SELECT * FROM exampleblob WHERE blobid = 'myblob';에 도달하고 결과를 반복합니다. 삽입은 파일을 분할하는 로직을 가져야하기 때문에 더 복잡해 지지만, 스트리밍 방식으로도 할 수 있으며 앱 측면에서 메모리를 효율적으로 사용할 수 있습니다.

또 다른 대안은 방울을 S3 또는 일부 분산 파일 저장소에 업로드하는 것입니다. 파일의 해시를 버킷/파일 이름으로 사용하십시오. Cassandra에서는 파일 이름을 참조로 저장합니다.

+0

입력하신 내용에 Chris님께 감사드립니다. 나는 system.log에서 오류를 찾아서 작동하도록 구성을 변경할 수있었습니다. 파일 크기를 두 배로 늘리는 commitlog_segment_size_in_mb를 증가 시켰습니다. –

+0

청크 기반 접근 방식은 거의 괜찮지 만 약간의 함정이 있습니다. 예를 들어, 모든 청크가 SELECT 호출에 의해 리턴 될 것이라는 보장은 없습니다. 그리고 너무 많은 덩어리 (예 : 100K)가 있고 그 중 얼마나 많은 부분이 있을지 모를 경우 - 큰 문제가 발생하여 제한을 설정할 수 없습니다. 그런데 업데이트 된 FAQ 링크는 다음과 같습니다. http://cassandra.apache.org/doc/3.9/faq/#can-i-store-large-blobs-in-cassandra –

+0

둘 다 쿼럼 (또는 로컬 q)을 사용하는 경우 읽기/쓰기 모든 청크가 반환됩니다. 페치 크기 (기본값은 5000으로,이 경우 낮춰야 함)를 설정할 수 있습니다. 그런 다음 클라이언트 페이지에서 드라이버 페이지를 반복하면서 한 번에 모두 가져 오지는 않습니다. –