Запуск HDD datanode завершается неудачно, когда диски переполнены
Наш кластер HDFS заполнен только на 90%, но некоторые датододы имеют некоторые диски, которые заполнены на 100%. Это означает, что когда мы массово перезагружаем весь кластер, некоторые датододы полностью не запускаются с таким сообщением:
2013-10-26 03: 58: 27,295 ОШИБКА org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Mkdirs не удалось создать /mnt/local/sda1/hadoop/dfsdata/blocksBeingWritten
Только три должны потерпеть неудачу таким образом, прежде чем мы начнем испытывать реальную потерю данных.
В настоящее время мы обходим это, уменьшая количество места, зарезервированного для пользователя root, но в конечном итоге мы исчерпаем. Мы также постоянно проводим повторную балансировку, но некоторые диски все равно остаются на 100%.
Изменение параметра dfs.datanode.failed.volumes.tolerated не является решением, поскольку том не вышел из строя.
Есть идеи?
4 ответа
Согласно этому параметру HDFS по умолчанию, dfs.datanode.du.reserved
за объем. Таким образом, если вы установили 10 ГБ, а на вашем датоделе 4 тома настроены для HDFS, он выделит 40 ГБ для использования без DFS.
Возможно, вам следует переместить данные из одного тома в другой в пределах одной датододы вручную:
3.12. На отдельном узле данных, как вы балансируете блоки на диске?
В настоящее время Hadoop не имеет метода, позволяющего сделать это автоматически. Чтобы сделать это вручную:
- Завершите работу задействованного узла данных
- Используйте команду mv UNIX для перемещения реплики и метапар отдельных блоков из одного каталога в другой на выбранном хосте. В выпусках, которые имеют HDFS-6482 (Apache Hadoop 2.6.0+), вы также должны убедиться, что структура каталогов с подкаталогом остается точно такой же при перемещении блоков по дискам. Например, если реплика блока и ее метапара находятся в /data/1/dfs/dn/current/BP-1788246909-172.23.1.202-1412278461680/current/finalized/subdir0/subdir1/, и вы хотите переместить ее в /data/5/ disk, тогда он ДОЛЖЕН быть перемещен в ту же структуру подкаталогов, что и /data/5/dfs/dn/current/BP-1788246909-172.23.1.202-1412278461680/current/finalized/subdir0/subdir1/, Если это не поддерживается, DN больше не сможет найти реплики после перемещения.
- Перезапустите DataNode.
Источник: https://wiki.apache.org/hadoop/FAQ
В вашем случае равномерная балансировка данных по кластерным датодам может помочь избежать переполнения дисков, даже если в общем кластере достаточно места, вы можете периодически принудительно запускать балансировщик hadoop oob. Это будет перетасовывать блоки, поэтому все датододы будут занимать одинаковое количество дискового пространства.
hadoop balancer
Вы можете указать порог для этого скрипта, к которому будут сбалансированы блоки hdfs, по умолчанию 10, вы можете указать меньшее число, если считаете, что 10% недостаточно, я вижу, вы уже используете 90% места в hdf, поэтому вы можете перейти к 5
hadoop balancer 5
проверьте эти link1 link2 также для получения дополнительной информации о балансировке
Я думаю, что вы действительно хотите установить dfs.datanode.du.reserved в какое-то ненулевое значение, чтобы datanode всегда обеспечивал свободное пространство на томах HDFS системы.
Примечание: dfs.datanode.du.reserved - для свободного пространства во всей системе, а не для тома.
В соответствии с HDFS-1564 обсуждается вопрос о том, как сделать опцию для каждого тома, но она пока не предназначена для какой-либо конкретной версии.