Her çalıştırmadan önce bir konudaki tüm verileri veya konuyu silmenin bir yolu var mı?


89

Her çalıştırmadan önce bir konudaki tüm verileri veya konuyu silmenin bir yolu var mı?

KafkaConfig.scala dosyasını değiştirerek logRetentionHours ? Tüketici okur okumaz mesajların silinmesinin bir yolu var mı?

Verileri bir yerden almak ve tüketicinin tükettiği belirli bir konuya göndermek için üreticileri kullanıyorum, her çalıştırmada o konudaki tüm verileri silebilir miyim? Konuyla ilgili her seferinde sadece yeni veriler istiyorum. Konuyu bir şekilde yeniden başlatmanın bir yolu var mı?


Yanıtlar:


63

Henüz desteklendiğini düşünmeyin. Bu JIRA sorununa bir göz atın "Konu silme desteği ekle".

Manuel olarak silmek için:

  1. Kümeyi kapatın
  2. Kafka günlük dizinini ( log.dirkafka yapılandırma dosyasındaki öznitelikle belirtilir ) ve zookeeper verilerini temizleyin
  3. Kümeyi yeniden başlatın

Herhangi bir konu için yapabilecekleriniz

  1. Dur kafka
  2. Bölüme özgü temiz kafka günlüğü, kafka günlük dosyasını "logDir / topic-partition" biçiminde saklar, bu nedenle "MyTopic" adlı bir konu için, bölüm kimliği 0 için günlük , öznitelik tarafından belirtildiği /tmp/kafka-logs/MyTopic-0yerde depolanır./tmp/kafka-logslog.dir
  3. Kafka'yı yeniden başlatın

Bu NOTiyi ve önerilen bir yaklaşım ama işe yaramalı. Kafka komisyoncu yapılandırma dosyasında log.retention.hours.per.topicöznitelik,The number of hours to keep a log file before deleting it for some specific topic

Ayrıca, tüketici okur okur okumaz mesajların silinmesinin bir yolu var mı?

Gönderen Kafka Belgeler :

Kafka kümesi, tüketilmiş olsun veya olmasın, yayınlanan tüm iletileri yapılandırılabilir bir süre boyunca tutar. Örneğin, günlük saklama süresi iki gün olarak ayarlanmışsa, bir mesaj yayınlandıktan sonraki iki gün boyunca tüketime hazır olur ve ardından yer açmak için silinir. Kafka'nın performansı veri boyutuna göre etkin bir şekilde sabittir, bu nedenle çok sayıda veriyi tutmak bir sorun değildir.

Aslında, tüketici bazında tutulan tek meta veri, tüketicinin günlükteki "ofset" adı verilen konumudur. Bu dengeleme, tüketici tarafından kontrol edilir: normalde bir tüketici, mesajlarını okurken ofsetini doğrusal olarak ilerletir, ancak aslında konum tüketici tarafından kontrol edilir ve mesajları istediği sırayla tüketebilir. Örneğin, bir tüketici yeniden işlemek için daha eski bir ofsete sıfırlayabilir.

Kafka 0.8 Basit Tüketici örneğinde okunacak başlangıç ​​ofsetini bulmak için şöyle derler:

Kafka yardımcı olacak iki sabit içerir kafka.api.OffsetRequest.EarliestTime(), günlüklerdeki verilerin başlangıcını bulur ve oradan akışa başlar kafka.api.OffsetRequest.LatestTime(), yalnızca yeni mesajlar yayınlar.

Tüketici tarafınızdaki ofseti yönetmek için örnek kodu burada da bulabilirsiniz.

    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 sorununun doğru bağlantısının sorunlar.apache.org/jira/browse/KAFKA-330
asmaier

4
Konu, hayvanat bahçesi görevlisinde listelendiği için burada görünmeye devam edecek. brokers/topics/<topic_to_delete>Ondan kurtulmak için günlüklerin yanı sıra altındaki her şeyi yinelemeli olarak silmeniz gerekir.
SubmittedDenied

3
Sorun bağlantısına göre, 0.8.1 sürümünden sonra bir konuyu silebilirsiniz. Ayrıntılı yardımı görüntüleyebilirsiniz kafka-run-class.sh kafka.admin.DeleteTopicCommand.
Jay

5
Güncelleme: kafka 0.8.2 itibariyle komut şu şekilde değiştirildi:kafka-run-class.sh kafka.admin.TopicCommand --delete --topic [topic_to_delete] --zookeeper localhost:2181
Jay Taylor

Sanırım bu etkin konu silme işlevi eklendi. Muhtemelen bir sonraki kararlı sürüm buna sahip olacaktır.
ha9u63ar

71

Burada bahsettiğim gibi Kafka Kuyruğunu Temizle :

Hızlı başlangıç ​​örneği için Kafka 0.8.2'de test edilmiştir: İlk olarak, config klasörü altındaki server.properties dosyasına bir satır ekleyin:

delete.topic.enable=true

daha sonra bu komutu çalıştırabilirsiniz:

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

2
Btw, herhangi birinin merak etmesi durumunda seçeneği ekledikten sonra Kafka sunucusunu yeniden başlatmanıza gerek yok.
problemofficer

14

Kafka 0.10 ile test edildi

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.

Not: kafka-logs içindeki konu klasörlerini / klasörlerini siliyor ancak zookeeper-data klasöründen siliyorsanız, konuların hala orada olduğunu göreceksiniz.


8

Kirli bir çözüm olarak, konu başına çalışma zamanı saklama ayarlarını düzenleyebilirsiniz, örneğin bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic my_topic --config retention.bytes=1( retention.bytes = 0 da işe yarayabilir)

Kısa bir süre sonra kafka alanı boşaltmalıdır. Konuyu yeniden oluşturmaya kıyasla bunun herhangi bir etkisi olup olmadığından emin değilim.

ps. Kafka temizlikle bittiğinde saklama ayarlarını geri getirmeniz daha iyi olur.

retention.msGeçmiş verileri kalıcı hale getirmek için de kullanabilirsiniz


8

Aşağıda, bir Kafka konusunu boşaltmak ve silmek için, localhost'u zookeeper sunucusu olarak varsayarak ve Kafka_Home'un kurulum dizinine ayarlı olduğunu varsayan komut dosyaları verilmiştir:

Aşağıdaki komut dosyası , saklama süresini 1 saniyeye ayarlayıp ardından yapılandırmayı kaldırarak bir konuyu boşaltacaktır :

#!/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

Konuları tamamen silmek için, uygulanabilir kafka broker (ları) 'nı durdurmalı ve bunun dizinlerini kafka log dizininden kaldırmalısınız (varsayılan: / tmp / kafka-logs) ve ardından konuyu zookeeper'dan kaldırmak için bu betiği çalıştırmalısınız. Zookeeper'dan silindiğini doğrulamak için ls / brokers / topics'in çıktısı artık konuyu içermemelidir:

#!/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
Bu, yalnızca saklama denetimi uyuduktan sonraki 5 saniye içinde olursa işe yarar. Lütfen kontrol burada belirtildiği gibi kesinlikle geçene kadar uyuduğunuzdan emin olun:grep "log.retention.check.interval" $Kafka_Home/config/server.properties
colin

2
İlk komutta küçük bir hata olduğu için cevabı düzenlemek istedim. Ancak bir karakter düzenlemesine izin verilmez. Aslında öyle değil --add configöyle değil--add-config
SRC

7

Diğer cevapların anlattıklarını makul düzeyde bir başarı ile denedik. Bizim için gerçekten işe yarayan şey (Apache Kafka 0.8.1), sınıf komutudur

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


2
Bunu 0.8.1'de denedi. Komut, "silme başarılı!" Döndürür. ancak günlük klasörleri içindeki bölümleri silmez.
dilm

8
0.8.2.1 (homebrew) üzerinde denendi ve bu hatayı veriyor. Error: Could not find or load main class kafka.admin.DeleteTopicCommand
Thanish

2
Yeni kafka (0.8.2) itibariyle, sh kafka-run-class.sh kafka.admin.TopicCommand --delete --topic [topic_for_delete] --zookeeper localhost: 2181'dir. Delete.topic.enable'ın doğru olduğundan emin olun.
Hoàng Long

4

Bira kullanıcıları için

brewBenim gibi kullanıyorsanız ve kötü şöhretli kafka-logsklasörü aramak için çok zaman harcıyorsanız , artık korkmayın. (ve lütfen bunun sizin için ve Homebrew, Kafka'nın vb. birden çok farklı sürümü için işe yarayıp yaramadığını bana bildirin :))

Muhtemelen onu altında bulacaksın:

Yer:

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


Bu yolu nasıl bulabilirim

(Bu, temelde demleme yoluyla yüklediğiniz her uygulama için de yararlıdır)

1) brew services list

kafka matbhz /Users/matbhz/Library/LaunchAgents/homebrew.mxcl.kafka.plist başladı

2) Açın ve okuyun plist yukarıda bulduğunuzu

3) server.propertiesKonumu tanımlayan satırı bulun, benim durumumda açın:

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

4) Şu log.dirssatırı arayın :

log.dirs = / usr / local / var / lib / kafka-logs

5) O konuma gidin ve istediğiniz konuların günlüklerini silin

6) Kafka'yı yeniden başlatın. brew services restart kafka


2

Konular ve bölümleri hakkındaki tüm veriler içinde saklanır tmp/kafka-logs/. Ayrıca bir formatta saklanırlar topic-partionNumber, bu nedenle bir konuyu silmek isterseniz newTopicşunları yapabilirsiniz:

  • dur kafka
  • dosyaları sil rm -rf /tmp/kafka-logs/newTopic-*

1
  1. ZooKeeper ve Kafka'yı durdurun
  2. Server.properties dosyasında, log.retention.hours değerini değiştirin. Yorum yapabilir log.retention.hoursve ekleyebilirsinizlog.retention.ms=1000 . Kafka Konusunun kaydını sadece bir saniye tutacaktı.
  3. Zookeeper ve kafka'yı başlatın.
  4. Tüketici konsolunu kontrol edin. Konsolu ilk açtığımda kayıt oradaydı. Ancak konsolu tekrar açtığımda kayıt kaldırıldı.
  5. Daha sonra değerini log.retention.hoursistediğiniz rakama ayarlayabilirsiniz .

1

Kafka 2.3.0 sürümünden itibaren Kafka'nın yumuşak bir şekilde silinmesine alternatif bir yol vardır (eski yaklaşım kullanımdan kaldırılmıştır).

Tutma.ms'yi 1 saniyeye (1000 ms) güncelleyin ve bir dakika sonra tekrar varsayılan ayara, yani 7 güne (168 saat, 604.800.000 ms olarak) ayarlayın

Yumuşak silme: - (rentention.ms = 1000) (kafka-configs.sh kullanarak)

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'.

Varsayılan olarak ayarlama: - 7 gün (168 saat, tutma.ms = 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

Bu komut dosyasını kullanıyorum:

#!/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

Entegrasyon testi çalıştırmamdan sonra temizlemek için aşağıdaki yardımcı programı kullanıyorum.

En son AdminZkClientapi'yi kullanır . Daha eski API kullanımdan kaldırıldı.

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)

  }


}

Konuyu silme seçeneği vardır. Ancak, silinecek konuyu işaretler. Zookeeper daha sonra konuyu siler. Bu tahmin edilemeyecek kadar uzun olabileceğinden retention.ms yaklaşımını tercih ediyorum

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.