আমি বার্তা দেওয়ার জন্য অ্যাপাচি কাফকা ব্যবহার করছি। আমি জাভা প্রযোজক এবং ভোক্তা বাস্তবায়ন করেছি। কীভাবে আমরা কোনও বিষয়ে বার্তাগুলির সংখ্যা পেতে পারি?
উত্তর:
ভোক্তার দৃষ্টিকোণ থেকে এটির জন্য মনে আসার একমাত্র উপায় হ'ল বার্তাগুলি প্রকৃতপক্ষে গ্রাস করা এবং সেগুলি গণনা করা।
কাফকা ব্রোকার জেএমএক্স কাউন্টারগুলি প্রারম্ভকালীন থেকে প্রাপ্ত বার্তাগুলির জন্য প্রকাশ করে তবে এর মধ্যে কতটি মুছে ফেলা হয়েছে তা আপনি জানতে পারবেন না।
বেশিরভাগ সাধারণ দৃশ্যে, কাফকার বার্তাগুলি অসীম প্রবাহ হিসাবে সর্বাধিক দেখা হয় এবং বর্তমানে ডিস্কে থাকা কতটির একটি পৃথক মান পাওয়া প্রাসঙ্গিক নয়। তদুপরি দালালদের একটি ক্লাস্টারের সাথে ডিল করার সময় জিনিসগুলি আরও জটিল হয়ে ওঠে যা সকলেরই একটি বিষয়ে বার্তাগুলির একটি সাবসেট থাকে।
এটি জাভা নয়, তবে এটি কার্যকর হতে পারে
./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}'
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
এবং তারপরে তফাতটি বিষয়টিতে প্রকৃত মুলতুবি বার্তা দেয়? আমি কি সঠিক?
আমি আসলে আমার পিসি বেঞ্চমার্কিংয়ের জন্য এটি ব্যবহার করি। আপনি যে আইটেমটি কনজিউমার অফসেটচেকার ব্যবহার করতে চান তা। আপনি নীচের মত বাশ স্ক্রিপ্ট ব্যবহার করে এটি চালাতে পারেন।
bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --topic test --zookeeper localhost:2181 --group testgroup
এবং নীচে ফলাফল: আপনি যেমন লাল বাক্সে দেখতে পাচ্ছেন, বর্তমানে বিষয়টিতে বার্তা সংখ্যা 999।
আপডেট: কনজিউমার অফসেট চেকার ০.১০.০.০১ থেকে অবহেলিত হয়েছে, আপনি কনজিউমারগ্রুপকম্যান্ড ব্যবহার শুরু করতে চাইতে পারেন।
কখনও কখনও আগ্রহটি প্রতিটি পার্টিশনে বার্তাগুলির সংখ্যা জানার ক্ষেত্রে আগ্রহী হয়, উদাহরণস্বরূপ, কাস্টম পার্টিশনারের পরীক্ষা করার সময় 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
বিষয়ের জন্য পার্টিশনের সংখ্যার উপর নির্ভর করে লাইনের সংখ্যা কমবেশি হতে পারে।
যেহেতু 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
Https://prestodb.io/docs/current/connector/kafka-tutorial.html ব্যবহার করুন
ফেসবুক দ্বারা সরবরাহ করা একটি সুপার এসকিউএল ইঞ্জিন, যা বেশ কয়েকটি ডেটা উত্সগুলিতে সংযুক্ত হয় (ক্যাসান্দ্রা, কাফকা, জেএমএক্স, রেডিস ...)।
PrestoDB optionচ্ছিক কর্মীদের সাথে একটি সার্ভার হিসাবে চলছে (অতিরিক্ত শ্রমিক ছাড়া একটি স্ট্যান্ডেলোন মোড রয়েছে), তারপরে আপনি কোয়েরি তৈরি করতে একটি ছোট এক্সিকিউটেবল জেআর (প্রেস্টো সিএলআই) বলে থাকেন।
একবার আপনি প্রেস্টো সার্ভারটি ভালভাবে কনফিগার করে নিলে আপনি traditionতিহ্যবাহী এসকিউএল ব্যবহার করতে পারেন:
SELECT count(*) FROM TOPIC_NAME;
অ্যাপাচি কাফকা কোনও বিষয়ের সমস্ত পার্টিশনে হাতছাড়া বার্তা পাওয়ার জন্য আদেশ:
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
বিষয়ের জন্য সমস্ত বার্তা সঞ্চিত পেতে আপনি প্রতিটি বিভাজনের জন্য প্রবাহের শুরু এবং শেষের দিকে গ্রাহককে অনুসন্ধান করতে এবং ফলাফলগুলি যোগ করতে পারেন
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());
নিম্নলিখিতটি চালান (ধরে নিচ্ছেন 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
যেহেতু সেই বিকল্পটি আর উপলভ্য নয় (বা স্পষ্টতই প্রয়োজনীয়)
কাফকার জাভা ক্লায়েন্টটি 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
।
আমার এই একই প্রশ্ন ছিল এবং আমি কোটলিনের কাফকা কনসুমার থেকে এইভাবেই এটি করছি:
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.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
আপনার যদি সার্ভারের জেএমএক্স ইন্টারফেসে অ্যাক্সেস থাকে তবে শুরু এবং শেষ অফসেটগুলি এখানে উপস্থিত থাকে:
kafka.log:type=Log,name=LogStartOffset,topic=TOPICNAME,partition=PARTITIONNUMBER
kafka.log:type=Log,name=LogEndOffset,topic=TOPICNAME,partition=PARTITIONNUMBER
(আপনি প্রতিস্থাপন করা প্রয়োজন TOPICNAME
& PARTITIONNUMBER
)। মনে রাখবেন আপনাকে প্রদত্ত পার্টিশনের প্রতিটি প্রতিলিপি পরীক্ষা করতে হবে, বা আপনার কোনও ব্রোকার কোনও প্রদত্ত পার্টিশনের জন্য নেতা (এবং এটি সময়ের সাথে সাথে পরিবর্তন করতে পারে) তা খুঁজে বের করতে হবে।
বিকল্পভাবে, আপনি কাফকা গ্রাহক পদ্ধতি beginningOffsets
এবং ব্যবহার করতে পারেন endOffsets
।
সবচেয়ে সহজ উপায় আমি খুঁজে পেয়েছি হ'ল কেফড্রপ আরএসটি এপিআই ব্যবহার করুন /topic/topicName
এবং একটি জেএসওএন প্রতিক্রিয়া ফিরে পেতে কী: "Accept"
/ মান: শিরোনামটি নির্দিষ্ট করা "application/json"
।
আপনি কাফকাতুল ব্যবহার করতে পারেন । দয়া করে এই লিঙ্কটি পরীক্ষা করুন -> http://www.kafkatool.com/download.html
কাফকা সরঞ্জাম অ্যাপাচি কাফকা ক্লাস্টার পরিচালনা ও ব্যবহারের জন্য একটি জিইউআই অ্যাপ্লিকেশন। এটি একটি স্বজ্ঞাত ইউআই সরবরাহ করে যা একজনকে দ্রুত কাফকা ক্লাস্টারের মধ্যে থাকা বস্তুর পাশাপাশি ক্লাস্টারের বিষয়গুলিতে সঞ্চিত বার্তাগুলি দেখার অনুমতি দেয়।