Como corrigir o cluster do Hadoop HDFS com blocos ausentes depois que um nó foi reinstalado?

5

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?)

    
por Dolan Antenucci 10.08.2013 / 14:36

2 respostas

1

Acabei tendo que deletar os arquivos com blocos ruins, que depois de mais investigações, percebi que tinha uma replicação muito baixa (rep = 1 se bem me lembro).

Esta postagem SO tem mais informações sobre como localizar os arquivos com blocos ruins, usando algo como:

hadoop fsck / | egrep -v '^\.+$' | grep -v eplica

Então, para responder minhas próprias perguntas:

  1. Esses arquivos podem ser recuperados? Não, a menos que os nós / unidades com falha sejam colocados on-line novamente com os dados ausentes.
  2. Como saio do modo de segurança? Remova esses arquivos problemáticos e, em seguida, deixe o modo de segurança via dfsadmin .
por 05.07.2015 / 17:16
2

Tivemos um problema semelhante hoje. Um de nossos nós (de 3, com replicação = 3) acabou de morrer e, após o reinício, começamos a ver isso nos logs dos datanodes afetados:

18/04/27 14:37:22 INFO datanode.DataNode: Receiving BP-1114663060-172.30.36.22-1516109725438:blk_1073743913_3089 src: /172.30.36.26:35300 dest: /172.30.36.25:50010
18/04/27 14:37:22 INFO datanode.DataNode: g500603svhcm:50010:DataXceiver error processing WRITE_BLOCK operation  src: /172.30.36.26:35300 dst: /172.30.36.25:50010; org.apache.hadoop.hdfs.server.datanode.ReplicaAlreadyExistsException: Block BP-1114663060-172.30.36.22-1516109725438:blk_1073743913_3089 already exists in state FINALIZED and thus cannot be created.

O webui dos namenodes mostra o datanode com apenas 92 blocos (dos 13400 restantes).

Corrigido disparando um relatório de bloco completo no datanode, que atualizava os dados do namenode:

hdfs dfsadmin -triggerBlockReport g500603svhcm:50020

O resultado: o datanode estava faltando alguns blocos que aceitaram e restauraram o cluster.

    
por 27.04.2018 / 16:58