web-dev-qa-db-ja.com

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

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

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

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

73
TommyT

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

手動で削除するには:

  1. クラスターをシャットダウンします
  2. kafkaログディレクトリ(kafka config fileのlog.dir属性で指定)とzookeeperデータを消去します。
  3. クラスターを再起動します

任意のトピックについて、できることは

  1. カフカを止める
  2. パーティション固有のkafkaログを消去し、kafkaログファイルを「logDir/topic-partition」の形式で保存するため、「MyTopic」という名前のトピックのパーティションID 0のログ/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 Documentation から:

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

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

Kafka 0.8で読み取る開始オフセットを見つけるために 単純な消費者の例 彼らは言う

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];
}
52
Hild

ここで述べたように Purge Kafka Queue

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

delete.topic.enable=true

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

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

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

注:zookeeper-dataフォルダーからではなく、kafka-logs内のトピックフォルダーを削除する場合、トピックはまだそこにあることがわかります。

12
Swadeshi

以下は、localhostを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/brokers/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
6
vdlen

私たちは、他の答えが説明していることをほとんど中程度の成功で試みました。実際に機能したのは(Apache Kafka 0.8.1)classコマンドです

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

5
Dan M

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

しばらくすると、kafkaがスペースを解放します。トピックの再作成と比較して、これに意味があるかどうかはわかりません。

追伸kafkaをクリーニングしたら、保持設定を元に戻します。

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

5
Ivan Balashov

醸造ユーザー向け

私のような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
Matheus Felipe

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

  • カフカを止める
  • ファイルを削除しますrm -rf /tmp/kafka-logs/newTopic-*
2
Salvador Dali
  1. ZooKeeperとKafkaを停止する
  2. Server.propertiesで、log.retention.hours値を変更します。 log.retention.hoursにコメントして、log.retention.ms=1000を追加できます。 Kafkaトピックのレコードを1秒間だけ保持します。
  3. Zookeeperとkafkaを起動します。
  4. コンシューマーコンソールで確認してください。初めてコンソールを開いたとき、記録がありました。しかし、コンソールを再度開くと、レコードは削除されました。
  5. 後で、log.retention.hoursの値を希望の数値に設定できます。
1
earl

このスクリプトを使用します。

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

kafkaクラスターからトピックを手動で削除する場合、これをチェックアウトするだけです https://github.com/darrenfu/bigdata/issues/6 ZKで/config/topics/<topic_name>を削除することは、ほとんどのソリューションで見逃された重要なステップです。

0