আমি কীভাবে কাফকার (15 এমবি-র বেশি) দিয়ে বড় বার্তা পাঠাতে পারি?


118

আমি জাভা প্রযোজক এপিআই দিয়ে কাফকা ভি। 0.8 এ স্ট্রিং-বার্তা প্রেরণ করি। যদি বার্তার আকার প্রায় 15 এমবি হয় তবে আমি একটি পাই MessageSizeTooLargeException। আমি message.max.bytes40 এমবি সেট করার চেষ্টা করেছি , তবে আমি এখনও এর ব্যতিক্রম পাই। ছোট বার্তা সমস্যা ছাড়াই কাজ করেছে।

(ব্যতিক্রমটি প্রযোজকের কাছে উপস্থিত রয়েছে, আমার এই অ্যাপ্লিকেশনটিতে কোনও গ্রাহক নেই))

এই ব্যতিক্রম থেকে মুক্তি পেতে আমি কী করতে পারি?

আমার উদাহরণ প্রযোজক কনফিগার

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
আমার প্রথম প্রবৃত্তিটি আপনাকে এই বিশাল বার্তাটি কয়েকটি ছোট ছোট ভাগে ভাগ করতে বলবে: - / আমার ধারণা যে কোনও কারণে এটি সম্ভব নয় তবে আপনি এটি পুনর্বিবেচনা করতে চাইতে পারেন: বিশাল বার্তাগুলির সাধারণত অর্থ হ'ল ডিজাইনের ত্রুটি রয়েছে is কোথাও যে সত্যিই স্থির করা উচিত।
অ্যারন দিগুল্লা

1
ধন্যবাদ, তবে এটি আমার যুক্তিটিকে আরও জটিল করে তুলবে। কেন 15MB এর কাছাকাছি বার্তাগুলির জন্য কাফকা ব্যবহার করা খারাপ ধারণা? 1 এমবি কি সর্বোচ্চ বার্তা আকারের সীমা ব্যবহার করা যেতে পারে? কাফকার ডকুমেন্টেশনে আমি বার্তার আকারের সীমা সম্পর্কে খুব বেশি খুঁজে পাইনি।
সানসন 123

2
এটি কাফকা বা অন্য কোনও মেসেজ প্রসেসিং সিস্টেমের সাথে সম্পূর্ণ সম্পর্কিত নয়। আমার যুক্তি: আপনার 15MB ফাইলটিতে যদি কিছু ভুল হয়ে যায় তবে পরে জঞ্জাল পরিষ্কার করা খুব ব্যয়বহুল। এজন্য আমি সাধারণত বড় ফাইলগুলিকে অনেকগুলি ছোট চাকরিতে বিভক্ত করি (যা সাধারণত সমান্তরালভাবে কার্যকরও করা যায়)।
অ্যারন দিগুল্লা

আপনি কোন সংকোচনের ব্যবহার করেছেন? আপনি কি দয়া করে আরও কিছু বিবরণ ভাগ করে নিতে পারেন, কেবলমাত্র একটি শব্দ থেকে কিছু অনুমান করা খুব সহজ
ইউজার 2720864

উত্তর:


181

আপনাকে তিনটি (বা চার) বৈশিষ্ট্য সমন্বয় করতে হবে:

  • গ্রাহক পক্ষ: fetch.message.max.bytes- এটি কোনও বার্তার বৃহত্তম আকার নির্ধারণ করবে যা গ্রাহক পেতে পারেন।
  • ব্রোকার দিক: replica.fetch.max.bytes- এটি দালালদের মধ্যে প্রতিলিপিগুলি ক্লাস্টারের মধ্যে বার্তা প্রেরণ এবং বার্তাগুলি সঠিকভাবে প্রতিরূপ হয়েছে কিনা তা নিশ্চিত করবে। যদি এটি খুব ছোট হয়, তবে বার্তাটি কখনও প্রতিলিপি করা হবে না এবং তাই, গ্রাহক কখনও বার্তাটি দেখতে পাবেন না কারণ বার্তাটি কখনই প্রতিশ্রুতিবদ্ধ হবে না (সম্পূর্ণ প্রতিলিপি))
  • ব্রোকার দিক: message.max.bytes- এটি কোনও প্রযোজকের কাছ থেকে ব্রোকারের দ্বারা প্রাপ্ত বার্তার বৃহত্তম আকার।
  • ব্রোকার সাইড (প্রতি টপিক): max.message.bytes- এই বার্তায় এটি বৃহত্তম আকার যা ব্রোকার বিষয়টিতে যুক্ত হতে দেয়। এই আকারটি পূর্ব-সংক্ষেপণের সাথে বৈধতাপ্রাপ্ত। (ব্রোকারের ডিফল্ট message.max.bytes।)

আমি 2 নম্বর সম্পর্কে কঠোর উপায়টি খুঁজে পেয়েছি - আপনি কাফকার কাছ থেকে কোনও ব্যতিক্রম, বার্তা বা সতর্কতা পান না, তাই আপনি বড় বার্তা প্রেরণ করার সময় এটি অবশ্যই বিবেচনা করবেন না।


3
ঠিক আছে, আপনি এবং ব্যবহারকারী 2720864 সঠিক ছিলেন। আমি কেবল message.max.bytesউত্স কোডটিতে সেট করেছিলাম । তবে আমাকে এই মানগুলি কাফকা সার্ভারের কনফিগারেশনে সেট করতে হবে config/server.properties। এখন আরও বড় বার্তা কাজ করে :)।
সানসন 123

3
এই মানগুলি অত্যধিক উচ্চতর স্থাপনের কোনও জ্ঞাত অসুবিধা রয়েছে কি?
ইভান বালাশভ

7
হ্যাঁ. গ্রাহক পক্ষ থেকে, আপনি fetch.message.max.bytesপ্রতিটি পার্টিশনের জন্য মেমরি বরাদ্দ করেন । এর অর্থ হ'ল আপনি যদি বিশাল সংখ্যক fetch.message.max.bytesপার্টিশনের সাথে একত্রিত হওয়ার জন্য বিশাল সংখ্যা ব্যবহার করেন তবে এটি প্রচুর স্মৃতি গ্রহণ করবে। আসলে, যেহেতু দালালদের মধ্যে প্রতিলিপি প্রক্রিয়াটিও একটি বিশেষ ভোক্তা, সুতরাং এটি দালালদের মধ্যে স্মৃতিশক্তি গ্রাস করবে।
laughing_man

3
নোট করুন প্রতি-টপিকের মধ্যে একটি max.message.bytesকনফিগারেশনও রয়েছে যা ব্রোকারের চেয়ে কম হতে পারে । message.max.bytes
পিটার ডেভিস

1
অফিসিয়াল ডকের মতে, ভোক্তার পক্ষের প্যারামিটারগুলি এবং দালালদের মধ্যে প্রতিলিপি সম্পর্কিত যেগুলি রয়েছে /.*fetch.*bytes/তা কঠোর সীমাবদ্ধ বলে মনে হয় না: "এটি একটি নিখুঁত সর্বোচ্চ নয়, যদি [...] এই মানের থেকে বড় হয়, রেকর্ড ব্যাচটি হবে তবুও অগ্রগতি হতে পারে তা নিশ্চিত করে ফিরিয়ে দেওয়া হবে। "
ব্লু

56

মাইনর জন্য প্রয়োজন বোধ করা পরিবর্তনগুলি কাফকা 0.10 এবং নতুন ভোক্তা তুলনায় laughing_man এর উত্তর :

  • ব্রোকার: কোনও পরিবর্তন নেই, আপনাকে এখনও সম্পত্তি বৃদ্ধি করতে হবে 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। একজন সন্দেহভাজন কর্মচারী আমার সন্দেহের আগেই নিশ্চিত করেছেন : যে দুটি পরিমাণ সত্যই সমান হতে পারে।
Kostas

2
সেখানে কোন আপডেট সংক্রান্ত হয় message.max.bytes<replica.fetch.max.bytesবা message.max.bytes=replica.fetch.max.bytes@Kostas?
সাসচা ভিটার 21

2
হ্যাঁ, তারা সমান হতে পারে: mail-archive.com/users@kafka.apache.org/msg25494.html (ইসমাইল কনফ্লুয়েন্টের পক্ষে কাজ করে)
Kostas

13

আপনাকে নিম্নলিখিত বৈশিষ্ট্যগুলি ওভাররাইড করতে হবে:

ব্রোকার কনফিগস ($ কেএফকাআহোম / কনফিগারেশন / সার্ভার.প্রোপার্টি)

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

কনজিউমার কনফিজ ($ কেএফকাআহোম / কনফিগার / কনজিউমার.প্রোপার্টি)
এই পদক্ষেপটি আমার পক্ষে কার্যকর হয়নি। আমি এটি ভোক্তা অ্যাপে যুক্ত করেছি এবং এটি ঠিকঠাক কাজ করছে

  • fetch.message.max.bytes

সার্ভারটি পুনরায় চালু করুন।

আরও তথ্যের জন্য এই ডকুমেন্টেশন দেখুন: http://kafka.apache.org/08/configration.html


1
কমান্ডলাইন গ্রাহকের জন্য, আমাকে --fetch-size = <bytes> পতাকা ব্যবহার করা উচিত। এটি কনজিউমার.প্রপার্টি ফাইল (কাফকা ০.৮.১) পড়তে পারে বলে মনে হচ্ছে না। আমিও সংক্ষেপণ কোডেক বিকল্পটি ব্যবহার করে প্রযোজক পক্ষ থেকে সংক্ষেপণ চালু করার পরামর্শ দেব।
জিগি ইউনিসিয়েন

জিগির মন্তব্যটি আমার জন্য কাজ করেছেন 0.8.1.1। ধন্যবাদ!
জেমস

এটা কি হতে পারে যে fetch.message.max.bytesটি কনজিউমারকনফিগের max.partition.fetch.bytes দ্বারা প্রতিস্থাপিত হয়েছে?
s_bei

12

কাফকা প্রযোজকের কাছ থেকে কাফকা ব্রোকারের কাছে সমান মাপের বার্তা পাঠানো এবং তারপরে কাফকা গ্রাহক যেমন পেয়েছেন তার ধারণা

কাফকা প্রযোজক -> কাফকা ব্রোকার -> কাফকা গ্রাহক

মনে করুন, যদি প্রয়োজন 15 এমবি বার্তা প্রেরণ করা হয়, তবে নির্মাতা , ব্রোকার এবং গ্রাহক , তিনটিই সমন্বয় করা দরকার।

কাফকা প্রযোজক 15 এমবি পাঠায় -> কাফকা ব্রোকার 15 এমবি অনুমতি দেয় / স্টোর করে -> কাফকা গ্রাহক 15 এমবি পান

সেটিংটি তাই হওয়া উচিত:

ক) দালালের উপর:

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

খ) গ্রাহকের উপর:

fetch.message.max.bytes=15728640

2
এটা কি হতে পারে যে fetch.message.max.bytesটি কনজিউমারকনফিগের max.partition.fetch.bytes দ্বারা প্রতিস্থাপিত হয়েছে?
s_bei

7

একটি বিশেষ জিনিস মনে রাখতে হবে যে message.max.bytesগুণটি অবশ্যই ভোক্তার সম্পত্তির সাথে সুসংগত হতে পারে fetch.message.max.bytes। আনার আকারটি অবশ্যই সর্বোচ্চ বার্তার আকারের হিসাবে কমপক্ষে বৃহত্তর হতে হবে অন্যথায় এমন পরিস্থিতি তৈরি হতে পারে যেখানে গ্রাহকরা গ্রাহক / আনতে পারে তার চেয়ে বড় বার্তা প্রেরণ করতে পারে। এটি একবার দেখে নেওয়া মূল্যবান হতে পারে।
আপনি কাফকার কোন সংস্করণ ব্যবহার করছেন? আপনি যে সন্ধান করছেন সে সম্পর্কে আরও কিছু বিশদ সরবরাহ করুন। payload size of xxxx larger than 1000000লগতে আসার মতো কিছু আছে ?


1
আমি আরও তথ্যের সাথে আমার প্রশ্ন আপডেট করেছি: কাফকা সংস্করণ 2.8.0-0.8.0; এখন আমার কেবল প্রযোজক দরকার।
সানসন 123

6

@ লাআলিং_ম্যানের উত্তর যথেষ্ট সঠিক। তবে তবুও, আমি একটি সুপারিশ দিতে চেয়েছিলাম যা আমি কাওকার কাছ থেকে কাফকার বিশেষজ্ঞ স্টিফেন মারেকের কাছ থেকে শিখেছি ।

কাফকা বড় বার্তা হ্যান্ডেল করার জন্য নয়।

আপনার এপিআই-তে ক্লাউড স্টোরেজ (প্রাক্তন এডাব্লুএস এস 3) ব্যবহার করা উচিত এবং কেবল কাফকা বা কোনও বার্তা ব্রোকারকে S3 এর উল্লেখ উল্লেখ করুন। আপনার ডেটা অবিরত রাখতে আপনাকে অবশ্যই কোথাও খুঁজে পেতে হবে, এটি কোনও নেটওয়ার্ক ড্রাইভ, সম্ভবত এটি যাই হোক না কেন, তবে এটি বার্তা ব্রোকার হওয়া উচিত নয়।

এখন, আপনি যদি উপরের সমাধানটি দিয়ে যেতে চান না

বার্তাটির সর্বোচ্চ আকার 1MB (আপনার ব্রোকারগুলিতে সেটিংস বলা হয় message.max.bytes) অ্যাপাচি কাফকা । আপনার যদি সত্যিই এটির খারাপভাবে প্রয়োজন হয় তবে আপনি সেই আকারটি বাড়িয়ে নিতে এবং আপনার প্রযোজক এবং ভোক্তাদের জন্য নেটওয়ার্ক বাফার বাড়ানোর বিষয়টি নিশ্চিত করতে পারেন।

এবং যদি আপনি সত্যিই আপনার বার্তা বিভক্ত করার বিষয়ে চিন্তা করেন তবে নিশ্চিত হন যে প্রতিটি বার্তা বিভাজনের ঠিক একই কী রয়েছে যাতে এটি একই পার্টিশনে চলে যায় এবং আপনার বার্তার সামগ্রীতে একটি "পার্ট আইডি" প্রতিবেদন করা উচিত যাতে আপনার গ্রাহক বার্তাটিকে সম্পূর্ণরূপে পুনর্গঠন করতে পারে ।

আপনি বার্তাটিও অন্বেষণ করতে পারেন, যদি আপনার বার্তাটি পাঠ্য-ভিত্তিক (জিজিপ, স্নেপ্পি, এলজে 4 সংকোচন) হয় যা ডেটার আকার হ্রাস করতে পারে তবে জাদুকরীভাবে নয়।

আবার, আপনাকে সেই তথ্য সঞ্চয় করতে একটি বাহ্যিক সিস্টেম ব্যবহার করতে হবে এবং কেবল কাফকার কাছে একটি বাহ্যিক রেফারেন্স চাপতে হবে। এটি একটি খুব সাধারণ আর্কিটেকচার এবং আপনার সাথে যাওয়া উচিত এবং এটি ব্যাপকভাবে গ্রহণযোগ্য।

মনে রাখবেন কাফকা কেবল তখনই সবচেয়ে ভাল কাজ করে যদি মেসেজগুলি বিশাল আকারে হয় তবে আকারে না থাকে।

সূত্র: https://www.quora.com/How-do-I-send-Large-messages-80-MB-in-Kafka


4
আপনি খেয়াল করা যে, "আপনার" সুপারিশ একটি প্রায় শব্দ জন্য শব্দ এ Stéphane Maarek এর কুয়োরা সুপারিশ কপি চাইতে পারেন quora.com/How-do-I-send-Large-messages-80-MB-in-Kafka
মাইক

কাফকা বড় বার্তা নিয়ে কাজ করে, একেবারেই কোনও সমস্যা নেই। কাফকার হোম পৃষ্ঠায় অন্তর্ভুক্ত পৃষ্ঠাগুলি এমনকি এটি স্টোরেজ সিস্টেম হিসাবে উল্লেখ করে।
কলোক_আরগ

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 usind হন তবে প্রযোজক কনফিগারেশনে 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",
   ... .. }                                                                                                                                                                                                                                                      
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.