Có cách nào để xóa tất cả dữ liệu khỏi một chủ đề hoặc xóa chủ đề trước mỗi lần chạy không?


87

Có cách nào để xóa tất cả dữ liệu khỏi một chủ đề hoặc xóa chủ đề trước mỗi lần chạy không?

Tôi có thể sửa đổi tệp KafkaConfig.scala để thay đổi thuộc logRetentionHourstính không? Có cách nào để xóa tin nhắn ngay khi người tiêu dùng đọc nó không?

Tôi đang sử dụng nhà sản xuất để tìm nạp dữ liệu từ một nơi nào đó và gửi dữ liệu đến một chủ đề cụ thể mà người tiêu dùng sử dụng, tôi có thể xóa tất cả dữ liệu khỏi chủ đề đó trong mỗi lần chạy không? Tôi chỉ muốn dữ liệu mới mỗi lần trong chủ đề. Có cách nào đó để khởi động lại chủ đề không?


Câu trả lời:


62

Đừng nghĩ rằng nó được hỗ trợ được nêu ra. Hãy xem vấn đề JIRA này "Thêm hỗ trợ xóa chủ đề".

Để xóa thủ công:

  1. Tắt cụm
  2. Làm sạch dir nhật ký kafka (được chỉ định bởi log.dirthuộc tính trong tệp cấu hình kafka ) cũng như dữ liệu của người giữ vườn thú
  3. Khởi động lại cụm

Đối với bất kỳ chủ đề nào bạn có thể làm là

  1. Dừng kafka
  2. Làm sạch nhật ký kafka cụ thể cho phân vùng, kafka lưu trữ tệp nhật ký của nó ở định dạng "logDir / topic-partition" vì vậy đối với chủ đề có tên "MyTopic", nhật ký cho phân vùng id 0 sẽ được lưu trữ ở /tmp/kafka-logs/MyTopic-0nơi /tmp/kafka-logsđược chỉ định bởi log.dirthuộc tính
  3. Khởi động lại kafka

Đây là NOTmột cách tiếp cận tốt và được khuyến khích nhưng nó sẽ hiệu quả. Trong tệp cấu hình nhà môi giới Kafka, log.retention.hours.per.topicthuộc tính được sử dụng để xác địnhThe number of hours to keep a log file before deleting it for some specific topic

Ngoài ra, có cách nào để xóa các tin nhắn ngay khi người tiêu dùng đọc nó không?

Từ Tài liệu Kafka :

Cụm Kafka giữ lại tất cả các thông báo đã xuất bản — cho dù chúng đã được sử dụng hay chưa — trong một khoảng thời gian có thể định cấu hình. Ví dụ: nếu việc lưu giữ nhật ký được đặt thành hai ngày, thì trong hai ngày sau khi thông báo được xuất bản, nó sẽ có sẵn để sử dụng, sau đó nó sẽ bị loại bỏ để giải phóng dung lượng. Hiệu suất của Kafka không đổi về mặt kích thước dữ liệu nên việc giữ lại nhiều dữ liệu không phải là vấn đề.

Trên thực tế, siêu dữ liệu duy nhất được giữ lại trên cơ sở mỗi người tiêu dùng là vị trí của người tiêu dùng trong nhật ký, được gọi là "phần bù". Sự bù đắp này được kiểm soát bởi người tiêu dùng: thông thường người tiêu dùng sẽ tăng tuyến tính phần bù của nó khi họ đọc tin nhắn, nhưng trên thực tế, vị trí được kiểm soát bởi người tiêu dùng và nó có thể đọc tin nhắn theo bất kỳ thứ tự nào họ thích. Ví dụ: một người tiêu dùng có thể đặt lại về độ lệch cũ hơn để xử lý lại.

Để tìm điểm bù bắt đầu để đọc trong ví dụ Người tiêu dùng đơn giản Kafka 0.8, họ nói

Kafka bao gồm hai hằng số để trợ giúp, kafka.api.OffsetRequest.EarliestTime()tìm phần đầu của dữ liệu trong nhật ký và bắt đầu phát trực tuyến từ đó, kafka.api.OffsetRequest.LatestTime()sẽ chỉ phát trực tuyến các tin nhắn mới.

Bạn cũng có thể tìm thấy mã ví dụ ở đó để quản lý phần bù ở đầu người tiêu dùng của bạn.

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

Tôi tin rằng liên kết chính xác đến vấn đề JIRA là Problem.apache.org/jira/browse/KAFKA-330
asmaier

4
Chủ đề sẽ vẫn hiển thị ở đây vì nó được liệt kê trong Zookeeper. Bạn sẽ phải xóa đệ quy mọi thứ bên dưới brokers/topics/<topic_to_delete>cũng như các bản ghi để loại bỏ nó.
SubmittedDenied

3
Theo liên kết sự cố, bạn có thể xóa chủ đề sau phiên bản 0.8.1. Bạn có thể xem trợ giúp chi tiết bằng cách kafka-run-class.sh kafka.admin.DeleteTopicCommand.
Jay

5
Cập nhật: kể từ kafka 0.8.2, lệnh được thay đổi thành:kafka-run-class.sh kafka.admin.TopicCommand --delete --topic [topic_to_delete] --zookeeper localhost:2181
Jay Taylor

Tôi nghĩ rằng chức năng này cho phép xóa chủ đề hiện đã được thêm vào. Có lẽ bản phát hành ổn định tiếp theo sẽ có nó.
ha9u63ar

70

Như tôi đã đề cập ở đây Purge Kafka Queue :

Đã thử nghiệm trong Kafka 0.8.2, cho ví dụ khởi động nhanh: Đầu tiên, Thêm một dòng vào tệp server.properties trong thư mục cấu hình:

delete.topic.enable=true

sau đó, bạn có thể chạy lệnh này:

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

2
Btw, bạn không cần phải khởi động lại máy chủ Kafka sau khi thêm tùy chọn, trong trường hợp có ai đó thắc mắc.
problemmofficer

14

Đã kiểm tra với 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.

Lưu ý: nếu bạn đang xóa / các thư mục chủ đề bên trong kafka-log mà không phải khỏi thư mục Zookeeper-data, thì bạn sẽ thấy các chủ đề vẫn ở đó.


8

Như một giải pháp đơn giản, bạn có thể điều chỉnh cài đặt lưu giữ thời gian chạy theo chủ đề, ví dụ: bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic my_topic --config retention.bytes=1( keep.bytes = 0 cũng có thể hoạt động)

Sau một thời gian ngắn kafka sẽ giải phóng dung lượng. Không chắc liệu điều này có liên quan gì so với việc tạo lại chủ đề hay không.

ps. Tốt hơn hãy khôi phục cài đặt lưu giữ trở lại, sau khi kafka hoàn tất việc làm sạch.

Bạn cũng có thể sử dụng retention.msđể duy trì dữ liệu lịch sử


8

Dưới đây là các tập lệnh để làm trống và xóa chủ đề Kafka giả sử localhost là máy chủ của người quản lý vườn thú và Kafka_Home được đặt thành thư mục cài đặt:

Tập lệnh bên dưới sẽ làm trống một chủ đề bằng cách đặt thời gian lưu của chủ đề thành 1 giây, sau đó xóa cấu hình:

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

Để xóa hoàn toàn các chủ đề, bạn phải dừng mọi (các) nhà môi giới kafka hiện hành và xóa (các) thư mục của nó khỏi dir nhật ký kafka (mặc định: / tmp / kafka-logs), sau đó chạy tập lệnh này để xóa chủ đề khỏi người giữ vườn thú. Để xác minh rằng nó đã bị xóa khỏi người giữ vườn thú, đầu ra của ls / broker / chủ đề sẽ không còn bao gồm chủ đề:

#!/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
Điều này sẽ chỉ hoạt động nếu kiểm tra lưu giữ xảy ra trong vòng 5 giây sau khi ngủ. Hãy đảm bảo bạn ngủ đến khi kiểm tra đã chắc chắn được thông qua theo quy định ở đây:grep "log.retention.check.interval" $Kafka_Home/config/server.properties
colin

2
Tôi muốn chỉnh sửa câu trả lời vì có một lỗi nhỏ trong lệnh đầu tiên. Nhưng không được phép chỉnh sửa một ký tự. Trên thực tế, nó không --add configphải là nó đúng hơn--add-config
SRC

7

Chúng tôi đã thử khá nhiều những gì các câu trả lời khác đang mô tả với mức độ thành công vừa phải. Điều thực sự hiệu quả với chúng tôi (Apache Kafka 0.8.1) là lệnh lớp

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


2
Đã thử điều này trong 0.8.1. Lệnh trả về "xóa thành công!" tuy nhiên nó không xóa các phân vùng bên trong các thư mục nhật ký.
dilm

8
Đã thử trên 0.8.2.1 (homebrew) và lỗi này. Error: Could not find or load main class kafka.admin.DeleteTopicCommand
Thanish

2
Kể từ kafka mới (0.8.2), nó là sh kafka-run-class.sh kafka.admin.TopicCommand --delete --topic [topic_for_delete] --zookeeper localhost: 2181. Đảm bảo rằng delete.topic.enable là đúng.
Hoàng Long

3

Đối với người dùng bia

Nếu bạn đang sử dụng brewgiống như tôi và lãng phí rất nhiều thời gian để tìm kiếmkafka-logs thư mục , đừng sợ nữa. (và vui lòng cho tôi biết nếu điều đó phù hợp với bạn và nhiều phiên bản khác nhau của Homebrew, Kafka, v.v. :))

Có thể bạn sẽ tìm thấy nó dưới:

Vị trí:

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


Làm thế nào để thực sự tìm thấy con đường đó

(điều này cũng hữu ích về cơ bản cho mọi ứng dụng bạn cài đặt thông qua pha chế)

1) brew services list

kafka đã bắt đầu matbhz /Users/matbhz/Library/LaunchAgents/homebrew.mxcl.kafka.plist

2) Mở và đọc mà plistbạn tìm thấy ở trên

3) Tìm dòng xác định server.propertiesvị trí mở nó, trong trường hợp của tôi:

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

4) Tìm log.dirsdòng:

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

5) Đi đến vị trí đó và xóa nhật ký cho các chủ đề bạn muốn

6) Khởi động lại Kafka với brew services restart kafka


2

Tất cả dữ liệu về các chủ đề và phân vùng của nó được lưu trữ trong tmp/kafka-logs/. Hơn nữa, chúng được lưu trữ ở định dạng topic-partionNumber, vì vậy nếu bạn muốn xóa một chủ đề newTopic, bạn có thể:

  • dừng kafka
  • xóa các tập tin rm -rf /tmp/kafka-logs/newTopic-*

1
  1. Dừng ZooKeeper và Kafka
  2. Trong server.properties, hãy thay đổi giá trị log.retention.hours. Bạn có thể nhận xét log.retention.hoursvà bổ sung log.retention.ms=1000. Nó sẽ giữ kỷ lục trên Chủ đề Kafka chỉ trong một giây.
  3. Bắt đầu người giữ vườn thú và kafka.
  4. Kiểm tra trên bảng điều khiển dành cho người tiêu dùng. Khi tôi mở bảng điều khiển lần đầu tiên, bản ghi đã ở đó. Nhưng khi tôi mở lại bảng điều khiển, bản ghi đã bị xóa.
  5. Sau đó, bạn có thể đặt giá trị của log.retention.hoursthành con số mong muốn.

1

Kể từ phiên bản kafka 2.3.0, có một cách thay thế để xóa mềm Kafka (phương pháp cũ không được dùng nữa).

Cập nhật keep.ms thành 1 giây (1000ms) rồi đặt lại sau một phút, thành cài đặt mặc định tức là 7 ngày (168 giờ, 604.800.000 tính bằng mili giây)

Xóa mềm: - (Rentention.ms = 1000) (sử dụng 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'.

Đặt thành mặc định: - 7 ngày (168 giờ, lưu giữ.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

Tôi sử dụng tập lệnh này:

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

Tôi sử dụng tiện ích bên dưới để dọn dẹp sau khi chạy thử nghiệm tích hợp.

Nó sử dụng AdminZkClientapi mới nhất . Api cũ hơn không được dùng nữa.

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)

  }


}

Có một tùy chọn xóa chủ đề. Nhưng, nó đánh dấu chủ đề để xóa. Zookeeper sau đó xóa chủ đề. Vì điều này có thể kéo dài không thể đoán trước, tôi thích cách tiếp cận giữ chân người dùng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.