Hadoop: куча места и проблемы с gc - PullRequest
4 голосов
/ 14 марта 2012

В настоящее время я работаю над проектом, в котором мне нужно иметь структуру памяти для задачи карты.Я сделал некоторые расчеты, и я могу сказать, что мне не нужно более 600 МБ памяти для каждой задачи карты.Но дело в том, что через некоторое время у меня возникают проблемы с пространством кучи Java или ограничением накладных расходов gc.Я не знаю, как это возможно.

Вот еще несколько деталей.У меня две четырехъядерные системы с 12 ГБ оперативной памяти.Таким образом, это означает, что у меня может быть одновременно запущено до 8 картографических задач.Я строю дерево, поэтому у меня есть итеративный алгоритм, который выполняет работу по уменьшению карты для каждого уровня дерева.Мой алгоритм отлично работает для небольших наборов данных, но для среднего набора данных есть проблемы с пространством кучи.Мой алгоритм достигает определенного уровня дерева и затем выходит из кучи или имеет проблемы с gc.В этот момент я произвел некоторые расчеты и увидел, что для каждой задачи не требуется более 100 МБ памяти.Так что для 8 задач я использую около 800 МБ памяти.Я не знаю, что происходит.Я даже обновил свой файл hadoop-env.sh следующими строками:

   export HADOOP_HEAPSIZE=8000
   export HADOOP_OPTS=-XX:+UseParallelGC

В чем проблема?Эти строки даже переопределяют параметры Java для моей системы?Использование параллель - это то, что я видел в Интернете, и это было рекомендовано при наличии нескольких ядер.

     edits

Хорошо, вот некоторые правки после мониторинга пространства кучи и общего объема памяти.Я использую около 3500 МБ ОЗУ при выполнении 6 задач одновременно.Это означает, что JobTracker, TaskTracker, namenode, datanode, вторичный namenode моей операционной системы и 6 задач используют 3500 RAM, что является очень логичным размером.Итак, почему я получаю ограничение на накладные расходы gc?Я следую одному и тому же алгоритму для каждого уровня дерева.Единственное, что меняется, - это количество узлов на каждом уровне дерева.Наличие множества узлов на уровне дерева не добавляет таких издержек для моего алгоритма.Так почему же gc не работает хорошо?

1 Ответ

5 голосов
/ 14 марта 2012

Если ваш максимальный объем памяти не изменился, он будет составлять 1/4 от основной памяти, т.е. около 3 ГБ, плюс некоторые накладные расходы для использования без кучи могут составлять 3,5 ГБ.

Я предлагаю вам попробовать

export HADOOP_OPTS="-XX:+UseParallelGC -Xmx8g"

для установки максимальной памяти на 8 ГБ.


По умолчанию максимальный размер кучи составляет 1/4 памяти (если вы не используете 32-битную JVM наWindows).Таким образом, если игнорируется максимальный размер кучи, он все равно будет составлять 3 ГБ.

Независимо от того, используете ли вы один ГХ или другой, это не будет иметь большого значения, если у вас закончится память.

Я предлагаю вам взять дамп кучи с помощью -XX:+HeapDumpOnOutOfMemoryError и прочитать это в профилировщике, например, VisualVM, чтобы понять, почему он использует так много памяти.

...