it-swarm.dev

هل هناك طريقة لحذف جميع البيانات من موضوع أو حذف الموضوع قبل كل شوط؟

هل هناك طريقة لحذف جميع البيانات من موضوع أو حذف الموضوع قبل كل شوط؟

هل يمكنني تعديل ملف KafkaConfig.scala لتغيير خاصية logRetentionHours؟ هل هناك طريقة لحذف الرسائل بمجرد أن يقرأها المستهلك؟

أنا أستخدم المنتجين لجلب البيانات من مكان ما وإرسال البيانات إلى موضوع معين حيث يستهلك المستهلك ، هل يمكنني حذف جميع البيانات من هذا الموضوع في كل عملية تشغيل؟ أريد فقط بيانات جديدة في كل مرة في الموضوع. هل هناك طريقة لإعادة تهيئة الموضوع بطريقة أو بأخرى؟

68
TommyT

لا أعتقد أنه مدعوم حتى الآن. ألقِ نظرة على هذا مشكلة JIRA "إضافة حذف موضوع الدعم".

للحذف يدويًا:

  1. اغلاق الكتلة
  2. تنظيف سجل kafka dir (المحدد بواسطة السمة log.dir في kafka config file) بالإضافة إلى بيانات zookeeper
  3. أعد تشغيل الكتلة

لأي موضوع معين ما يمكنك القيام به هو

  1. وقف كافكا
  2. سجل kafka نظيف خاص بالتقسيم ، يخزن kafka ملف السجل الخاص به بتنسيق "logDir/topic-partition" حتى يتم تخزين السجل الخاص بمعرف القسم 0 لموضوع يسمى "MyTopic" في /tmp/kafka-logs/MyTopic-0 حيث يتم تحديد /tmp/kafka-logs بواسطة السمة log.dir
  3. أعد تشغيل كافكا

هذا هو NOT طريقة جيدة وموصى بها ولكن يجب أن تعمل. في ملف تكوين وسيط Kafka ، يتم استخدام السمة log.retention.hours.per.topic لتحديد The number of hours to keep a log file before deleting it for some specific topic

أيضًا ، هل هناك طريقة لحذف الرسائل بمجرد أن يقرأها المستهلك؟

من وثائق كافكا :

تحتفظ مجموعة كافكا بجميع الرسائل المنشورة - سواء تم استهلاكها أم لا - لفترة قابلة للتكوين. على سبيل المثال ، إذا تم تعيين الاحتفاظ بالسجل إلى يومين ، فعند اليومين التاليين لنشر الرسالة ، يكون متاحًا للاستهلاك ، وبعد ذلك سيتم تجاهله لإخلاء مساحة. أداء كافكا ثابت بشكل فعال فيما يتعلق بحجم البيانات ، وبالتالي فإن الاحتفاظ بالكثير من البيانات لا يمثل مشكلة.

في الواقع ، فإن البيانات الوصفية الوحيدة التي يتم الاحتفاظ بها على أساس كل مستهلك هي موضع المستهلك في السجل ، ويسمى "الإزاحة". يتحكم المستهلك في هذا الإزاحة: عادةً ما يقوم المستهلك بتقديم إزاحة خطية أثناء قراءة الرسائل ، لكن في الواقع يتم التحكم في الموضع من قبل المستهلك ويمكنه أن يستهلك الرسائل بأي ترتيب يشاء. على سبيل المثال ، يمكن للمستهلك إعادة التعيين إلى تعويض قديم لإعادة المعالجة.

للعثور على إزاحة البدء للقراءة في Kafka 0.8 مثال المستهلك البسيط يقولون

يحتوي Kafka على ثوابتين للمساعدة ، 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];
}
50
Hild

كما ذكرت هنا Purge Kafka Queue :

تم اختباره في Kafka 0.8.2 ، كمثال سريع البدء: أولاً ، أضف سطرًا واحدًا إلى ملف server.properties ضمن مجلد التكوين:

delete.topic.enable=true

بعد ذلك ، يمكنك تشغيل هذا الأمر:

bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic test
47
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.

ملاحظة: إذا كنت تقوم بحذف مجلد/مجلدات الموضوع داخل سجلات kafka ولكن ليس من مجلد zookeeper-data ، فسترى المواضيع لا تزال موجودة.

13
Swadeshi

فيما يلي برامج نصية لإفراغ وحذف موضوع كافكا بافتراض المضيف المحلي كخادم حراسة الحيوان وضبط كافكا هوم على دليل التثبيت:

سوف البرنامج النصي أدناه فارغة موضوع عن طريق تحديد وقت الاحتفاظ به إلى 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

إلى حذف - المواضيع بالكامل ، يجب إيقاف أي وسيط (kkka) ساري المفعول وإزالة الدليل (الدلائل) الخاص به من سجل kafka dir (افتراضي:/tmp/kafka-logs) ثم تشغيل هذا البرنامج النصي لإزالة الموضوع من حارس حديقة الحيوان. للتحقق من أنه قد تم حذفه من zookeeper ، يجب ألا يتضمن إخراج ls/brokers/المواضيع الموضوع:

#!/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) هو الأمر الطبقي

sh kafka-run-class.sh kafka.admin.DeleteTopicCommand --topic yourtopic - حارس الحديقة المضيف: 2181

5
Dan M

كحل مؤقت ، يمكنك ضبط إعدادات الاحتفاظ بوقت التشغيل لكل موضوع ، على سبيل المثال bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic my_topic --config retention.bytes=1 ( retention.bytes = 0 قد تعمل أيضًا)

بعد فترة قصيرة يجب تحرير الكافكا الفضاء. لست متأكدا مما إذا كان هذا له أي آثار مقارنة بإعادة إنشاء الموضوع.

فرع فلسطين. أفضل إعادة إعدادات الاحتفاظ ، مرة واحدة kafka القيام به مع التنظيف.

يمكنك أيضًا استخدام retention.ms لاستمرار البيانات التاريخية

5
Ivan Balashov

لمستخدمي الشراب

إذا كنت تستخدم brew مثلي وأهدرت الكثير من الوقت في البحث عن مجلد kafka-logs السيئ السمعة ، فلا تخف أكثر. (وأرجو أن تخبرني إذا كان ذلك مناسبًا لك ولإصدارات مختلفة من Homebrew و Kafka وغيرها :))

ربما ستجده تحت:

موقعك:

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


كيف تجد في الواقع هذا المسار

(هذا مفيد أيضًا لكل تطبيق تقوم بتثبيته من خلال هذا الشراب)

1) brew services list

kafka بدأ matbhz/مستخدمين/مكتبة/مكتبة/لاونتشجنتس/هومبري.mxcl.kafka.plist

2) افتح وقراءة ذلك plist وجدت أعلاه

3) ابحث عن السطر الذي يحدد موقع server.properties فتحه ، في حالتي:

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

4) ابحث عن سطر log.dirs:

log.dirs =/البيرة/المحلية/فار/ليب/كافكا-السجلات

5) انتقل إلى هذا الموقع وحذف سجلات الموضوعات التي ترغب فيها

6) أعد تشغيل كافكا مع 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. سيحتفظ بسجل "كافكا توبيك" لمدة ثانية واحدة فقط.
  3. بدء حارس الحديقة و kafka.
  4. تحقق على وحدة المستهلك. عندما فتحت وحدة التحكم لأول مرة ، كان هناك سجل. ولكن عندما فتحت وحدة التحكم مرة أخرى ، تمت إزالة السجل.
  5. في وقت لاحق ، يمكنك ضبط قيمة log.retention.hours على الشكل الذي تريده.
1
earl

عند حذف موضوع يدويًا من مجموعة kafka ، يمكنك فقط التحقق من ذلك https://github.com/darrenfu/bigdata/issues/6 هناك خطوة حيوية ضاعت كثيراً في معظم الحلول وهي حذف /config/topics/<topic_name> في ZK.

0
Abdurrahman Adebiyi