Eu tenho um cluster Hadoop de cinco escravos (usando CDH4) --- escravos são onde DataNode e TaskNode são executados. Cada escravo tem 4 partições dedicadas ao armazenamento HDFS. Um dos escravos precisava de uma reinstalação e isso fazia com que uma das partições do HDFS fosse perdida. Neste ponto, o HDFS estava reclamando sobre 35K blocos ausentes.
Alguns dias depois, a reinstalação estava completa e eu coloquei o nó online novamente no Hadoop. O HDFS permanece no modo de segurança e o novo servidor não está se registrando nem perto da quantidade de blocos que os outros nós estão. Por exemplo, sob o DFS Admin, o novo nó mostra que possui 6K blocos, enquanto os outros nós têm cerca de 400K blocos.
Atualmente, os logs DataNode do novo nó mostram que ele está fazendo alguma verificação (ou copiando?) em vários blocos, alguns dos quais falham como já existentes. Eu acredito que este é o HDFS apenas replicando dados existentes para o novo nó. Exemplo de verificação:
2013-08-09 17:05:02,113 INFO org.apache.hadoop.hdfs.server.datanode.BlockPoolSliceScanner: Verification succeeded for BP-143510735-141.212.113.141-1343417513962:blk_6568189110100209829_1733272
Exemplo de falha:
2013-08-09 17:04:48,100 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: meez02.eecs.umich.edu:50010:DataXceiver error processing REPLACE_BLOCK operation src: /141.212.113.141:52192 dest: /141.212.113.65:50010
org.apache.hadoop.hdfs.server.datanode.ReplicaAlreadyExistsException: Block BP-143510735-141.212.113.141-1343417513962:blk_-4515068373845130948_756319 already exists in state FINALIZED and thus cannot be created.
at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.createTemporary(FsDatasetImpl.java:813)
at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.createTemporary(FsDatasetImpl.java:92)
at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.<init>(BlockReceiver.java:155)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.replaceBlock(DataXceiver.java:846)
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.opReplaceBlock(Receiver.java:137)
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.processOp(Receiver.java:70)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:221)
at java.lang.Thread.run(Thread.java:679)
No DFS Admin, também vejo que esse novo nó está com 61% da capacidade (correspondendo ao uso aproximado de outros nós), embora seu número de blocos seja de aproximadamente 2% dos outros nós. Eu estou supondo que isso é apenas os dados antigos que o HDFS não está reconhecendo.
Suspeito que uma das poucas coisas aconteceu: (a) o HDFS abandonou os dados deste nó por causa do staleness; (b) a reinstalação alterou alguns parâmetros do sistema para que o HDFS os considere como um novo nó (ou seja, não um existente com dados); ou (c) de alguma forma o mapeamento de unidade ficou confuso, fazendo com que o mapeamento de partições fosse alterado e o HDFS não conseguisse encontrar os dados antigos (embora as unidades possuam rótulos, e tenho 95% de certeza de que acertamos).
Pergunta principal: Como posso obter o HDFS para reconhecer novamente os dados nesta unidade?
-
responda: reinicie o NameNode, e os nós irão relatar quais blocos eles possuem (veja a Atualização 1 abaixo)
Sub-questão 1: Se a minha suposição de uso de dados do novo nó estiver correta - que o uso de 61% é de dados fantasmas --- será limpo? HDFS, ou eu preciso remover manualmente isso?
-
menos de um problema: uma vez que uma grande parte da unidade parece ser reconhecida (consulte a Atualização 1 abaixo)
Sub-questão 2: Atualmente, não consigo executar listCorruptFileBlocks
para encontrar os blocos ausentes devido a "as filas de replicação não foram inicializadas". Alguma ideia de como consertar isso? Tenho que esperar que o novo nó seja reequilibrado (isto é, essa fase de verificação / cópia para terminar)?
-
answer: saindo do modo de segurança, deixe-me rodar isso (veja a Atualização 1 abaixo)
Atualizações
Atualização 1: achei que havia corrigido o problema reiniciando meu NameNode. Isso fez com que a contagem de blocos do novo nó aumentasse para aproximadamente o mesmo uso que os outros nós, e o DFS alterou sua mensagem para:
Safe mode is ON. The reported blocks 629047 needs additional 8172
blocks to reach the threshold 0.9990 of total blocks 637856. Safe mode
will be turned off automatically.
Deixei-o nesse estado por várias horas, esperando que ele finalmente saísse do modo de segurança, mas nada mudou. Em seguida, desliguei manualmente o Modo de Segurança e a mensagem do DFS mudou para "8800 blocos estão faltando". Neste ponto, consegui executar hdfs fsk -list-corruptfileblocks
para ver uma grande parte dos arquivos que faltam blocos.
Problema restante atual: como recuperar esses blocos ausentes ...
(eu deveria mudar isso em uma nova pergunta?)