cassandra - कैसंद्रा में बैच की सीमा क्या है?




cassandra-3.0 cassandra-2.2 (3)

मैं टोपी बढ़ाने की सिफारिश नहीं करेगा, और केवल एकाधिक अनुरोधों में विभाजन एक विशाल एकल अनुरोध में सब कुछ डालने से समन्वयक को महत्वपूर्ण रूप से प्रभावित किया जाएगा। एक विभाजन में सब कुछ होने से कुछ विलंबता को कम करके कुछ आकार के बैचों में थ्रूपूट में सुधार हो सकता है, लेकिन प्रदर्शन को सुधारने के लिए बैचों का कभी इस्तेमाल नहीं किया जाता। इसलिए विभिन्न बैच आकारों का उपयोग करके अधिकतम थ्रूपूट प्राप्त करने के लिए अनुकूलित करने की कोशिश करना मुख्यतः उपयोग केस / स्कीमा / नोड पर निर्भर करेगा और विशिष्ट परीक्षण की आवश्यकता होगी, क्योंकि वहां आमतौर पर आकार पर एक चट्टान है जहां यह नीचा दिखना शुरू हो जाता है।

वहां एक है

# Fail any batch exceeding this value. 50kb (10x warn threshold) by default.
batch_size_fail_threshold_in_kb: 50

विकल्प को बढ़ाने के लिए अपने cassandra.yaml में विकल्प, लेकिन यह सुनिश्चित करने के लिए सुनिश्चित करें कि वास्तव में आपकी मदद करने और आप को cassandra.yaml करने में मदद न करें।

मेरे पास एक जावा क्लाइंट है जो बैश में Cassandra क्लस्टर को दर्ज करता है (INSERT) रिकॉर्ड करता है बैच के सभी तत्वों में एक ही पंक्ति कुंजी है, इसलिए वे सभी एक ही नोड में रखा जाएगा। इसके अलावा मुझे परमाणु होने के लिए लेन-देन की ज़रूरत नहीं है, इसलिए मैं अनब्लॉग बैच का उपयोग कर रहा हूं।

प्रत्येक बैच में INSERT कमांड की संख्या अलग-अलग कारकों पर निर्भर करती है, लेकिन 5 से 50000 के बीच कुछ भी हो सकता है। सबसे पहले मैंने बहुत से आदेशों को रख दिया था जैसे कि एक बैच में था और इसे जमा किया। इसने com.datastax.driver.core.exceptions.InvalidQueryException: Batch too large तब मैंने 1000 बैट के अंदर INSERT की एक टोपी और 300 से नीचे का इस्तेमाल किया। मैंने देखा कि मैं बिल्कुल बेतरतीब ढंग से अनुमान लगा रहा हूं कि यह सीमा कहां से आती है, जिससे सड़क को परेशानी हो सकती है।

मेरा सवाल है, यह सीमा क्या है? क्या मैं इसे संशोधित कर सकता हूं? मैं कैसे जान सकता हूँ कि बैच में कितने तत्व रखे जा सकते हैं? जब मेरा बैच "पूर्ण" होता है?


मैंने CHUNKSIZE को कम मान में बदलकर इस समस्या को तय किया है (उदाहरण 1 के लिए) https://docs.datastax.com/en/cql/3.1/cql/cql_reference/copy_r.html

CHUNKSIZE = 1 के साथ 'mybackup' से कॉपी mytable करें;

ऑपरेशन बहुत धीमी है लेकिन कम से कम यह अब काम करता है


जावा में इसी प्रकार के मुद्दे पर दौड़ गई, यहां बैच बैचों की एक कार्यात्मक उदाहरण है:

import com.datastax.driver.core.BatchStatement;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.Session;
import com.google.common.collect.Lists;

import java.util.Collection;
import java.util.stream.Collectors;

public class CassandraBatchOfBatchesExample {

    private final PreparedStatement statement;
    private final Session session;
    private final int batchSize;

    public CassandraBatchOfBatchesExample(Session session, int batchSize) {
        this.session = session;
        this.batchSize = batchSize;
        statement = session.prepare("INSERT_INTO some_table JSON ?");
    }

    public void execute(Collection<String> jsons) {
        Lists.partition(jsons
                .stream()
                .map(statement::bind)
                .collect(Collectors.toList()
            ), batchSize).stream()
            .map(statements -> new BatchStatement().addAll(statements))
            .forEach(session::execute);
    }
}

batchSize आकार परिवर्तनशील को दर्ज किए जाने वाले व्यक्तिगत रिकॉर्ड के आकार के आधार पर बदलने की आवश्यकता होगी।