জাভা, অ্যাপাচি কাফকার কোনও বিষয়ে বার্তাগুলির সংখ্যা কীভাবে পাবেন


93

আমি বার্তা দেওয়ার জন্য অ্যাপাচি কাফকা ব্যবহার করছি। আমি জাভা প্রযোজক এবং ভোক্তা বাস্তবায়ন করেছি। কীভাবে আমরা কোনও বিষয়ে বার্তাগুলির সংখ্যা পেতে পারি?

উত্তর:


34

ভোক্তার দৃষ্টিকোণ থেকে এটির জন্য মনে আসার একমাত্র উপায় হ'ল বার্তাগুলি প্রকৃতপক্ষে গ্রাস করা এবং সেগুলি গণনা করা।

কাফকা ব্রোকার জেএমএক্স কাউন্টারগুলি প্রারম্ভকালীন থেকে প্রাপ্ত বার্তাগুলির জন্য প্রকাশ করে তবে এর মধ্যে কতটি মুছে ফেলা হয়েছে তা আপনি জানতে পারবেন না।

বেশিরভাগ সাধারণ দৃশ্যে, কাফকার বার্তাগুলি অসীম প্রবাহ হিসাবে সর্বাধিক দেখা হয় এবং বর্তমানে ডিস্কে থাকা কতটির একটি পৃথক মান পাওয়া প্রাসঙ্গিক নয়। তদুপরি দালালদের একটি ক্লাস্টারের সাথে ডিল করার সময় জিনিসগুলি আরও জটিল হয়ে ওঠে যা সকলেরই একটি বিষয়ে বার্তাগুলির একটি সাবসেট থাকে।


আমার উত্তর দেখুন stackoverflow.com/a/47313863/2017567 । জাভা কাফকা ক্লায়েন্ট সেই তথ্যটি পেতে অনুমতি দেয়।
ক্রিস্টোফ কুইন্টার্ড

96

এটি জাভা নয়, তবে এটি কার্যকর হতে পারে

./bin/kafka-run-class.sh kafka.tools.GetOffsetShell 
  --broker-list <broker>:  <port> 
  --topic <topic-name> --time -1 --offsets 1 
  | awk -F  ":" '{sum += $3} END {print sum}'

12
পার্টিশনের যোগফলের ক্ষেত্রে এটি কি আরতমতম এবং সর্বশেষতম অফসেটের পার্থক্য হওয়া উচিত নয়? bash-4.3# $KAFKA_HOME/bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list 10.35.25.95:32774 --topic test-topic --time -1 | awk -F ":" '{sum += $3} END {print sum}' 13818663 bash-4.3# $KAFKA_HOME/bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list 10.35.25.95:32774 --topic test-topic --time -2 | awk -F ":" '{sum += $3} END {print sum}' 12434609 এবং তারপরে তফাতটি বিষয়টিতে প্রকৃত মুলতুবি বার্তা দেয়? আমি কি সঠিক?
কিসনা

4
হ্যা, এটা সত্য. প্রারম্ভিক অফসেটগুলি শূন্যের সমান না হলে আপনাকে একটি পার্থক্য গণনা করতে হবে।
ssemichev

আমি যা ভেবেছিলাম :).
কিসনা

4
কোনও এপিআই এবং কোনও কোডের (জাভা, স্কেলা বা পাইথন) ভিতরে ব্যবহার করার কোনও উপায় আছে কি?
সালভব

কাফকা থেকে আমার কোড এবং কোডের মিশ্রণটি এখানে। এটি দরকারী হতে পারে। কাফকা ইন্টিগ্রেশন KafkaClient - আমি স্পার্ক স্ট্রিমিং করার জন্য এটি ব্যবহৃত gist.github.com/ssemichev/c2d94dce7ad65339c9637e1b461f86cf KafkaCluster gist.github.com/ssemichev/fa3605c7b10cb6c7b9c8ab54ffbc5865
ssemichev

17

আমি আসলে আমার পিসি বেঞ্চমার্কিংয়ের জন্য এটি ব্যবহার করি। আপনি যে আইটেমটি কনজিউমার অফসেটচেকার ব্যবহার করতে চান তা। আপনি নীচের মত বাশ স্ক্রিপ্ট ব্যবহার করে এটি চালাতে পারেন।

bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker  --topic test --zookeeper localhost:2181 --group testgroup

এবং নীচে ফলাফল: এখানে চিত্র বর্ণনা লিখুন আপনি যেমন লাল বাক্সে দেখতে পাচ্ছেন, বর্তমানে বিষয়টিতে বার্তা সংখ্যা 999।

আপডেট: কনজিউমার অফসেট চেকার ০.১০.০.০১ থেকে অবহেলিত হয়েছে, আপনি কনজিউমারগ্রুপকম্যান্ড ব্যবহার শুরু করতে চাইতে পারেন।


4
অনুগ্রহ করে নোট করুন যে কনজিউমার অফসেট চেকার অবনতিহীন এবং 0.9.0 এর পরে প্রকাশে ছেড়ে দেওয়া হবে। পরিবর্তে কনজিউমারগ্রুপকম্যান্ড ব্যবহার করুন। (kafka.tools.ConumerOffsetChecker $)
সিজমন সাদো

4
হ্যাঁ, আমি যা বলেছিলাম।
রুডি

আপনার শেষ বাক্যটি সঠিক নয়। উপরের কমান্ডটি এখনও 0.10.0.1 এ কাজ করে এবং সতর্কতাটি আমার আগের মন্তব্যের মতোই।
সিজমন সাদো

14

কখনও কখনও আগ্রহটি প্রতিটি পার্টিশনে বার্তাগুলির সংখ্যা জানার ক্ষেত্রে আগ্রহী হয়, উদাহরণস্বরূপ, কাস্টম পার্টিশনারের পরীক্ষা করার সময় Conf.২ থেকে কাফকার সাথে কাজ করার জন্য পরবর্তী পদক্ষেপগুলি পরীক্ষা করা হয়েছে ..২। একটি কাফকা বিষয় ktএবং নিম্নলিখিত কমান্ড-লাইন দেওয়া হয়েছে:

$ kafka-run-class kafka.tools.GetOffsetShell \
  --broker-list host01:9092,host02:9092,host02:9092 --topic kt

এটি তিনটি পার্টিশনে বার্তাগুলির গণনা দেখিয়ে নমুনা আউটপুট প্রিন্ট করে:

kt:2:6138
kt:1:6123
kt:0:6137

বিষয়ের জন্য পার্টিশনের সংখ্যার উপর নির্ভর করে লাইনের সংখ্যা কমবেশি হতে পারে।


4
যদি লগ কমপ্যাকশন সক্ষম থাকে, তবে পার্টিশনের অফসেটগুলি সংমিশ্রণ করা বিষয়টিতে বার্তাগুলির সঠিক গণনা দিতে পারে না।

14

যেহেতু ConsumerOffsetCheckerআর সমর্থিত নয়, আপনি বিষয়টিতে সমস্ত বার্তা পরীক্ষা করতে এই আদেশটি ব্যবহার করতে পারেন:

bin/kafka-run-class.sh kafka.admin.ConsumerGroupCommand \
    --group my-group \
    --bootstrap-server localhost:9092 \
    --describe

LAGবিষয় বিভাগে বার্তাগুলির সংখ্যা কোথায় :

এখানে চিত্র বর্ণনা লিখুন

এছাড়াও আপনি কাফকাট ব্যবহার করার চেষ্টা করতে পারেন । এটি একটি ওপেন সোর্স প্রকল্প যা আপনাকে কোনও বিষয় এবং বিভাজন থেকে বার্তাগুলি পড়তে এবং সেগুলি স্টাডআউটে প্রিন্ট করতে সহায়তা করতে পারে। এখানে একটি নমুনা রয়েছে যা sample-kafka-topicবিষয় থেকে শেষ 10 বার্তাগুলি পড়ছে , তারপরে প্রস্থান করুন:

kafkacat -b localhost:9092 -t sample-kafka-topic -p 0 -o -10 -e

11

Https://prestodb.io/docs/current/connector/kafka-tutorial.html ব্যবহার করুন

ফেসবুক দ্বারা সরবরাহ করা একটি সুপার এসকিউএল ইঞ্জিন, যা বেশ কয়েকটি ডেটা উত্সগুলিতে সংযুক্ত হয় (ক্যাসান্দ্রা, কাফকা, জেএমএক্স, রেডিস ...)।

PrestoDB optionচ্ছিক কর্মীদের সাথে একটি সার্ভার হিসাবে চলছে (অতিরিক্ত শ্রমিক ছাড়া একটি স্ট্যান্ডেলোন মোড রয়েছে), তারপরে আপনি কোয়েরি তৈরি করতে একটি ছোট এক্সিকিউটেবল জেআর (প্রেস্টো সিএলআই) বলে থাকেন।

একবার আপনি প্রেস্টো সার্ভারটি ভালভাবে কনফিগার করে নিলে আপনি traditionতিহ্যবাহী এসকিউএল ব্যবহার করতে পারেন:

SELECT count(*) FROM TOPIC_NAME;

এই সরঞ্জামটি দুর্দান্ত, তবে যদি আপনার বিষয়টিতে 2 টির বেশি বিন্দু থাকে তবে এটি কাজ করে না।
আরমান্ডফ্প

7

অ্যাপাচি কাফকা কোনও বিষয়ের সমস্ত পার্টিশনে হাতছাড়া বার্তা পাওয়ার জন্য আদেশ:

kafka-run-class kafka.tools.ConsumerOffsetChecker 
    --topic test --zookeeper localhost:2181 
    --group test_group

মুদ্রণ:

Group      Topic        Pid Offset          logSize         Lag             Owner
test_group test         0   11051           11053           2               none
test_group test         1   10810           10812           2               none
test_group test         2   11027           11028           1               none

6 কলামটি হ্যান্ডেল করা বার্তা। এগুলি এটিকে যুক্ত করুন:

kafka-run-class kafka.tools.ConsumerOffsetChecker 
    --topic test --zookeeper localhost:2181 
    --group test_group 2>/dev/null | awk 'NR>1 {sum += $6} 
    END {print sum}'

awk সারিগুলি পড়ে, শিরোনামের লাইনটি এড়িয়ে যায় এবং 6th ষ্ঠ কলাম যুক্ত করে এবং শেষে সমষ্টিটি মুদ্রণ করে।

প্রিন্ট

5

5

বিষয়ের জন্য সমস্ত বার্তা সঞ্চিত পেতে আপনি প্রতিটি বিভাজনের জন্য প্রবাহের শুরু এবং শেষের দিকে গ্রাহককে অনুসন্ধান করতে এবং ফলাফলগুলি যোগ করতে পারেন

List<TopicPartition> partitions = consumer.partitionsFor(topic).stream()
        .map(p -> new TopicPartition(topic, p.partition()))
        .collect(Collectors.toList());
    consumer.assign(partitions); 
    consumer.seekToEnd(Collections.emptySet());
Map<TopicPartition, Long> endPartitions = partitions.stream()
        .collect(Collectors.toMap(Function.identity(), consumer::position));
    consumer.seekToBeginning(Collections.emptySet());
System.out.println(partitions.stream().mapToLong(p -> endPartitions.get(p) - consumer.position(p)).sum());

4
বিটিডব্লিউ, আপনি যদি সংযোগ চালু রেখেছেন তবে স্ট্রিমের ফাঁকফোকর থাকতে পারে তাই বার্তার প্রকৃত সংখ্যা এখানে গণনা করা মোটের চেয়ে কম হতে পারে। একটি সঠিক মোট পেতে আপনাকে বার্তাগুলি পুনরায় খেলতে হবে এবং সেগুলি গণনা করতে হবে।
অটোমেটেডমাইক

5

নিম্নলিখিতটি চালান (ধরে নিচ্ছেন kafka-console-consumer.shযে পথে চলছে):

kafka-console-consumer.sh  --from-beginning \
--bootstrap-server yourbroker:9092 --property print.key=true  \
--property print.value=false --property print.partition \
--topic yourtopic --timeout-ms 5000 | tail -n 10|grep "Processed a total of"

দ্রষ্টব্য: আমি অপসারণ করেছি --new-consumerযেহেতু সেই বিকল্পটি আর উপলভ্য নয় (বা স্পষ্টতই প্রয়োজনীয়)
স্টিফেনবোশ

3

কাফকার জাভা ক্লায়েন্টটি 2.11-1.0.0 ব্যবহার করে, আপনি নিম্নলিখিত জিনিসটি করতে পারেন:

    KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
    consumer.subscribe(Collections.singletonList("test"));
    while(true) {
        ConsumerRecords<String, String> records = consumer.poll(100);
        for (ConsumerRecord<String, String> record : records) {
            System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());

            // after each message, query the number of messages of the topic
            Set<TopicPartition> partitions = consumer.assignment();
            Map<TopicPartition, Long> offsets = consumer.endOffsets(partitions);
            for(TopicPartition partition : offsets.keySet()) {
                System.out.printf("partition %s is at %d\n", partition.topic(), offsets.get(partition));
            }
        }
    }

আউটপুট এরকম কিছু:

offset = 10, key = null, value = un
partition test is at 13
offset = 11, key = null, value = deux
partition test is at 13
offset = 12, key = null, value = trois
partition test is at 13

আমি আপনাকে @ অটোমেটেড মাইকের উত্তরের তুলনায় উত্তর দিতে পছন্দ করি যেহেতু আপনার উত্তরটি গণ্ডগোল করে না seekToEnd(..)এবং যে seekToBeginning(..)পদ্ধতিগুলি এর অবস্থার পরিবর্তন করে consumer
অ্যাডাসলাও

2

কাফকা ম্যানেজারের সাম্প্রতিক সংস্করণগুলিতে সামিড সাম্প্রতিক অফসেট শিরোনামে একটি কলাম রয়েছে ।

এখানে চিত্র বর্ণনা লিখুন


2

আমার এই একই প্রশ্ন ছিল এবং আমি কোটলিনের কাফকা কনসুমার থেকে এইভাবেই এটি করছি:

val messageCount = consumer.listTopics().entries.filter { it.key == topicName }
    .map {
        it.value.map { topicInfo -> TopicPartition(topicInfo.topic(), topicInfo.partition()) }
    }.map { consumer.endOffsets(it).values.sum() - consumer.beginningOffsets(it).values.sum()}
    .first()

খুব রুক্ষ কোড, যেমন আমি ঠিক এটি কাজ করতে পেরেছি তবে মূলত আপনি টপিকের শুরুটি অফসেট থেকে শেষের অফসেট থেকে বিয়োগ করতে চান এবং এটি হ'ল টপিকটির বর্তমান বার্তা গণনা।

আপনি কেবল অন্য কনফিগারেশনের (ক্লিনআপ নীতি, রিটেনশন-এমএস ইত্যাদি) কারণে অফসেটের উপর নির্ভর করতে পারবেন না যা আপনার বিষয় থেকে পুরানো বার্তাগুলি মুছে ফেলার কারণ হতে পারে। অফসেটগুলি কেবল "সরানো" এগিয়ে যায়, সুতরাং এটি শুরু করা অফসেটটি শেষ অফসেটের (বা শেষ পর্যন্ত একই মানটিতে, যদি বিষয়টিতে এখনই কোনও বার্তা না থাকে) কাছাকাছি চলে যাবে।

মূলত শেষ অফসেটটি সেই বিষয়টির মধ্য দিয়ে যাওয়া সামগ্রিক বার্তাকে উপস্থাপন করে এবং দুজনের মধ্যে পার্থক্যটি এই মুহূর্তে টপিকটিতে থাকা বার্তাগুলির সংখ্যা উপস্থাপন করে।


0

কাফকা ডক্সের অংশগুলি

0.9.0.0 এ অবচয়

Kafka-consumer-offset-checker.sh (kafka.tools.ConsumerOffsetChecker) হ্রাস করা হয়েছে। এগিয়ে যাওয়ার জন্য, দয়া করে এই কার্যকারিতার জন্য kafka-consumer-groups.sh (kafka.admin.ConsumerGroupCommand) ব্যবহার করুন।

আমি সার্ভার এবং ক্লায়েন্ট উভয়ের জন্য এসএসএল সক্ষম করে কাফকা ব্রোকারটি চালাচ্ছি। কমান্ডের নীচে আমি ব্যবহার করি

kafka-consumer-groups.sh --bootstrap-server Broker_IP:Port --list --command-config /tmp/ssl_config kafka-consumer-groups.sh --bootstrap-server Broker_IP:Port --command-config /tmp/ssl_config --describe --group group_name_x

যেখানে / tmp / ssl_config নীচের মত রয়েছে

security.protocol=SSL
ssl.truststore.location=truststore_file_path.jks
ssl.truststore.password=truststore_password
ssl.keystore.location=keystore_file_path.jks
ssl.keystore.password=keystore_password
ssl.key.password=key_password

0

আপনার যদি সার্ভারের জেএমএক্স ইন্টারফেসে অ্যাক্সেস থাকে তবে শুরু এবং শেষ অফসেটগুলি এখানে উপস্থিত থাকে:

kafka.log:type=Log,name=LogStartOffset,topic=TOPICNAME,partition=PARTITIONNUMBER
kafka.log:type=Log,name=LogEndOffset,topic=TOPICNAME,partition=PARTITIONNUMBER

(আপনি প্রতিস্থাপন করা প্রয়োজন TOPICNAME& PARTITIONNUMBER)। মনে রাখবেন আপনাকে প্রদত্ত পার্টিশনের প্রতিটি প্রতিলিপি পরীক্ষা করতে হবে, বা আপনার কোনও ব্রোকার কোনও প্রদত্ত পার্টিশনের জন্য নেতা (এবং এটি সময়ের সাথে সাথে পরিবর্তন করতে পারে) তা খুঁজে বের করতে হবে।

বিকল্পভাবে, আপনি কাফকা গ্রাহক পদ্ধতি beginningOffsetsএবং ব্যবহার করতে পারেন endOffsets


-1

আমি চেষ্টা করিনি এই নিজেকে, কিন্তু এটা জানার জন্য বলে মনে হয়।

আপনি kafka.tools.ConsumerOffsetChecker( উত্স ) ব্যবহার করতে পারেন ।


-1

সবচেয়ে সহজ উপায় আমি খুঁজে পেয়েছি হ'ল কেফড্রপ আরএসটি এপিআই ব্যবহার করুন /topic/topicNameএবং একটি জেএসওএন প্রতিক্রিয়া ফিরে পেতে কী: "Accept"/ মান: শিরোনামটি নির্দিষ্ট করা "application/json"

এটি এখানে নথিভুক্ত করা হয়


-1

আপনি কাফকাতুল ব্যবহার করতে পারেন । দয়া করে এই লিঙ্কটি পরীক্ষা করুন -> http://www.kafkatool.com/download.html

কাফকা সরঞ্জাম অ্যাপাচি কাফকা ক্লাস্টার পরিচালনা ও ব্যবহারের জন্য একটি জিইউআই অ্যাপ্লিকেশন। এটি একটি স্বজ্ঞাত ইউআই সরবরাহ করে যা একজনকে দ্রুত কাফকা ক্লাস্টারের মধ্যে থাকা বস্তুর পাশাপাশি ক্লাস্টারের বিষয়গুলিতে সঞ্চিত বার্তাগুলি দেখার অনুমতি দেয়।এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.