কোনও বিষয় থেকে সমস্ত ডেটা মুছে ফেলার বা প্রতি রানের আগে বিষয় মুছে ফেলার কোনও উপায় আছে কি?


89

কোনও বিষয় থেকে সমস্ত ডেটা মুছে ফেলার বা প্রতি রানের আগে বিষয় মুছে ফেলার কোনও উপায় আছে কি?

logRetentionHoursসম্পত্তিটি পরিবর্তন করতে আমি কি কাফকা কনফিগ.স্কালা ফাইলটি সংশোধন করতে পারি ? গ্রাহকরা পড়ার সাথে সাথে কী বার্তা মুছে ফেলা হবে?

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


উত্তর:


63

এটি এখনও সমর্থিত বলে মনে করবেন না। এই JIRA ইস্যুটি একবার দেখুন " বিষয়টিকে সমর্থন মুছুন"।

ম্যানুয়ালি মুছতে:

  1. গুচ্ছ বন্ধ
  2. ক্লাফ কাফকা লগ দির ( log.dirকাফকা কনফিগারেশন ফাইলে অ্যাট্রিবিউট দ্বারা নির্দিষ্ট করা ) পাশাপাশি চিড়িয়াখানার ডেটা
  3. ক্লাস্টারটি পুনরায় চালু করুন

যে কোনও প্রদত্ত বিষয়ের জন্য আপনি যা করতে পারেন তা হ'ল

  1. কাফকা থামো
  2. পার্টিশনের জন্য সুনির্দিষ্ট কাফকা লগ, কাফকা তার লগ ফাইলটিকে "লগডির / টপিক-পার্টিশন" এর ফর্ম্যাটে সংরক্ষণ করে তাই "মাইটিপিক" নামের একটি বিষয়ের জন্য পার্টিশন আইডি 0-র লগ সংরক্ষণ করা হবে /tmp/kafka-logs/MyTopic-0যেখানে বৈশিষ্ট্য /tmp/kafka-logsদ্বারা নির্দিষ্ট করা log.dirহয়েছে
  3. কাফকা পুনরায় চালু করুন

এটি NOTএকটি ভাল এবং প্রস্তাবিত পদ্ধতির তবে এটি কার্যকর হওয়া উচিত। কাফকা ব্রোকার কনফিগ ফাইলে বিশিষ্টতা log.retention.hours.per.topicসংজ্ঞায়িত করতে ব্যবহৃত হয়The number of hours to keep a log file before deleting it for some specific topic

এছাড়াও, গ্রাহকরা পড়ার সাথে সাথে কী বার্তা মুছে ফেলা হবে?

থেকে কাফকা ডকুমেন্টেশন :

কাফকা ক্লাস্টার একটি কনফিগারযোগ্য সময়ের জন্য সমস্ত প্রকাশিত বার্তা - সেগুলি গ্রাস করা হয়েছে কিনা তা ধরে রাখে। উদাহরণস্বরূপ, যদি লগ ধরে রাখার জন্য দু'দিন সেট করা থাকে, তবে কোনও বার্তা প্রকাশের পরে দু'দিনের জন্য এটি ব্যবহারের জন্য পাওয়া যায়, তার পরে স্থান খালি করার জন্য এটি বাতিল করা হবে। কাফকার পারফরম্যান্স ডেটা আকারের ক্ষেত্রে কার্যকরভাবে ধ্রুবক তাই প্রচুর ডেটা ধরে রাখা কোনও সমস্যা নয়।

প্রকৃতপক্ষে প্রতি গ্রাহক ভিত্তিতে একমাত্র মেটাডেটা ধরে রাখা হয় লগের মধ্যে থাকা গ্রাহকের অবস্থান, যাকে "অফসেট" বলা হয়। এই অফসেটটি ভোক্তা দ্বারা নিয়ন্ত্রিত হয়: সাধারণত কোনও গ্রাহক বার্তা পাঠ করার সাথে সাথে তার অফসেটটি রৈখিকভাবে অগ্রসর করবে, তবে বাস্তবে অবস্থানটি গ্রাহক দ্বারা নিয়ন্ত্রিত হয় এবং এটি পছন্দমতো কোনও ক্রমে বার্তা গ্রহণ করতে পারে। উদাহরণস্বরূপ, কোনও গ্রাহক পুনরায় প্রসেস করতে পুরানো অফসেটে পুনরায় সেট করতে পারেন।

কাফকা ০.৮ সাধারণ গ্রাহক উদাহরণে পড়তে শুরু করার অফসেটটি সন্ধান করার জন্য তারা say

কাফকার সাহায্যের জন্য দু'টি ধ্রুবক অন্তর্ভুক্ত রয়েছে, kafka.api.OffsetRequest.EarliestTime()লগগুলিতে ডেটার শুরু এবং এটি সেখান থেকে স্ট্রিমিং শুরু করে, kafka.api.OffsetRequest.LatestTime()কেবল নতুন বার্তা প্রবাহিত করবে।

আপনার ভোক্তার শেষে অফসেট পরিচালনা করার জন্য আপনি সেখানে উদাহরণ কোডটিও পেতে পারেন।

    public static long getLastOffset(SimpleConsumer consumer, String topic, int partition,
                                 long whichTime, String clientName) {
    TopicAndPartition topicAndPartition = new TopicAndPartition(topic, partition);
    Map<TopicAndPartition, PartitionOffsetRequestInfo> requestInfo = new HashMap<TopicAndPartition, PartitionOffsetRequestInfo>();
    requestInfo.put(topicAndPartition, new PartitionOffsetRequestInfo(whichTime, 1));
    kafka.javaapi.OffsetRequest request = new kafka.javaapi.OffsetRequest(requestInfo, kafka.api.OffsetRequest.CurrentVersion(),clientName);
    OffsetResponse response = consumer.getOffsetsBefore(request);

    if (response.hasError()) {
        System.out.println("Error fetching data Offset Data the Broker. Reason: " + response.errorCode(topic, partition) );
        return 0;
    }
    long[] offsets = response.offsets(topic, partition);
    return offsets[0];
}

আমি বিশ্বাস করি জেআইআরএ
ব্রাউজ

4
বিষয়টি এখানে এখনও প্রদর্শিত হবে কারণ এটি চিড়িয়াখানার তালিকায় রয়েছে। brokers/topics/<topic_to_delete>এটিকে পরিত্রাণ পেতে আপনাকে পুনরুক্তরূপে সমস্ত কিছু পাশাপাশি লগগুলি মুছতে হবে।
সাবমিডডিনিড

4
ইস্যু লিঙ্ক অনুসারে, আপনি সংস্করণ 0.8.1 এর পরে কোনও বিষয় মুছতে পারেন। আপনি বিস্তারিত সাহায্য দেখতে পারেন kafka-run-class.sh kafka.admin.DeleteTopicCommand
জয়

4
আপডেট: কাফকা 0.8.2 অনুসারে কমান্ডটি এতে পরিবর্তন করা হয়েছে:kafka-run-class.sh kafka.admin.TopicCommand --delete --topic [topic_to_delete] --zookeeper localhost:2181
জে টেলর

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

71

আমি এখানে পূর্বে কাফকা সারিতে উল্লেখ করেছি :

দ্রুত-সূচনা উদাহরণের জন্য কাফকার ০.৮.২-তে পরীক্ষা করা হয়েছে: প্রথমে সার্ভারে একটি লাইন যুক্ত করুন config

delete.topic.enable=true

তারপরে, আপনি এই আদেশটি চালাতে পারেন:

bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic test

4
বিটিডব্লিউ, অপশনটি যুক্ত করার পরে আপনাকে কাফকা সার্ভারটি পুনরায় চালু করার দরকার নেই, যদি কেউ ভাবছেন তবে।
সমস্যাসংক্রান্ত

14

কাফকা 0.10 দিয়ে পরীক্ষা করা হয়েছে

1. stop zookeeper & Kafka server,
2. then go to 'kafka-logs' folder , there you will see list of kafka topic folders, delete folder with topic name
3. go to 'zookeeper-data' folder , delete data inside that.
4. start zookeeper & kafka server again.

দ্রষ্টব্য: আপনি যদি কাফকা-লগের মধ্যে টপিক ফোল্ডার / গুলি মুছে ফেলছেন তবে চিড়িয়াখানার-ডেটা ফোল্ডার থেকে না, তবে আপনি দেখতে পাবেন যে বিষয়গুলি এখনও আছে।


8

একটি নোংরা কাজ হিসাবে, আপনি প্রতি টপিক রানটাইম ধরে রাখার সেটিংস সমন্বয় করতে পারেন, যেমন bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic my_topic --config retention.bytes=1( রিটেনশন.বিটস = 0 এছাড়াও কাজ করতে পারে)

কিছুক্ষণ পরে কাফকার স্থানটি মুক্ত করা উচিত। বিষয়টি পুনরায় তৈরির সাথে তুলনা করে এর কোনও প্রভাব আছে কিনা তা নিশ্চিত নই।

পুনশ্চ. রিটেনশন সেটিংস ফিরিয়ে আনা আরও ভাল, একবার কাফকা পরিষ্কারের পরে।

আপনি retention.mshistoricalতিহাসিক ডেটা অবিরত রাখতেও ব্যবহার করতে পারেন


8

চিড়িয়াখানা সার্ভার হিসাবে স্থানীয় হোস্ট ধরে এবং কাফকা_হোম ইনস্টল ডিরেক্টরিতে সেট করা আছে এমন একটি কাফকা বিষয় খালি করা এবং মুছে ফেলার জন্য নীচে স্ক্রিপ্টগুলি রয়েছে:

নীচের স্ক্রিপ্টটি তার বিষয়টিকে ধরে রাখার সময়টি 1 সেকেন্ডে সেট করে এবং এরপরে কনফিগারেশনটি সরিয়ে খালি করবে :

#!/bin/bash
echo "Enter name of topic to empty:"
read topicName
/$Kafka_Home/bin/kafka-configs --zookeeper localhost:2181 --alter --entity-type topics --entity-name $topicName --add-config retention.ms=1000
sleep 5
/$Kafka_Home/bin/kafka-configs --zookeeper localhost:2181 --alter --entity-type topics --entity-name $topicName --delete-config retention.ms

করতে সম্পূর্ণরূপে ডিলিট আপনি যে প্রসঙ্গে কোন প্রয়োগযোগ্য কাফকা দালাল (গুলি) বন্ধ করতে হবে এবং (ডিফল্ট: / tmp / 'কাফকা-লগগুলি) কাফকা লগ Dir থেকে এটা এর ডিরেক্টরি (গুলি) সরিয়ে এবং তারপর zookeeper থেকে বিষয় মুছে ফেলার জন্য এই স্ক্রিপ্টের চালানো। চিড়িয়াখানা থেকে এটি মুছে ফেলা হয়েছে তা যাচাই করতে ls / দালাল / বিষয়গুলির আউটপুট আর বিষয়টিকে অন্তর্ভুক্ত করা উচিত নয়:

#!/bin/bash
echo "Enter name of topic to delete from zookeeper:"
read topicName
/$Kafka_Home/bin/zookeeper-shell localhost:2181 <<EOF
rmr /brokers/topics/$topicName
ls /brokers/topics
quit
EOF

4
এটি কেবল তখনই কাজ করবে যদি ঘুমানোর 5 সেকেন্ডের মধ্যে রিটেনশন চেক হয়। চেকটি এখানে অবশ্যই নির্দিষ্ট হিসাবে পাস না হওয়া পর্যন্ত আপনি ঘুমাচ্ছেন তা নিশ্চিত করুন:grep "log.retention.check.interval" $Kafka_Home/config/server.properties
কলিন

4
প্রথম কমান্ডটিতে একটি ছোট্ট ভুল আছে বলে আমি উত্তরটি সম্পাদনা করতে চেয়েছিলাম। তবে একটি চরিত্রের সম্পাদনা অনুমোদিত নয়। আসলে এটি --add configবরং এটি নয়--add-config
এসআরসি 12

7

অন্যান্য উত্তরগুলি সাফল্যের মাঝারি স্তরের সাথে কী বর্ণনা করছে তা আমরা বেশ চেষ্টা করেছি। আমাদের জন্য যা সত্যই কাজ করেছে (অ্যাপাচি কাফকা ০.৮.১) তা ক্লাস কমান্ড

@ kafka-run-class.sh kafka.admin.DeleteTopicCommand - টপিক আপনার থেরাপিক - জুকিপার লোকালহোস্ট: 2181


4
0.8.1 এ চেষ্টা করেছেন। কমান্ডটি "মোছা সফল হয়েছে!" তবে এটি লগ ফোল্ডারগুলির মধ্যে থাকা পার্টিশনগুলি মুছবে না।
dilm

8
0.8.2.1 (homebrew) এ চেষ্টা করা হয়েছে এবং এটি এই ত্রুটি দিচ্ছে। Error: Could not find or load main class kafka.admin.DeleteTopicCommand
থানিশ

4
নতুন কাফকা (০.৮.২) হিসাবে, এটি শ কাফকা-রুন- ক্লাস.শ কাফকা.এডমিন.টপিককমন্ড - ডিলেট - টপিক [বিষয়_পরিবর্তন] -জুকিপার লোকালহোস্ট: 2181। নিশ্চিত করুন ডিলিট.টপিক.এনেবল সত্য is
হোং লং

4

মাতাল ব্যবহারকারীদের জন্য

আপনি যদি brewআমার মতো ব্যবহার করেন এবং কুখ্যাতদের সন্ধানে অনেক সময় নষ্ট করেনkafka-logs ফোল্ডারটি আর ভয় পাবেন না। (এবং দয়া করে এটি আমাকে এবং হোমব্রিউ, কাফকা ইত্যাদির একাধিক সংস্করণে কাজ করে কিনা তা আমাকে জানান))

আপনি সম্ভবত এটির নীচে এটি পেতে যাচ্ছেন:

অবস্থান:

/usr/local/var/lib/kafka-logs


কীভাবে আসলে সেই পথটি খুঁজে পাবেন

(এটি মূলত ব্রুয়ের মাধ্যমে ইনস্টল করা প্রতিটি অ্যাপের জন্যও সহায়ক)

1) brew services list

কাফকা শুরু হয়েছে ম্যাটিবিজেড / ইউজার / ম্যাটবিজেড / লাইবারি / লঞ্চআজেন্টস / হোমব্রু.এমএক্সসিএল.কাফকা.পল্লিস্ট

2) খুলুন এবং পড়ুন যে plistআপনি উপরে পেয়েছেন

3) server.propertiesআমার ক্ষেত্রে এটির অবস্থান নির্ধারণকারী লাইনটি সন্ধান করুন :

  • /usr/local/etc/kafka/server.properties

4) log.dirsলাইনটি দেখুন:

log.dirs = / usr / স্থানীয় / var / lib / কাফকা-লগ

5) সেই জায়গায় যান এবং আপনার ইচ্ছামত বিষয়গুলির লগগুলি মুছুন

)) কাফকা পুনরায় চালু করুন brew services restart kafka


2

বিষয় এবং এর পার্টিশন সম্পর্কিত সমস্ত ডেটা এতে জমা থাকে tmp/kafka-logs/। তবুও এগুলি একটি ফর্ম্যাটে সঞ্চিত রয়েছে topic-partionNumber, তাই আপনি যদি কোনও বিষয় মুছতে চান তবে আপনি এটি newTopicকরতে পারেন:

  • কাফকা বন্ধ করুন
  • ফাইলগুলি মুছুন rm -rf /tmp/kafka-logs/newTopic-*

1
  1. চিড়িয়াখানা এবং কাফকা বন্ধ করুন
  2. সার্ভার.প্রোপার্টিগুলিতে, লগ.রেটেনশন.সওয়ার্স মান পরিবর্তন করুন। আপনি মন্তব্য log.retention.hoursএবং যোগ করতে পারেন log.retention.ms=1000। এটি কেবল এক সেকেন্ডের জন্য কাফকা টপিকটিতে রেকর্ডটি রাখবে।
  3. চিড়িয়াখানা এবং কাফকা শুরু করুন।
  4. গ্রাহক কনসোল পরীক্ষা করুন। আমি যখন প্রথমবার কনসোলটি খুললাম তখন রেকর্ড ছিল। কিন্তু আমি আবার কনসোলটি খুললে রেকর্ডটি সরিয়ে ফেলা হয়েছিল।
  5. পরে, আপনি log.retention.hoursআপনার পছন্দসই চিত্রটির মান নির্ধারণ করতে পারেন ।

1

কাফকা ২.৩.০ সংস্করণ অনুসারে কাফকার নরম মোছার বিকল্প উপায় রয়েছে (পুরানো পদ্ধতির অবমূল্যায়ন)।

রিটেনশন.এমএসকে 1 সেকেন্ডে (1000 মিমি) আপডেট করুন তারপরে এটি একটি মিনিট পরে আবার সেট করুন ডিফল্ট সেটিংসে যেমন 7 দিন (168 ঘন্টা, 604,800,000 এমএস)

নরম মুছে ফেলা: - (renenter.ms = 1000) (kafka-configs.sh ব্যবহার করে)

bin/kafka-configs.sh --zookeeper 192.168.1.10:2181 --alter --entity-name kafka_topic3p3r --entity-type topics  --add-config retention.ms=1000
Completed Updating config for entity: topic 'kafka_topic3p3r'.

ডিফল্টতে সেট করা হচ্ছে: - 7 দিন (168 ঘন্টা, রিটেনশন.এমএস = 604800000)

bin/kafka-configs.sh --zookeeper 192.168.1.10:2181 --alter --entity-name kafka_topic3p3r --entity-type topics  --add-config retention.ms=604800000

0

কাফকা ক্লাস্টার থেকে কোনও বিষয় ম্যানুয়ালি মুছে ফেলার সময় আপনি কেবল এটি পরীক্ষা করে দেখতে পারেন https://github.com/darrenfu/bigdata/issues/6 বেশিরভাগ সমাধানে একটি অত্যাবশ্যক পদক্ষেপ মিস /config/topics/<topic_name>হয়েছে জেডকে-র ডিলিট করা ।


0

আমি এই স্ক্রিপ্ট ব্যবহার:

#!/bin/bash
topics=`kafka-topics --list --zookeeper zookeeper:2181`
for t in $topics; do 
    for p in retention.ms retention.bytes segment.ms segment.bytes; do
        kafka-topics --zookeeper zookeeper:2181 --alter --topic $t --config ${p}=100
    done
done
sleep 60
for t in $topics; do 
    for p in retention.ms retention.bytes segment.ms segment.bytes; do
        kafka-topics --zookeeper zookeeper:2181 --alter --topic $t --delete-config ${p}
    done
done

0

আমি আমার ইন্টিগ্রেশন পরীক্ষা চালানোর পরে পরিষ্কার করার জন্য নীচের ইউটিলিটিটি ব্যবহার করি।

এটি সর্বশেষতম AdminZkClientএপিআই ব্যবহার করে । পুরানো এপিআই হ্রাস করা হয়েছে।

import javax.inject.Inject
import kafka.zk.{AdminZkClient, KafkaZkClient}
import org.apache.kafka.common.utils.Time

class ZookeeperUtils @Inject() (config: AppConfig) {

  val testTopic = "users_1"

  val zkHost = config.KafkaConfig.zkHost
  val sessionTimeoutMs = 10 * 1000
  val connectionTimeoutMs = 60 * 1000
  val isSecure = false
  val maxInFlightRequests = 10
  val time: Time = Time.SYSTEM

  def cleanupTopic(config: AppConfig) = {

    val zkClient = KafkaZkClient.apply(zkHost, isSecure, sessionTimeoutMs, connectionTimeoutMs, maxInFlightRequests, time)
    val zkUtils = new AdminZkClient(zkClient)

    val pp = new Properties()
    pp.setProperty("delete.retention.ms", "10")
    pp.setProperty("file.delete.delay.ms", "1000")
    zkUtils.changeTopicConfig(testTopic , pp)
    //    zkUtils.deleteTopic(testTopic)

    println("Waiting for topic to be purged. Then reset to retain records for the run")
    Thread.sleep(60000L)

    val resetProps = new Properties()
    resetProps.setProperty("delete.retention.ms", "3000000")
    resetProps.setProperty("file.delete.delay.ms", "4000000")
    zkUtils.changeTopicConfig(testTopic , resetProps)

  }


}

বিষয় মোছার বিকল্প রয়েছে an তবে এটি মুছে ফেলার বিষয়টি চিহ্নিত করে। চিড়িয়াখানা পরে বিষয়টি মুছে দেয়। যেহেতু এটি অনির্দেশ্যভাবে দীর্ঘ হতে পারে, তাই আমি রিটেনশন.এমএস পদ্ধতির পছন্দ করি

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