Слишком много открытых файлов в EMR

Я получаю следующие исключения в моих редукторах:

EMFILE: Too many open files
    at org.apache.hadoop.io.nativeio.NativeIO.open(Native Method)
    at org.apache.hadoop.io.SecureIOUtils.createForWrite(SecureIOUtils.java:161)
    at org.apache.hadoop.mapred.TaskLog.writeToIndexFile(TaskLog.java:296)
    at org.apache.hadoop.mapred.TaskLog.syncLogs(TaskLog.java:369)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:257)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059)
    at org.apache.hadoop.mapred.Child.main(Child.java:249)

На редуктор создается около 10000 файлов. Есть ли способ, которым я могу установить предел каждой коробки.

Я попытался использовать следующую команду в качестве сценария начальной загрузки: ulimit -n 1000000

Но это совсем не помогло.

Я также попробовал следующее в загрузочном действии, чтобы заменить команду ulimit в /usr/lib/hadoop/hadoop-daemon.sh:

#!/bin/bash
set -e -x
sudo sed -i -e "/^ulimit /s|.*|ulimit -n 134217728|" /usr/lib/hadoop/hadoop-daemon.sh

Но даже тогда, когда мы регистрируемся в главном узле, я вижу, что ulimit -n возвращает: 32768. Я также подтвердил, что в /usr/lib/hadoop/hadoop-daemon.sh было сделано желаемое изменение, и оно имело: ulimit -n 134217728.

У нас есть какие-нибудь конфигурации для этого? Или есть обходной путь для этого?

Моя главная цель - разбить записи на файлы в соответствии с идентификаторами каждой записи, и сейчас существует 1,5 миллиарда записей, которые, безусловно, могут увеличиться.

Есть ли способ отредактировать этот файл перед тем, как этот демон будет запущен на каждом подчиненном устройстве?

Ответы на вопрос(4)

Ваш ответ на вопрос