De acordo com este parâmetro padrão do HDFS , o dfs.datanode.du.reserved
é por volume. Portanto, se você definir 10 GB e o datanode tiver 4 volumes configurados para HDFS, ele reservará 40 GB para uso não DFS.
Nosso cluster HDFS está apenas 90% cheio, mas alguns datanodes têm alguns discos que estão 100% cheios. Isso significa que quando reiniciamos em massa o cluster inteiro, alguns datanodes não conseguem iniciar com uma mensagem como esta:
2013-10-26 03:58:27,295 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Mkdirs failed to create /mnt/local/sda1/hadoop/dfsdata/blocksBeingWritten
Apenas três precisam falhar dessa forma antes de começarmos a sofrer uma perda real de dados.
Atualmente, trabalhamos diminuindo a quantidade de espaço reservado para o usuário root, mas acabamos perdendo. Também executamos o re-balancer constantemente, mas alguns discos ficam com 100% de qualquer maneira.
A alteração da configuração dfs.datanode.failed.volumes.tolerated não é a solução, pois o volume não falhou.
Alguma idéia?
De acordo com este parâmetro padrão do HDFS , o dfs.datanode.du.reserved
é por volume. Portanto, se você definir 10 GB e o datanode tiver 4 volumes configurados para HDFS, ele reservará 40 GB para uso não DFS.
Talvez você deva transferir dados de um volume para outro em um datanode manualmente:
3.12. Em um nó de dados individual, como você equilibra os blocos no disco?
Atualmente, o Hadoop não possui um método para fazer isso automaticamente. Para fazer isso manualmente:
Fonte: link
para o seu caso, equilibrar seus dados uniformemente sobre os datanodes do cluster pode ajudar a evitar que os discos fiquem cheios, mesmo se o cluster geral tiver espaço você pode forçar a execução hadoop oob balancer periodically.this irá embaralhar os blocos para que todos os datanodes consumam a mesma quantidade de espaço em disco
hadoop balancer
você pode especificar o limite para este script no qual os blocos hdfs serão balanceados, o padrão é 10, você pode especificar um número menor se você acha que 10% não é suficiente, eu vejo você já usando 90% de espaço em hdfs, então você pode vá para 5
hadoop balancer 5
verifique estes link1 link2 também para mais sobre balanceador
Eu acho que o que você realmente quer é definir dfs.datanode.du.reservado para algum valor diferente de zero, para que o datanode garanta que sempre haja muito espaço livre nos volumes HDFS do sistema.
Nota: dfs.datanode.du.reserved é para espaço livre no sistema inteiro , não por volume.
De acordo com HDFS-1564 , há discussão sobre como fazer uma opção por volume, mas não é previsto para qualquer versão particular ainda.