Kafka Connect не хватает места в куче

После запуска Kafka Connect (connect-standalone) моя задача завершается с ошибкой сразу после запуска:

java.lang.OutOfMemoryError: Java heap space
    at java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:57)
    at java.nio.ByteBuffer.allocate(ByteBuffer.java:335)
    at org.apache.kafka.common.network.NetworkReceive.readFromReadableChannel(NetworkReceive.java:93)
    at org.apache.kafka.common.network.NetworkReceive.readFrom(NetworkReceive.java:71)
    at org.apache.kafka.common.network.KafkaChannel.receive(KafkaChannel.java:154)
    at org.apache.kafka.common.network.KafkaChannel.read(KafkaChannel.java:135)
    at org.apache.kafka.common.network.Selector.pollSelectionKeys(Selector.java:343)
    at org.apache.kafka.common.network.Selector.poll(Selector.java:291)
    at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:260)
    at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:232)
    at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:180)
    at org.apache.kafka.clients.consumer.internals.AbstractCoordinator.ensureCoordinatorReady(AbstractCoordinator.java:193)
    at org.apache.kafka.clients.consumer.internals.ConsumerCoordinator.poll(ConsumerCoordinator.java:248)
    at org.apache.kafka.clients.consumer.KafkaConsumer.pollOnce(KafkaConsumer.java:1013)
    at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:979)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.pollConsumer(WorkerSinkTask.java:316)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.poll(WorkerSinkTask.java:222)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.iteration(WorkerSinkTask.java:170)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.execute(WorkerSinkTask.java:142)
    at org.apache.kafka.connect.runtime.WorkerTask.doRun(WorkerTask.java:140)
    at org.apache.kafka.connect.runtime.WorkerTask.run(WorkerTask.java:175)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

В некоторой документации Kafka есть упоминание о пространстве кучи, в котором вам предлагается попробовать его с «по умолчанию» и изменить его только в случае возникновения проблем, но нет инструкций по изменению пространства кучи.


person Robin Daugherty    schedule 31.01.2017    source источник
comment
Размер по умолчанию, по-видимому, определяется во время выполнения. На моей машине (8G) он кажется достаточно большим. Я все еще получаю ошибку OOM. Кроме того, в логе коннектора есть всякие другие исключения, и сервер зависает. Очень расстраивает.   -  person Kenji Noguchi    schedule 02.02.2017
comment
Из того, что я нашел, он жестко запрограммирован на 256M: github.com/apache/kafka/blob/trunk/bin/kafka-run-class.sh#L209   -  person Robin Daugherty    schedule 04.02.2017
comment
ооо! Спасибо. Это объясняет.   -  person Kenji Noguchi    schedule 04.02.2017


Ответы (4)


Когда у вас проблемы с Кафкой

java.lang.OutOfMemoryError: Java heap space

это не обязательно означает, что это проблема с памятью. Некоторые инструменты администрирования Kafka, такие как kafka-topics.sh, будут маскировать истинную ошибку при попытке подключения к SSL-ПОРТУ. Истинная (замаскированная) ошибка SSL handshake failed !

См. эту проблему: https://issues.apache.org/jira/browse/KAFKA-4090

Решение состоит в том, чтобы включить файл свойств в вашу команду (для kafka-topics.sh это будет --command-config) и обязательно включить эту строку:

security.protocol=SSL
person peedee    schedule 22.04.2020
comment
в моем случае это похоже на фиктивное сообщение об ошибке, скрывающее реальную проблему - person Randy L; 12.08.2020
comment
Ух ты. Это помогло! У меня было настроено только producer: ssl: key-store-location: and password: в application.yaml. И у меня не хватало памяти в тестовой среде. Я думаю, что где-то в журнале ошибок также было Тема отсутствует в метаданных после 60000 мс. Добавление spring.kafka.producer.security.protocol: SSL помогло. Спасибо. - person Pawel Ryznar; 29.12.2020

Вы можете контролировать максимальный и начальный размер кучи, установив переменную среды KAFKA_HEAP_OPTS.

В следующем примере задается начальный размер 512 МБ и максимальный размер 1 ГБ:

KAFKA_HEAP_OPTS="-Xms512m -Xmx1g" connect-standalone connect-worker.properties connect-s3-sink.properties

При запуске команды Kafka, такой как connect-standalone, вызывается сценарий kafka-run-class, который устанавливает размер кучи по умолчанию 256 МБ в переменной среды KAFKA_HEAP_OPTS, если она еще не установлена.

person Robin Daugherty    schedule 31.01.2017
comment
Начиная с Kafka 1.1.0, новым значением по умолчанию для Connect является -Xmx2g, и оно устанавливается перед kafka-run-classgithub.com/apache/kafka/commit/ - person OneCricketeer; 16.01.2019
comment
Любой другой способ добиться того же? - person c0degeas; 14.03.2019
comment
Метод в моем ответе тот же, изменилось только значение по умолчанию. - person Robin Daugherty; 18.03.2019

Даже я столкнулся с проблемой, не мог запустить мой производитель и потребитель для данной темы. Также удалил все ненужные файлы журналов и темы. Хотя это не связано с проблемой.

Изменение kafka-run-class.sh у меня не сработало. Я изменил файлы ниже

кафка-консоль-consumer.sh

кафка-консоль-производитель.ш

и перестал получать ошибку OOM. После этого и потребитель, и производитель работали нормально.

Увеличил размер до KAFKA_HEAP_OPTS="-Xmx1G" раньше было 512м.

person Sagarmatha    schedule 07.06.2018
comment
Извините, что мой ответ не был более ясным. KAFKA_HEAP_OPTS — это переменная среды, которую следует задавать в командной строке или в службе, которая запускает задание Kafka. Не следует изменять сценарии, входящие в состав дистрибутива Kafka, так как они будут удалены при обновлении Kafka. - person Robin Daugherty; 09.06.2018

Я нашел другую причину этой проблемы этим утром. Я видел то же самое исключение, за исключением того, что я не использую SSL, и мои сообщения очень маленькие. В моем случае проблема заключалась в неправильно настроенном URL-адресе bootstrap-servers. Если вы настроите этот URL-адрес как сервер и порт, которые открыты, но неверны, вы можете вызвать такое же исключение. Разработчики Kafka знают об общей проблеме и отслеживают ее здесь: https://cwiki.apache.org/confluence/display/KAFKA/KIP-498%3A+Add+client-side+configuration+.для+максимального+ответа+размера+для+защиты+против+OOM

person Alex N.    schedule 26.07.2021