トピックからすべてのデータを削除する方法、または実行する前にトピックを削除する方法はありますか?
logRetentionHours
プロパティを変更するためにKafkaConfig.scalaファイルを変更できますか?消費者がメッセージを読むとすぐにメッセージを削除する方法はありますか?
プロデューサーを使用してどこかからデータをフェッチし、消費者が消費する特定のトピックにデータを送信していますが、実行ごとにそのトピックからすべてのデータを削除できますか?トピックのたびに新しいデータのみが必要です。どういうわけかトピックを再初期化する方法はありますか?
まだサポートされているとは思わないでください。 これをご覧ください JIRA issue "トピック削除サポートの追加"。
手動で削除するには:
log.dir
属性で指定)とzookeeperデータを消去します。任意のトピックについて、できることは
/tmp/kafka-logs/MyTopic-0
に格納されます。/tmp/kafka-logs
はlog.dir
属性で指定されますこれはNOT
の優れた推奨アプローチですが、動作するはずです。 Kafkaブローカー構成ファイルでは、log.retention.hours.per.topic
属性を使用してThe number of hours to keep a log file before deleting it for some specific topic
を定義します
また、消費者がメッセージを読むとすぐにメッセージを削除する方法はありますか?
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];
}
ここで述べたように 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
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内のトピックフォルダーを削除する場合、トピックはまだそこにあることがわかります。
以下は、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
私たちは、他の答えが説明していることをほとんど中程度の成功で試みました。実際に機能したのは(Apache Kafka 0.8.1)classコマンドです
sh kafka-run-class.sh kafka.admin.DeleteTopicCommand --topic yourtopic --zookeeper localhost:2181
汚い回避策として、トピックごとのランタイム保持設定を調整できます。 bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic my_topic --config retention.bytes=1
(retention.bytes =も機能する可能性があります)
しばらくすると、kafkaがスペースを解放します。トピックの再作成と比較して、これに意味があるかどうかはわかりません。
追伸kafkaをクリーニングしたら、保持設定を元に戻します。
retention.ms
を使用して履歴データを永続化することもできます
私のような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
で再起動します
トピックとそのパーティションに関するすべてのデータは、tmp/kafka-logs/
に保存されます。さらに、それらはtopic-partionNumber
という形式で保存されているため、トピックnewTopic
を削除する場合は、次のことができます。
rm -rf /tmp/kafka-logs/newTopic-*
log.retention.hours
にコメントして、log.retention.ms=1000
を追加できます。 Kafkaトピックのレコードを1秒間だけ保持します。log.retention.hours
の値を希望の数値に設定できます。このスクリプトを使用します。
#!/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>
を削除することは、ほとんどのソリューションで見逃された重要なステップです。