Наш кластер 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 не является решением, поскольку том не отказал.
Любые идеи?
Возможно, вам следует вручную переместить данные из одного тома в другой в пределах одного узла данных:
3.12. Как сбалансировать блоки на диске на отдельном узле данных?
В настоящее время Hadoop не имеет метода, позволяющего делать это автоматически. Для этого вручную:
Источник: https://wiki.apache.org/hadoop/FAQ
Согласно этому параметр HDFS по умолчанию, то dfs.datanode.du.reserved
на объем. Поэтому, если вы установите 10 ГБ, а на вашем datanode 4 тома, настроенных для HDFS, будет выделено 40 ГБ для использования без DFS.
в вашем случае равномерная балансировка данных по узлам данных кластера может помочь вам избежать переполнения дисков, даже если в общем кластере есть место, вы можете периодически запускать балансировщик hadoop oob. это будет перемешивать блоки, так что все узлы данных будут использовать одинаковый объем дискового пространства
hadoop balancer
вы можете указать порог для этого скрипта, по которому блоки hdfs будут сбалансированы, по умолчанию 10, вы можете указать меньшее число, если считаете, что 10% недостаточно, я вижу, вы уже используете 90% пространства на hdfs, поэтому вы можете выбрать 5
hadoop balancer 5
проверьте это ссылка1 ссылка2 также для получения дополнительной информации о балансировщике
Я думаю, что вам действительно нужно установить для dfs.datanode.du.reserved какое-то ненулевое значение, чтобы узел данных гарантировал, что на системных томах HDFS всегда будет свободное место.
Примечание: dfs.datanode.du.reserved предназначен для свободного пространства на вся система, а не за том.
В соответствии с HDFS-1564, обсуждается возможность создания опции для каждого тома, но она еще не запланирована для какой-либо конкретной версии.