Слишком много открытых файлов в 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 миллиарда записей, которые, безусловно, могут увеличиться.
Есть ли способ отредактировать этот файл перед тем, как этот демон будет запущен на каждом подчиненном устройстве?