Apache Phoenix java.lang.OutOfMemoryError: невозможно создать новый собственный поток

У меня есть крошечный кластер Hadoop с 5 узлами данных и 1 узлом имени, все машины с 4 ядрами/4 потоками и 4 ГБ ОЗУ каждая, кроме одного узла данных с 8 ГБ ОЗУ.

Все они работают под управлением RHEL 6 x86_64. Версия HBase — 1.2, а версия Phoenix — 4.14.

Я подключаюсь к Apache Phoenix через сервер запросов Phoenix и «тонкий» клиент JDBC. Phoenix Query Server работает на узле имени.

Я пытаюсь обновить ~ 2000 кортежей, ~ 25 столбцов каждые 10 минут, в таблицу уже вставлено более 2 миллионов кортежей, но иногда я получаю исключения в виде:

Caused by: java.lang.OutOfMemoryError: unable to create new native thread [...] Caused by: AvaticaClientRuntimeException: Remote driver error: RuntimeException: org.apache.phoenix.execute.CommitException: java.lang.RuntimeException: java.lang.OutOfMemoryError: unable to create new native thread -> CommitException: java.lang.RuntimeException: java.lang.OutOfMemoryError: unable to create new native thread -> RuntimeException: java.lang.OutOfMemoryError: unable to create new native thread -> OutOfMemoryError: unable to create new native thread. Error -1 (00000) null

Phoenix Query Server работает на узле имени, я не уверен, что не так.

Это не фактическое исключение OutOfMemoryException, но как если бы оно создавало много потоков и заканчивало их?

Я пытался сделать ps aux, и я не вижу, чтобы процесс Phoenix Query Server создавал более ~ 50 потоков, что, на самом деле, намного меньше, чем ограничение количества потоков в обычной установке Linux.

Может быть, В самом деле не хватает памяти, и неспособность создать собственные потоки является симптомом?

Примечание: ps aux будет отображать только процессы, а не потоки. Попробуйте ps -eLf, и вы, возможно, поймете, почему вы достигли предела.

Mark Peters 14.03.2019 03:45

У меня его нет под рукой, но да, я использовал несколько команд, чтобы перечислить потоки, и с некоторым подсчетом строк я увидел, что он достигает ~ 700 потоков, все еще меньше ограничения в 1 КБ, которое было у пользователя. У меня был Ganglia для мониторинга кластера и поиска в истории процессов, я понял, что он достигает предела в 1 КБ при выполнении вставок в определенный момент времени. Ganglia показала, что кластер несколько раз достиг предела в 1 КБ, а затем внезапное падение, когда он остановил из-за исключений.

TheStack 14.03.2019 03:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
688
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оказывается, у пользователя, с которым работал процесс Hadoop, были слишком низкие ограничения для новых процессов, я отредактировал

/etc/security/limits.conf

С участием:

user - nproc 32768

И это сработало. Я не видел определенного ограничения количества потоков, но увеличение ограничения количества процессов помогло.

Я также читал, что увеличение лимита количества открытых файлов необходимо и для кластеров:

 user - nofile 32768

Я настроил его таким образом, чтобы избежать проблем в будущем.

Другие вопросы по теме