क्या किसी विषय से सभी डेटा को हटाने या हर चलाने से पहले विषय को हटाने का एक तरीका है?


87

क्या किसी विषय से सभी डेटा को हटाने या हर चलाने से पहले विषय को हटाने का एक तरीका है?

क्या मैं logRetentionHoursसंपत्ति बदलने के लिए KafkaConfig.scala फ़ाइल को संशोधित कर सकता हूं ? क्या उपभोक्ता द्वारा इसे पढ़ते ही संदेश डिलीट हो जाता है?

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


जवाबों:


62

लगता है कि यह अभी तक समर्थित नहीं है। इस JIRA मुद्दे पर एक नज़र डालें "हटाएं विषय समर्थन जोड़ें"।

मैन्युअल रूप से हटाने के लिए:

  1. क्लस्टर बंद
  2. क्लीन काफ्का लॉग डीआईआर ( log.dirकाफ्का कॉन्फिग फ़ाइल में विशेषता द्वारा निर्दिष्ट ) और साथ ही ज़ूकीपर डेटा
  3. क्लस्टर को पुनरारंभ करें

किसी भी विषय के लिए आप क्या कर सकते हैं

  1. कफका बंद करो
  2. विभाजन के लिए विशिष्ट स्वच्छ कफ़्का लॉग, काफ़्का अपनी लॉग फ़ाइल को "logDir / विषय-विभाजन" के प्रारूप में संग्रहीत करता है, इसलिए "MyTopic" नाम के एक विषय के लिए विभाजन आईडी 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

इसके अलावा, क्या उपभोक्ता द्वारा इसे पढ़ते ही संदेश डिलीट हो जाता है?

से काफ्का प्रलेखन :

काफ्का क्लस्टर सभी प्रकाशित संदेशों को बरकरार रखता है - भले ही उनका उपभोग किया गया हो या नहीं - एक विन्यास योग्य समय के लिए। उदाहरण के लिए यदि लॉग रिटेंशन दो दिनों के लिए सेट है, तो एक संदेश प्रकाशित होने के बाद दो दिनों के लिए यह उपभोग के लिए उपलब्ध है, जिसके बाद इसे खाली स्थान को छोड़ दिया जाएगा। कफ़्का का प्रदर्शन डेटा आकार के संबंध में प्रभावी रूप से स्थिर है, इसलिए बहुत सारे डेटा को बनाए रखना कोई समस्या नहीं है।

वास्तव में प्रति-उपभोक्ता आधार पर बनाए गए एकमात्र मेटाडेटा लॉग में उपभोक्ता की स्थिति है, जिसे "ऑफसेट" कहा जाता है। इस ऑफसेट को उपभोक्ता द्वारा नियंत्रित किया जाता है: आम तौर पर एक उपभोक्ता अपने ऑफसेट को अग्रिम रूप से अग्रिम करेगा क्योंकि यह संदेश पढ़ता है, लेकिन वास्तव में स्थिति उपभोक्ता द्वारा नियंत्रित होती है और यह किसी भी क्रम में संदेशों को पसंद कर सकता है। उदाहरण के लिए एक उपभोक्ता पुनरावृत्ति के लिए एक पुराने ऑफसेट को रीसेट कर सकता है।

काफ्का 0.8 सरल उपभोक्ता उदाहरण में पढ़ने के लिए स्टार्ट ऑफ़सेट पढ़ने के लिए वे कहते हैं

काफ्का में मदद करने के लिए दो स्थिरांक शामिल हैं, 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];
}

मेरा मानना ​​है कि JIRA मुद्दे का सही लिंक मुद्दों है ।apache.org
jira/

4
विषय अभी भी यहाँ दिखाई देगा क्योंकि यह ज़ुकीपर में सूचीबद्ध है। आपको brokers/topics/<topic_to_delete>इससे छुटकारा पाने के लिए और साथ ही लॉग के तहत सब कुछ हटाना होगा।
सबमिशनडाइनड

3
समस्या लिंक के अनुसार, आप संस्करण 0.8.1 के बाद किसी विषय को हटा सकते हैं। आप विस्तार से मदद देख सकते हैं kafka-run-class.sh kafka.admin.DeleteTopicCommand
जय

5
अपडेट: कफका के रूप में 0.8.2 कमांड को बदल दिया गया है:kafka-run-class.sh kafka.admin.TopicCommand --delete --topic [topic_to_delete] --zookeeper localhost:2181
जे टेलर टेलर

मुझे लगता है कि यह सक्षम विषय विलोपन कार्यक्षमता अब जोड़ दी गई है। संभवत: अगले स्थिर रिलीज में यह होगा।
ha9u63ar

70

जैसा कि मैंने यहां बताया कि काजका कतार :

त्वरित प्रारंभ उदाहरण के लिए काफ्का 0.8.2 में परीक्षण किया गया: सबसे पहले, विन्यास फ़ोल्डर के तहत सर्वर.प्रॉपर्टी फ़ाइल में एक पंक्ति जोड़ें:

delete.topic.enable=true

फिर, आप इस कमांड को चला सकते हैं:

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

2
Btw, आपको विकल्प जोड़ने के बाद Kafka सर्वर को पुनरारंभ करने की आवश्यकता नहीं है, अगर कोई भी सोच रहा है।
समस्याग्रस्त

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.

नोट: यदि आप kafka- लॉग के अंदर विषय फ़ोल्डर / s हटा रहे हैं, लेकिन zookeeper-data फ़ोल्डर से नहीं, तो आप देखेंगे कि विषय अभी भी हैं।


8

गंदे वर्कअराउंड के रूप में, आप प्रति विषय रनटाइम रिटेंशन सेटिंग्स को समायोजित कर सकते हैं, उदाहरण के लिए bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic my_topic --config retention.bytes=1( रिटेंशन.बाइट्स = 0 भी काम कर सकते हैं)

थोड़ी देर के बाद काफ्का को स्थान खाली करना चाहिए। निश्चित नहीं है कि इस विषय को फिर से बनाने की तुलना में इसके कोई निहितार्थ हैं।

ps। एक बार सफाई के साथ काफ्का करने पर बेहतर है कि रिटेंशन सेटिंग वापस लाई जाए।

आप retention.msऐतिहासिक डेटा को जारी रखने के लिए भी उपयोग कर सकते हैं


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 / कफ़्का-लॉग्स) से निर्देशिका (ओं) को हटाना होगा और फिर ज़ुकीपर से विषय को हटाने के लिए इस स्क्रिप्ट को चलाना होगा। सत्यापित करने के लिए कि इसे ज़ूकीपर से हटाया गया है 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

1
यह केवल तभी काम करेगा जब नींद के उन 5 सेकंड के भीतर प्रतिधारण चेक होता है। कृपया सुनिश्चित करें कि आप तब तक सोते हैं जब तक कि जाँच निश्चित रूप से यहाँ निर्दिष्ट नहीं की गई हो:grep "log.retention.check.interval" $Kafka_Home/config/server.properties
कॉलिन

2
मैं उत्तर को संपादित करना चाहता था क्योंकि पहले कमांड में एक छोटी सी गलती है। लेकिन एक चरित्र संपादन की अनुमति नहीं है। वास्तव में यह नहीं है --add configबल्कि यह है--add-config
SRC

7

हमने बहुत कोशिश की कि सफलता के मध्यम स्तर के साथ अन्य उत्तर क्या बता रहे हैं। वास्तव में हमारे लिए काम किया (Apache Kafka 0.8.1) क्लास कमांड है

sh kafka-run-class.sh kafka.admin.DeleteTopicCommand --topic yourtopic --zookeeper localhost: 2181


2
यह 0.8.1 में कोशिश की। आदेश "विलोपन सफल हुआ!" हालाँकि यह लॉग फ़ोल्डर के अंदर विभाजन को नष्ट नहीं करता है।
दुविधा

8
0.8.2.1 (homebrew) पर कोशिश की गई और यह त्रुटि दे रहा है। Error: Could not find or load main class kafka.admin.DeleteTopicCommand
थानिश

2
नए काफ़्का (0.8.2) के रूप में, यह sh kafka-run-class.sh kafka.admin.TopicCommand --delete --topic [topic_for_delete] -zookeeper localhost: 2181 है। सुनिश्चित करें कि delete.topic.enable सच है।
लॉन्ग

3

काढ़ा उपयोगकर्ताओं के लिए

यदि आप brewमेरी तरह उपयोग कर रहे हैं और कुख्यात kafka-logsफ़ोल्डर की खोज में बहुत समय बर्बाद कर रहे हैं , तो अधिक डर नहीं है। (और कृपया मुझे बताएं कि क्या यह आपके और Homebrew, काफ्का आदि के कई अलग-अलग संस्करणों के लिए काम करता है :))

आप शायद इसे खोजने जा रहे हैं:

स्थान:

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


वास्तव में वह रास्ता कैसे खोजा जाए

(यह मूल रूप से हर ऐप जिसे आप काढ़ा के माध्यम से स्थापित करते हैं) के लिए भी उपयोगी है

1) brew services list

kafka ने matbhz /Users/matbhz/Library/LaunchAgents/homebrew.mxcl.kafka.plist शुरू किया

2) जो plistआपने ऊपर पाया, उसे खोलें और पढ़ें

3) लाइन को परिभाषित करने की server.propertiesस्थिति का पता लगाएं , इसे मेरे मामले में खोलें:

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

4) log.dirsलाइन के लिए देखो :

log.dirs = / usr / स्थानीय / var / lib / काफ्का-लॉग

5) उस स्थान पर जाएं और अपने इच्छित विषयों के लॉग को हटा दें

6) काफ्का को फिर से शुरू करें brew services restart kafka


2

विषयों और उसके विभाजन के बारे में सभी डेटा में संग्रहीत हैं tmp/kafka-logs/। इसके अलावा वे एक प्रारूप में संग्रहीत होते हैं topic-partionNumber, इसलिए यदि आप किसी विषय को हटाना चाहते हैं newTopic, तो आप यह कर सकते हैं:

  • कफका बंद करो
  • फ़ाइलों को हटा दें rm -rf /tmp/kafka-logs/newTopic-*

1
  1. चिड़ियाघर कीपर और काफ्का को रोकें
  2. Server.properties में, log.retention.hours मान बदलें। आप टिप्पणी log.retention.hoursकरके जोड़ सकते हैं log.retention.ms=1000। यह केवल एक सेकंड के लिए काफ्का टॉपिक पर रिकॉर्ड बनाए रखेगा।
  3. ज़ुकीपर और काफ्का शुरू करें।
  4. उपभोक्ता कंसोल पर जाँच करें। जब मैंने पहली बार कंसोल खोला, तो रिकॉर्ड था। लेकिन जब मैंने फिर से कंसोल खोला, तो रिकॉर्ड हटा दिया गया था।
  5. बाद में, आप log.retention.hoursअपने वांछित आंकड़े का मूल्य निर्धारित कर सकते हैं ।

1

कफका 2.3.0 संस्करण के रूप में, काफ्का के नरम विलोपन का एक वैकल्पिक तरीका है (पुराने दृष्टिकोण को हटा दिया गया है)।

अद्यतन प्रतिधारण .ms से 1 सेकंड (1000 मी) के बाद फिर से एक मिनट के बाद सेट करें, डिफ़ॉल्ट रूप से सेटिंग करने के लिए यानी 7 दिन (168 घंटे, 604,800,000 एमएस में)

नरम विलोपन: - (किराया-निर्धारण = १०००) (काफ्का-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>ZK में।


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)

  }


}

एक विकल्प हटाएं विषय है। लेकिन, यह विलोपन के लिए विषय को चिह्नित करता है। ज़ूकीपर बाद में विषय को हटा देता है। चूंकि यह अप्रत्याशित रूप से लंबा हो सकता है, इसलिए मैं रिटेंशन.एमएस दृष्टिकोण पसंद करता हूं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.