मैं काफ्का (15 एमबी से अधिक) के साथ बड़े संदेश कैसे भेज सकता हूं?


118

मैं जावा निर्माता एपीआई के साथ कफका वी। 0.8 को स्ट्रिंग-संदेश भेजता हूं। यदि संदेश का आकार लगभग 15 एमबी है तो मुझे ए MessageSizeTooLargeException। मैंने सेट करने की कोशिश की हैmessage.max.bytes 40 एमबी करने , लेकिन मुझे अभी भी इसका अपवाद नहीं मिला है। छोटे संदेश समस्याओं के बिना काम करते थे।

(अपवाद निर्माता में दिखाई देता है, मेरे पास इस एप्लिकेशन में उपभोक्ता नहीं है।)

मैं इस अपवाद से छुटकारा पाने के लिए क्या कर सकता हूं?

मेरे उदाहरण निर्माता विन्यास

private ProducerConfig kafkaConfig() {
    Properties props = new Properties();
    props.put("metadata.broker.list", BROKERS);
    props.put("serializer.class", "kafka.serializer.StringEncoder");
    props.put("request.required.acks", "1");
    props.put("message.max.bytes", "" + 1024 * 1024 * 40);
    return new ProducerConfig(props);
}

त्रुटि संग्रह:

4709 [main] WARN  kafka.producer.async.DefaultEventHandler  - Produce request with correlation id 214 failed due to [datasift,0]: kafka.common.MessageSizeTooLargeException
4869 [main] WARN  kafka.producer.async.DefaultEventHandler  - Produce request with    correlation id 217 failed due to [datasift,0]: kafka.common.MessageSizeTooLargeException
5035 [main] WARN  kafka.producer.async.DefaultEventHandler  - Produce request with   correlation id 220 failed due to [datasift,0]: kafka.common.MessageSizeTooLargeException
5198 [main] WARN  kafka.producer.async.DefaultEventHandler  - Produce request with correlation id 223 failed due to [datasift,0]: kafka.common.MessageSizeTooLargeException
5305 [main] ERROR kafka.producer.async.DefaultEventHandler  - Failed to send requests for topics datasift with correlation ids in [213,224]

kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries.
at kafka.producer.async.DefaultEventHandler.handle(Unknown Source)
at kafka.producer.Producer.send(Unknown Source)
at kafka.javaapi.producer.Producer.send(Unknown Source)

5
मेरी पहली वृत्ति आपको इस विशाल संदेश को कई छोटे लोगों में विभाजित करने के लिए कहने के लिए होगी: - / मेरा अनुमान है कि यह किसी कारण के लिए संभव नहीं है, लेकिन आप इसे फिर से पुनर्विचार करना चाह सकते हैं: विशाल संदेशों का आमतौर पर मतलब होता है कि डिजाइन दोष है कहीं जो वास्तव में तय किया जाना चाहिए।
आरोन दिगुल्ला

1
धन्यवाद, लेकिन यह मेरे तर्क को और अधिक जटिल बना देगा। 15MB के आसपास संदेशों के लिए काफ्का का उपयोग करना एक बुरा विचार क्यों है ? क्या 1 एमबी अधिकतम संदेश आकार सीमा है जिसका उपयोग किया जा सकता है? मुझे काफ्का प्रलेखन में संदेश आकार सीमा के बारे में बहुत कुछ नहीं मिला।
Sonson123

2
यह काफ्का या किसी अन्य संदेश प्रसंस्करण प्रणाली से पूरी तरह से संबंधित नहीं है। मेरा तर्क: यदि आपकी 15MB फ़ाइल में कुछ गड़बड़ है, तो बाद में गंदगी को साफ करना बहुत महंगा है। इसलिए मैं आमतौर पर बड़ी फ़ाइलों को कई छोटी नौकरियों में विभाजित करता हूं (जो तब आमतौर पर समानांतर में भी निष्पादित किया जा सकता है)।
आरोन दिगुल्ला

क्या आपने किसी संपीड़न का उपयोग किया है? क्या आप कृपया कुछ और विवरण साझा कर सकते हैं, थोड़े से एक शब्द से कुछ अनुमान लगाना कठिन है
user2720864

जवाबों:


181

आपको तीन (या चार) गुणों को समायोजित करने की आवश्यकता है:

  • उपभोक्ता पक्ष:fetch.message.max.bytes - यह एक संदेश का सबसे बड़ा आकार निर्धारित करेगा जो उपभोक्ता द्वारा प्राप्त किया जा सकता है।
  • ब्रोकर पक्ष: replica.fetch.max.bytes- यह दलालों में प्रतिकृतियों को क्लस्टर के भीतर संदेश भेजने और यह सुनिश्चित करने की अनुमति देगा कि संदेशों को सही तरीके से दोहराया गया है। यदि यह बहुत छोटा है, तो संदेश कभी भी दोहराया नहीं जाएगा, और इसलिए, उपभोक्ता कभी भी संदेश नहीं देखेगा क्योंकि संदेश कभी भी प्रतिबद्ध नहीं होगा (पूरी तरह से दोहराया गया)।
  • ब्रोकर पक्ष: message.max.bytes- यह उस संदेश का सबसे बड़ा आकार है जो ब्रोकर द्वारा निर्माता से प्राप्त किया जा सकता है।
  • ब्रोकर पक्ष (प्रति विषय): max.message.bytes- यह उस संदेश का सबसे बड़ा आकार है जिसे दलाल विषय पर संलग्न करने की अनुमति देगा। यह आकार पूर्व-संपीडित मान्य है। (दलाल के लिए चूक message.max.bytes।)

मुझे नंबर 2 के बारे में कठिन तरीका पता चला - आपको काफ्का से कोई अपवाद, संदेश या चेतावनी नहीं मिलती है, इसलिए जब आप बड़े संदेश भेज रहे हों तो इस पर विचार करना सुनिश्चित करें।


3
ठीक है, आप और user2720864 सही थे। मैंने केवल message.max.bytesसोर्स कोड में सेट किया था। लेकिन मुझे काफ्का सर्वर के कॉन्फ़िगरेशन में इन मूल्यों को सेट करना होगा config/server.properties। अब बड़े संदेश भी काम करते हैं :)।
Sonson123

3
क्या इन मूल्यों को स्थापित करने के लिए कोई ज्ञात नुकसान हैं?
इवान बालाशोव

7
हाँ। उपभोक्ता पक्ष पर, आप fetch.message.max.bytesEACH विभाजन के लिए मेमोरी आवंटित करते हैं । इसका मतलब है कि यदि आप fetch.message.max.bytesबड़ी संख्या में विभाजन के साथ संयुक्त के लिए एक बड़ी संख्या का उपयोग करते हैं, तो यह बहुत अधिक मेमोरी का उपभोग करेगा। वास्तव में, चूंकि दलालों के बीच प्रतिकृति प्रक्रिया भी एक विशेष उपभोक्ता है, इसलिए यह दलालों पर स्मृति का उपभोग भी करेगा।
हंसते

3
ध्यान दें कि प्रति विषय एक max.message.bytesकॉन्फ़िगरेशन भी है जो ब्रोकर की तुलना में कम हो सकता है । message.max.bytes
पीटर डेविस

1
आधिकारिक डॉक्टर के अनुसार, उपभोक्ता पक्ष और दलालों के बीच प्रतिकृति के संबंध में मापदंडों को /.*fetch.*bytes/कठोर सीमा नहीं लगती है: "यह एक पूर्ण अधिकतम नहीं है, अगर [...] इस मूल्य से बड़ा है, तो रिकॉर्ड बैच होगा अभी भी यह सुनिश्चित करने के लिए वापस लौटा जाए कि प्रगति हो सकती है। ”
ब्लू डेयू

56

हंसी के जवाब की तुलना में कफका 0.10 और नए उपभोक्ता के लिए आवश्यक छोटे बदलाव :

  • ब्रोकर: नहीं बदलता है, तब भी आप गुणों को बढ़ाने की जरूरत है message.max.bytesऔर replica.fetch.max.bytesmessage.max.bytesकी तुलना में बराबर या छोटा (*) होना चाहिए replica.fetch.max.bytes
  • निर्माता: बढ़ाएँ max.request.size बड़ा संदेश भेजने के लिए ।
  • उपभोक्ता: max.partition.fetch.bytesबड़े संदेश प्राप्त करने के लिए बढ़ाएँ ।

(*) message.max.bytes<= के बारे में अधिक जानने के लिए टिप्पणियाँ पढ़ेंreplica.fetch.max.bytes


2
क्या आप जानते हैं कि इससे message.max.bytesछोटा होने की आवश्यकता क्यों है replica.fetch.max.bytes?
कोस्टास

2
" replica.fetch.max.bytes (डिफ़ॉल्ट: 1MB) - एक ब्रोकर द्वारा दोहराए जा सकने वाले डेटा का अधिकतम आकार। यह message.max.bytes से बड़ा होना चाहिए , या ब्रोकर संदेशों को स्वीकार करेगा और उन्हें दोहराने में विफल रहेगा। संभावित डेटा हानि। " स्रोत: हैंडलिंग-लार्ज-मैसेज-काफ्का
साशा वेटर

2
एक लिंक के साथ मेरे पास वापस आने के लिए धन्यवाद। यह प्रतीत होता है कि क्लोउडा गाइड के रूप में अच्छी तरह से पता चलता है। हालांकि ये दोनों गलत हैं - ध्यान दें कि वे कोई तकनीकी कारण नहीं बताते हैं कि replica.fetch.max.bytes कड़ाई से बड़ा क्यों होना चाहिए message.max.bytes। एक संघर्षशील कर्मचारी ने आज पहले पुष्टि की कि मुझे क्या संदेह है: कि दो मात्राएं, वास्तव में, समान हो सकती हैं।
कोस्तस

2
वहाँ किसी भी अद्यतन के बारे में कर रहे हैं message.max.bytes<replica.fetch.max.bytesया message.max.bytes=replica.fetch.max.bytes@Kostas?
साशा वेटर

2
हां, वे समान हो सकते हैं: mail-archive.com/users@kafka.apache.org/msg25494.html ( कंफ्लुएंट के लिए इस्माईल काम करता है)
कोस्टास

13

आपको निम्नलिखित गुणों को ओवरराइड करने की आवश्यकता है:

ब्रोकर कंफ़िग्स ($ KAFKA_HOME / config / server.properties)

  • replica.fetch.max.bytes
  • message.max.bytes

उपभोक्ता कन्फ़िग्स ($ KAFKA_HOME / config / Consumer.properties) यह कदम मेरे लिए कारगर
नहीं रहा। मैं इसे उपभोक्ता ऐप में जोड़ता हूं और यह ठीक काम कर रहा था

  • fetch.message.max.bytes

सर्वर को पुनरारंभ करें।

अधिक जानकारी के लिए इस दस्तावेज को देखें: http://kafka.apache.org/08/configuration.html


1
कमांडलाइन उपभोक्ता के लिए, मुझे --fetch- आकार = <बाइट्स> ध्वज का उपयोग करने की आवश्यकता है। यह Consumer.properties फ़ाइल (kafka 0.8.1) को पढ़ने के लिए प्रतीत नहीं होता है। मैं भी संपीड़न की ओर से निर्माता की ओर से संपीड़न चालू करने की सलाह दूंगा। कॉडेक विकल्प।
जिग्गी यूनिकिएन

जिग्गी की टिप्पणी ने मेरे लिए कफका 0.8.1.1 का काम किया। धन्यवाद!
जेम्स

क्या ऐसा हो सकता है कि ConsumerCffig में max.partition.fetch.bytes द्वारा प्रतिस्थापित किया जाए।
s_bi

12

यह विचार कफ्का निर्माता से काफ्का ब्रोकर को भेजे जाने वाले संदेश के बराबर आकार का है और इसके बाद काफ्का ब्रोकर द्वारा प्राप्त किया गया है।

काफ्का निर्माता -> काफ्का ब्रोकर -> काफ्का उपभोक्ता

मान लें कि यदि आवश्यकता 15MB संदेश भेजने की है, तो निर्माता , ब्रोकर और उपभोक्ता , तीनों को सिंक में होना चाहिए।

काफ्का निर्माता 15 एमबी -> काफ्का ब्रोकर की अनुमति देता है / स्टोर 15 एमबी -> काफ्का उपभोक्ता 15 एमबी प्राप्त करता है

इसलिए सेटिंग इस प्रकार होनी चाहिए:

क) ब्रोकर पर:

message.max.bytes=15728640 
replica.fetch.max.bytes=15728640

b) उपभोक्ता पर:

fetch.message.max.bytes=15728640

2
यह हो सकता है कि fetch.message.max.bytes को ConsumerCffig में max.partition.fetch.bytes से बदल दिया जाए?
s_bi

7

एक प्रमुख बात को याद है कि message.max.bytesविशेषता होना चाहिए सिंक में उपभोक्ता के साथ fetch.message.max.bytesसंपत्ति। लाने का आकार कम से कम अधिकतम संदेश के आकार जितना बड़ा होना चाहिए अन्यथा ऐसी स्थिति हो सकती है जहां उत्पादक संदेश भेज सकते हैं जितना उपभोक्ता उपभोग / प्राप्त कर सकता है। यह देखने लायक हो सकता है।
काफ्का का कौन सा संस्करण आप उपयोग कर रहे हैं? इसके अलावा कुछ और विवरण ट्रेस प्रदान करें जो आपको मिल रहे हैं। क्या कोई चीज़ है ... जैसे payload size of xxxx larger than 1000000लॉग में आ रही है?


1
मैंने अधिक जानकारी के साथ अपने प्रश्न को अपडेट किया है: काफ्का संस्करण 2.8.0-0.8.0; अब मुझे केवल निर्माता की जरूरत है।
सोंसोन १२

6

@ लाफिंग_मैन का जवाब काफी सटीक है। लेकिन फिर भी, मैं एक सिफारिश देना चाहता था जो मैंने काफ्का विशेषज्ञ स्टीफन मर्क से सीखा था से ।

Kafka बड़े संदेशों को संभालने के लिए नहीं है।

आपके API को क्लाउड स्टोरेज (Ex AWS S3) का उपयोग करना चाहिए, और बस Kafka या किसी भी मैसेज ब्रोकर को S3 का संदर्भ देना चाहिए। आपको अपने डेटा को बनाए रखने के लिए कहीं न कहीं ढूंढना होगा, हो सकता है कि यह एक नेटवर्क ड्राइव हो, हो सकता है कि यह जो भी हो, लेकिन यह संदेश ब्रोकर नहीं होना चाहिए।

अब, यदि आप उपरोक्त समाधान के साथ नहीं जाना चाहते हैं

संदेश का अधिकतम आकार 1 एमबी है (आपके दलालों में सेटिंग को कहा जाता है message.max.bytes) अपाचे काफ्का । यदि आपको वास्तव में इसकी बुरी तरह से आवश्यकता है, तो आप उस आकार को बढ़ा सकते हैं और अपने उत्पादकों और उपभोक्ताओं के लिए नेटवर्क बफ़र्स को बढ़ा सकते हैं।

और यदि आप वास्तव में अपने संदेश को विभाजित करने के बारे में परवाह करते हैं, तो सुनिश्चित करें कि प्रत्येक संदेश विभाजन में एक ही कुंजी है ताकि यह एक ही विभाजन में धकेल दिया जाए, और आपकी संदेश सामग्री को "भाग आईडी" रिपोर्ट करनी चाहिए ताकि आपका उपभोक्ता संदेश को पूरी तरह से समेट सके। ।

आप संपीड़न का भी पता लगा सकते हैं, यदि आपका संदेश पाठ-आधारित (gzip, snappy, lz4 संपीड़न) है जो डेटा आकार को कम कर सकता है, लेकिन जादुई रूप से नहीं।

फिर से, आपको उस डेटा को संग्रहीत करने के लिए एक बाहरी प्रणाली का उपयोग करना होगा और काफ्का के लिए एक बाहरी संदर्भ को धक्का देना होगा। यह एक बहुत ही सामान्य वास्तुकला है, और जिसे आपको व्यापक रूप से स्वीकार किया जाना चाहिए।

ध्यान रखें कि काफ्का केवल तभी सबसे अच्छा काम करता है जब संदेश राशि में विशाल हों लेकिन आकार में नहीं।

स्रोत: https://www.quora.com/How-do-I-send-Large-messages-80-MB-in-Kwka


4
आप यह नोट करना चाह सकते हैं कि "आपकी" सिफारिश स्टीफन मारेक की Quora सिफारिश की लगभग एक शब्द-की-वर्ड कॉपी है जो quora.com/How-do-I-send-Large-messages-80/MB-in-Kafka
माइक पर है

काफ्का बड़े संदेशों के साथ काम करता है, बिल्कुल कोई समस्या नहीं है। काफ्का होम पेज पर इंट्रो पेज इसे स्टोरेज सिस्टम के रूप में भी संदर्भित करता है।
calloc_org

3

लैंडअप काफ्का का उपयोग करने वाले लोगों के लिए: आप पर्यावरण चर में विन्यास मानों को पास कर सकते हैं जैसे:

docker run -d --rm -p 2181:2181 -p 3030:3030 -p 8081-8083:8081-8083  -p 9581-9585:9581-9585 -p 9092:9092
 -e KAFKA_TOPIC_MAX_MESSAGE_BYTES=15728640 -e KAFKA_REPLICA_FETCH_MAX_BYTES=15728640  landoop/fast-data-dev:latest `

और अगर आप rdkafka के साथ हैं तो निर्माता config में message.max.bytes पास करें जैसे:

  const producer = new Kafka.Producer({
        'metadata.broker.list': 'localhost:9092',
        'message.max.bytes': '15728640',
        'dr_cb': true
    });

इसी तरह, उपभोक्ता के लिए,

  const kafkaConf = {
   "group.id": "librd-test",
   "fetch.message.max.bytes":"15728640",
   ... .. }                                                                                                                                                                                                                                                      
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.