Como desduplicar 40 TB de dados?

17

Eu herdei um cluster de pesquisa com ~ 40 TB de dados em três sistemas de arquivos. Os dados remontam a quase 15 anos, e é provável que haja uma boa quantidade de duplicatas, pois os pesquisadores copiam os dados uns dos outros por diferentes razões e depois se apegam às cópias.

Eu sei sobre ferramentas de remoção de dupagem, como fdupes e rmlint. Estou tentando encontrar um que funcione em um conjunto de dados tão grande. Eu não me importo se levar semanas (ou talvez meses) para rastrear todos os dados - provavelmente eu o estrangularei para facilitar o uso dos sistemas de arquivos. Mas preciso encontrar uma ferramenta que seja de alguma forma super eficiente com a RAM ou que possa armazenar todos os dados intermediários de que precisa nos arquivos, e não na RAM. Estou assumindo que minha RAM (64GB) estará esgotada se eu rastrear todos esses dados como um conjunto.

Agora estou experimentando fdupes em uma árvore de 900 GB. É 25% do caminho e o uso da RAM tem aumentado lentamente o tempo todo, agora é de 700 MB.

Ou existe uma maneira de direcionar um processo para usar a RAM mapeada em disco, para que haja muito mais disponível e ele não use a RAM do sistema?

Estou executando o CentOS 6.

Michael Stauffer
fonte
Os sistemas de arquivos são XFS, caso isso seja relevante. Ou seja, eu sei que não é um fs com recursos de desduplicação como o XFS.
precisa
por que você está preocupado com a RAM em primeiro lugar? O SO possui seus próprios algoritmos de gerenciamento de memória e o fato de o uso da RAM estar "aumentando" não significa que acabará consumindo toda a sua RAM. Tenho certeza que isso não vai acontecer.
Art Gertner
1
Não sei como as ferramentas dedicadas funcionam, mas você pode calcular o hash para cada arquivo e registrá-lo junto com o caminho do arquivo, depois classificar por hashes e deduplicar. Deve ser possível com um script Python simples ou talvez até no Bash. O uso da RAM deve ser mínimo, exceto na etapa de classificação, mas acho que você poderia usar algum tipo de fusão modificada para mantê-la razoavelmente baixa.
precisa saber é o seguinte
1
Sim, a ferramenta dedicada calcula o hash, mas primeiro faça coisas como ver o tamanho do arquivo e use apenas o início dos arquivos para limitar a quantidade de hashes completos que precisam ser calculados.
precisa
Quanto à RAM, eu estava preocupado em diminuir a velocidade do servidor de arquivos - veja meu comentário abaixo na resposta.
precisa

Respostas:

4

Ou existe uma maneira de direcionar um processo para usar a RAM mapeada em disco, para que haja muito mais disponível e ele não use a RAM do sistema?

Sim, é chamado de unidade de troca. Você provavelmente já tem um. Se você está preocupado com a falta de RAM, aumentar esse é um bom ponto de partida. Ele funciona automaticamente, portanto, não há necessidade de fazer nada de especial.

Eu não me preocuparia com fdupes. Experimente, ele deve funcionar sem problemas.

krowe
fonte
Eu estava pensando que confiar na troca atrasaria todo o sistema - é um servidor de arquivos ocupado. Mas talvez não seja o suficiente para se preocupar? Eu poderia usar o ulimit para impedir que o processo usasse mais do que a ram do sistema, em qualquer caso, suponho, como à prova de falhas. Mas parece que o krowe e o smc não acham que os fdupes usariam tanto ram de qualquer maneira, então eu deveria tentar.
Michael Stauffer
1

encontrar duplicatas com base no hashkey funciona bem e é muito rápido.

find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate
kumar
fonte
0

Escreva um aplicativo rápido para percorrer as árvores, pressionando (hash, mtime) => caminho do arquivo em um dicionário ou marcando o arquivo para exclusão, se a entrada já existir. O hash será apenas um MD5 calculado nos primeiros N bytes. Você pode fazer algumas passagens diferentes, com um hash sobre um N pequeno e depois outro com um hash sobre um N. grande.

Você provavelmente poderia fazer isso em menos de vinte ou trinta linhas de Python (usando os.walk ()).

Dustin Oprea
fonte