|
1: Фон
До использования kafka в среде Linux, проблем с самой kafka не было. Однако проект, над которым мы сейчас работаем, должен быть совместим с Window и Linux, и когда мы используем Kafka в среде Window, мы обнаружили, что сам kafka не так совместим с Window, как с Linux.
2: Проблемы
При тестировании Kafka в среде Window я обнаружил, что после некоторого времени работы в сети Kafka выдает ошибку:
Другая программа использует этот файл, и процесс не может получить к нему доступ. Следующие решения не полностью решают проблему и не рекомендуются к применению
Windows Kafka ERROR Failed to clean up log for __consumer_offsets h ttps:// www.itsvse.com/thread-9980-1-1.html
[2021-07-06 09:06:10,800] ERROR Failed to clean up log for __consumer_offsets-42 in dir C:\tmp\kafka-logs due to IOException (kafka.server. LogDirFailureChannel) java.nio.file.FileSystemException: C:\tmp\kafka-logs\__consumer_offsets-42\000000000000000000000000.timeindex.cleaned -> C:\tmp\kafka-logs\__consumer_offsets-42\000000000000000000000000.timeindex.swap: Этот файл используется другим приложением и недоступен для данного процесса.
at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) at sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:387) at sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) at java.nio.file.Files.move(Files.java:1395) at org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:904) at kafka.log.AbstractIndex.renameTo(AbstractIndex.scala:210) at kafka.log.LazyIndex$IndexValue.renameTo(LazyIndex.scala:155) at kafka.log.LazyIndex.$anonfun$renameTo$1(LazyIndex.scala:79) at kafka.log.LazyIndex.renameTo(LazyIndex.scala:79) at kafka.log.LogSegment.changeFileSuffixes(LogSegment.scala:496) at kafka.log.Log.$anonfun$replaceSegments$4(Log.scala:2402) at kafka.log.Log.$anonfun$replaceSegments$4$adapted(Log.scala:2402) at scala.collection.immutable.List.foreach(List.scala:333) at kafka.log.Log.replaceSegments(Log.scala:2402) at kafka.log.Cleaner.cleanSegments(LogCleaner.scala:613) at kafka.log.Cleaner.$anonfun$doClean$6(LogCleaner.scala:538) at kafka.log.Cleaner.$anonfun$doClean$6$adapted(LogCleaner.scala:537) at scala.collection.immutable.List.foreach(List.scala:333) at kafka.log.Cleaner.doClean(LogCleaner.scala:537) at kafka.log.Cleaner.clean(LogCleaner.scala:511) at kafka.log.LogCleaner$CleanerThread.cleanLog(LogCleaner.scala:380) at kafka.log.LogCleaner$CleanerThread.cleanFilthiestLog(LogCleaner.scala:352) at kafka.log.LogCleaner$CleanerThread.tryCleanFilthiestLog(LogCleaner.scala:332) at kafka.log.LogCleaner$CleanerThread.doWork(LogCleaner.scala:321) at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:96) Подавлено: java.nio.file.FileSystemException: C:\tmp\kafka-logs\__consumer_offsets-42\ 00000000000000000000.timeindex.clean -> C:\tmp\kafka-logs\__consumer_offsets-42\000000000000000000000000000000.timeindex.swap: Другой процесс использует этот файл используется другой программой, и процесс не может получить к нему доступ.
at sun.nio.fs.WindowsException.translateToIOException(WindowsException. java:86) at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException. java:97) at sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:301) at sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider. java:287) at java.nio.file.Files.move(Files.java:1395) at org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils. java:901) ... 20 подробнее 3: Причина.
Политика очистки журналов kafka срабатывает из-за того, что в среде windows переименование файла при открытии очищаемого журнала запрещено (в среде linux разрешено), что приводит к простоям kafka.
Наиболее распространенное решение в Интернете - "очистить файл журнала kafka и затем перезапустить kafka", что, очевидно, нереально в производственной среде. Поэтому вначале я придумал два следующих решения для данной ситуации:
Вариант 1: Изменить стратегию очистки журнала, изменить время очистки журнала до бесконечности (-1), чтобы журналы данных kafka хранились постоянно. Недостатки: (1) дисковое пространство будет продолжать увеличиваться Вариант 2: построить виртуальную машину на windows (docker то же самое, а мороки больше), а затем развернуть в виртуальной машине kafka Недостатки: (1) персоналу по эксплуатации и обслуживанию необходимо немного знать операционную систему linux (2) увеличится потребление памяти
Очевидно, что недостатки обоих вариантов были слишком велики для меня, поэтому я обратился за помощью к сообществу kafka.
Нажмите здесь, чтобы поклониться богам исследования: https: //github.com/apache/kafka/pull/6329.
Насколько я могу судить, оказалось, что эта проблема с kafka под windows не так проста, как можно было бы подумать, и официального решения пока не существует. Другими словами (ребята, вы просто не используете kafka под window!).
Вариант 3: Однако, несмотря на это, спрос на использование kafka под windows все еще существует, поэтому многие боги все еще обеспокоены и предлагают некоторые решения. Есть один бог для этой проблемы исходного кода kafka для вторичной разработки. После тестирования, его решение под окном действительно решает проблему, делая kafka можно использовать под окном. Но для этого решения, kafka контрибьютор сказал, что это может быть не слишком безопасно (то есть, не может интегрировать патч в официальный).
4: решение (хвост предоставил ссылку на скачивание скомпилированного пакета kafka) Хотя официальный представитель kafka сказал, что патч не очень безопасен, но официальный представитель пока так ничего и не сделал. Потребность реальная, поэтому после некоторых раздумий я выбираю вариант 3 и решаю проблему раз и навсегда, так что дальше мы будем ставить патч и перекомпилировать kafka.
4.1: Скачайте версию патча для kafka
Загрузите версию патча для kafka с сайта этого автора
h ttps:// github.com/apache/kafka/tree/0baf9c158b5681a55df4de3a0e6193d32b1433ff
4.2: Компиляция версии патча kafka Поскольку компиляция kafka осуществляется через gradle, вам необходимо сначала настроить gradle.
О том, как настроить gradle, вы можете прочитать в этой статье (воспроизведено, нарушение авторских прав удалено) в разделе Установка и настройка gradle для Windows: https: //blog.csdn.net/zhaokai0130/article/details/81008719.
О том, как скомпилировать kafka, вы можете прочитать на github ------, как использовать gradle для компиляции kafka: https: //github.com/apache/kafka/tree/0baf9c158b5681a55df4de3a0e6193d32b1433ff.
После компиляции вы получите пакет kafka, который можно использовать под Windows.
В духе концепции "копировать-вставить" (в конце концов, компиляция исходного кода все еще отнимает много времени), вот ссылка на скачивание скомпилированного пакета kafka, скачивайте и используйте напрямую.
kafka_2.12-2.3.0_window downtime version download address:
h ttps:// down.itsvse.com/item/nzraqz.html
Ссылка на оригинал: https: //blog.csdn.net/chengtanyong4777/article/details/102542326
|
Предыдущая:Комментарии к таблице базы данных запросов MySQLNext: [Доклад]Sql Server Резюме по разделенным таблицам
|