У меня есть крошечный кластер 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.
Может быть, В самом деле не хватает памяти, и неспособность создать собственные потоки является симптомом?
У меня его нет под рукой, но да, я использовал несколько команд, чтобы перечислить потоки, и с некоторым подсчетом строк я увидел, что он достигает ~ 700 потоков, все еще меньше ограничения в 1 КБ, которое было у пользователя. У меня был Ganglia для мониторинга кластера и поиска в истории процессов, я понял, что он достигает предела в 1 КБ при выполнении вставок в определенный момент времени. Ganglia показала, что кластер несколько раз достиг предела в 1 КБ, а затем внезапное падение, когда он остановил из-за исключений.




Оказывается, у пользователя, с которым работал процесс Hadoop, были слишком низкие ограничения для новых процессов, я отредактировал
/etc/security/limits.conf
С участием:
user - nproc 32768
И это сработало. Я не видел определенного ограничения количества потоков, но увеличение ограничения количества процессов помогло.
Я также читал, что увеличение лимита количества открытых файлов необходимо и для кластеров:
user - nofile 32768
Я настроил его таким образом, чтобы избежать проблем в будущем.
Примечание:
ps auxбудет отображать только процессы, а не потоки. Попробуйтеps -eLf, и вы, возможно, поймете, почему вы достигли предела.