トピックからすべてのデータを削除したり、実行するたびにトピックを削除したりする方法はありますか?


87

トピックからすべてのデータを削除したり、実行するたびにトピックを削除したりする方法はありますか?

KafkaConfig.scalaファイルを変更してlogRetentionHoursプロパティを変更できますか?消費者がメッセージを読むとすぐにメッセージが削除される方法はありますか?

プロデューサーを使用してどこかからデータをフェッチし、コンシューマーが消費する特定のトピックにデータを送信していますが、実行するたびにそのトピックからすべてのデータを削除できますか?トピックでは毎回新しいデータのみが必要です。どういうわけかトピックを再初期化する方法はありますか?


回答:


62

まだサポートされているとは思わないでください。このJIRAの問題「トピックの削除サポートの追加」をご覧ください。

手動で削除するには:

  1. クラスターをシャットダウンします
  2. (で指定されたクリーンカフカログディレクトリlog.dirカフカにおける属性設定ファイル)にも飼育係のデータ
  3. クラスターを再起動します

特定のトピックについて、あなたができることは

  1. カフカを止めろ
  2. パーティションに固有のクリーンなkafkaログ。kafkaはログファイルを「logDir / topic-partition」の形式で保存するため、「MyTopic」という名前のトピックの場合、パーティションID0のログは属性で指定された/tmp/kafka-logs/MyTopic-0場所に保存されます。/tmp/kafka-logslog.dir
  3. kafkaを再起動します

これはNOT適切で推奨されるアプローチですが、機能するはずです。Kafkaブローカー構成ファイルでは、log.retention.hours.per.topic属性を使用して定義しますThe number of hours to keep a log file before deleting it for some specific topic

また、消費者がメッセージを読むとすぐにメッセージが削除される方法はありますか?

Kafkaドキュメントから:

Kafkaクラスターは、公開されたすべてのメッセージを、消費されたかどうかに関係なく、構成可能な期間保持します。たとえば、ログの保持が2日に設定されている場合、メッセージが公開されてから2日間は使用可能になり、その後は破棄されてスペースが解放されます。Kafkaのパフォーマンスはデータサイズに関して実質的に一定であるため、大量のデータを保持することは問題ではありません。

実際、消費者ごとに保持される唯一のメタデータは、「オフセット」と呼ばれる、ログ内の消費者の位置です。このオフセットはコンシューマーによって制御されます。通常、コンシューマーはメッセージを読み取るときにオフセットを直線的に進めますが、実際には位置はコンシューマーによって制御され、メッセージを好きな順序で消費できます。たとえば、コンシューマーは古いオフセットにリセットして再処理できます。

Kafka 0.8 Simple Consumerの例で読む開始オフセットを見つけるために、彼らは言います

Kafkaには、役立つ2つの定数が含ま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の問題への正しいリンクがあると信じてissues.apache.org/jira/browse/KAFKA-330
asmaier

4
トピックはzookeeperにリストされているため、引き続きここに表示されます。brokers/topics/<topic_to_delete>それを取り除くには、ログだけでなく、下のすべてを再帰的に削除する必要があります。
SubmittedDenied

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 2017年

70

ここで述べたように、Kafkaキューをパージします。

クイックスタートの例として、Kafka 0.8.2でテストしました。まず、configフォルダーの下のserver.propertiesファイルに1行追加します。

delete.topic.enable=true

次に、次のコマンドを実行できます。

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

2
ところで、誰かが疑問に思っている場合に備えて、オプションを追加した後にKafkaサーバーを再起動する必要はありません。
problemofficer

14

kafka0.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-logs内のトピックフォルダーを削除するが、zookeeper-dataフォルダーからは削除しない場合は、トピックがまだそこにあることがわかります。


8

汚い回避策として、トピックごとのランタイム保持設定を調整できます。たとえば、bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic my_topic --config retention.bytes=1retention.bytes = 0も機能する可能性があります)

しばらくすると、kafkaはスペースを解放するはずです。トピックの再作成と比較して、これが何らかの影響を与えるかどうかはわかりません。

ps。kafkaのクリーニングが完了したら、保持設定を元に戻すことをお勧めします。

retention.ms履歴データを永続化するために使用することもできます


8

以下は、ローカルホストをzookeeperサーバーとして、Kafka_Homeがインストールディレクトリに設定されていると仮定して、Kafkaトピックを空にして削除するためのスクリプトです。

以下のスクリプトは、保持時間を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

トピックを完全に削除するには、該当するkafkaブローカーを停止し、そのディレクトリをkafkaログディレクトリ(デフォルト:/ tmp / kafka-logs)から削除してから、このスクリプトを実行してzookeeperからトピックを削除する必要があります。zookeeperから削除されたことを確認するには、ls / browsers / topicsの出力にトピックが含まれていないことを確認します。

#!/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
最初のコマンドに小さな間違いがあるので、答えを編集したかったのです。ただし、1文字の編集は許可されていません。実際にはそう--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でこれを試しました。コマンドは「削除に成功しました!」を返します。ただし、ログフォルダ内のパーティションは削除されません。
dilm 2015年

8
0.8.2.1(homebrew)で試してみましたが、このエラーが発生します。Error: Could not find or load main class kafka.admin.DeleteTopicCommand
タニッシュ2015

2
新しいkafka(0.8.2)の時点では、sh kafka-run-class.sh kafka.admin.TopicCommand --delete --topic [topic_for_delete] --zookeeper localhost:2181です。delete.topic.enableがtrueであることを確認してください。
–HoàngLong 2017

3

醸造ユーザー向け

brew私のように使用していて、悪名高いkafka-logsフォルダの検索に多くの時間を浪費している場合は、もう恐れることはありません。(そしてそれがあなたとHomebrew、Kafkaなどの複数の異なるバージョンで機能するかどうか私に知らせてください:))

あなたはおそらくそれを以下で見つけるでしょう:

ロケーション:

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


そのパスを実際に見つける方法

(これは、基本的にbrewを介してインストールするすべてのアプリにも役立ちます)

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 / local / var / lib / kafka-logs

5)その場所に移動し、必要なトピックのログを削除します

6)でKafkaを再起動します brew services restart kafka


2

トピックとそのパーティションに関するすべてのデータはに保存されtmp/kafka-logs/ます。さらに、それらは形式topic-partionNumberで保存されるため、トピックを削除するnewTopic場合は、次のことができます。

  • カフカを止めろ
  • ファイルを削除します rm -rf /tmp/kafka-logs/newTopic-*

1
  1. ZooKeeperとKafkaを停止します
  2. server.propertiesで、log.retention.hours値を変更します。コメントlog.retention.hoursして追加できlog.retention.ms=1000ます。それはたった1秒間カフカトピックの記録を保持するでしょう。
  3. zookeeperとkafkaを起動します。
  4. コンシューマーコンソールを確認します。初めてコンソールを開いたとき、記録がありました。しかし、コンソールをもう一度開くと、レコードが削除されました。
  5. 後で、の値をlog.retention.hours希望の数値に設定できます。

1

kafka 2.3.0バージョンでは、Kafkaをソフト削除する別の方法があります(古いアプローチは非推奨です)。

tention.msを1秒(1000ms)に更新し、1分後にデフォルト設定、つまり7日(168時間、ミリ秒で604,800,000)に再設定します。

ソフト削除 :-( rentention.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時間、retention.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

私はこのスクリプトを使用します:

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

以下のユーティリティを使用して、統合テストの実行後にクリーンアップします。

最新のAdminZkClientAPIを使用しています。古いAPIは非推奨になりました。

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)

  }


}

トピックを削除するオプションがあります。ただし、トピックを削除対象としてマークします。Zookeeperは後でトピックを削除します。これは予測できないほど長くなる可能性があるため、retention.msアプローチをお勧めします

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.