A versão atual (4.2) do CDH — a distribuição 100% de código aberto da Cloudera do Apache Hadoop e projetos relacionados (incluindo o Apache HBase) — introduziu um novo recurso HBase, recentemente lançado no tronco, que permite que um administrador tire um instantâneo de um determinado tabela.
Antes do CDH 4.2, a única maneira de fazer backup ou clonar uma tabela era usar Copiar/Exportar Tabela ou, após desabilitar a tabela, copiar todos os hfiles no HDFS. Copiar/Exportar Tabela é um conjunto de ferramentas que usa MapReduce para digitalizar e copiar a tabela, mas com impacto direto no desempenho do Servidor Regional. Desabilitar a tabela interrompe todas as leituras e gravações, o que quase sempre será inaceitável.
Por outro lado, os instantâneos do HBase permitem que um administrador clone uma tabela sem cópias de dados e com impacto mínimo nos servidores regionais. A exportação do snapshot para outro cluster não afeta diretamente nenhum dos Region Servers; export é apenas um distcp com um pouco de lógica extra.
Aqui estão alguns dos casos de uso para snapshots do HBase:
- Recuperação de erros de usuário/aplicativo
- Restaure/recupere de um estado seguro conhecido.
- Visualize instantâneos anteriores e mescle seletivamente a diferença na produção.
- Salve um instantâneo antes de uma atualização ou alteração importante do aplicativo.
- Auditoria e/ou geração de relatórios sobre visualizações de dados em um momento específico
- Capture dados mensais para fins de conformidade.
- Gere relatórios de fim de dia/mês/trimestre.
- Teste de aplicativos
- Teste as alterações do esquema ou do aplicativo em dados semelhantes aos da produção a partir de um instantâneo e descarte-os. Por exemplo:tire um instantâneo, crie uma nova tabela a partir do conteúdo do instantâneo (esquema mais dados) e manipule a nova tabela alterando o esquema, adicionando e removendo linhas e assim por diante. (A tabela original, o instantâneo e a nova tabela permanecem mutuamente independentes.)
- Descarregamento de trabalho
- Tire um instantâneo, exporte-o para outro cluster e execute seus trabalhos do MapReduce. Como o snapshot de exportação opera no nível do HDFS, você não diminui a velocidade do cluster principal do HBase tanto quanto o CopyTable.
O que é um instantâneo?
Um instantâneo é um conjunto de informações de metadados que permite que um administrador volte a um estado anterior da tabela. Um instantâneo não é uma cópia da tabela; é apenas uma lista de nomes de arquivos e não copia os dados. Uma restauração de instantâneo completo significa que você volta ao “esquema de tabela” anterior e recupera seus dados anteriores, perdendo todas as alterações feitas desde que o instantâneo foi tirado.
Operações
- Tirar um instantâneo: esta operação tenta tirar um instantâneo em uma tabela especificada. A operação pode falhar se as regiões estiverem se movendo durante o balanceamento, divisão ou mesclagem.
- Clone um snapshot: esta operação cria uma nova tabela usando o mesmo esquema e com os mesmos dados presentes no snapshot especificado. O resultado dessa operação é uma nova tabela totalmente funcional que pode ser modificada sem impacto na tabela original ou no snapshot.
- Restaurar um instantâneo: esta operação traz o esquema e os dados da tabela de volta ao estado do instantâneo. (Observação:esta operação descarta quaisquer alterações feitas desde que o instantâneo foi tirado.)
- Excluir um instantâneo: esta operação remove um instantâneo do sistema, liberando espaço em disco não compartilhado, sem afetar clones ou outros instantâneos.
- Exportar um instantâneo: esta operação copia os dados e metadados do instantâneo para outro cluster. A operação envolve apenas HDFS, portanto, não há comunicação com o mestre ou os servidores de região e, portanto, o cluster HBase pode ficar inativo.
Copiar instantâneo, restaurar, clonar
A principal diferença entre um instantâneo e um CopyTable/ExportTable é que as operações de instantâneo gravam apenas metadados. Não há cópias de dados em massa envolvidas.
Um dos principais princípios de design do HBase é que, uma vez que um arquivo seja gravado, ele nunca será modificado. Ter arquivos imutáveis significa que um snapshot apenas rastreia os arquivos usados no momento da operação do snapshot, e durante a compactação é responsabilidade do snapshot informar ao sistema que o arquivo não deve ser excluído, mas sim arquivado.
O mesmo princípio se aplica a uma operação de clonagem ou restauração. Como os arquivos são imutáveis, uma nova tabela é criada com apenas “links” para os arquivos referenciados pelo snapshot.
Export Snapshot é a única operação que requer uma cópia dos dados, pois o outro cluster não possui os arquivos de dados.
Exportar instantâneo x copiar/exportar tabela
Além das garantias de melhor consistência que um instantâneo pode fornecer em comparação com um trabalho de cópia/exportação, a principal diferença entre Exportar um instantâneo e Copiar/exportar uma tabela é que o ExportSnapshot opera no nível HDFS. Isso significa que os servidores mestre e de região não estão envolvidos nessas operações. Consequentemente, nenhum cache desnecessário para dados é criado e não há acionamento de pausas de GC adicionais devido ao número de objetos criados durante o processo de verificação. O impacto no desempenho do cluster HBase decorre da rede extra e da carga de trabalho do disco experimentada pelos DataNodes.
HBase Shell:operações de instantâneo
Confirme se o suporte a instantâneos está ativado verificando se o
hbase.snapshot.enabled
A propriedade em hbase-site.xml está configurada para true. Para tirar um instantâneo de uma tabela especificada, use o snapshot
comando. (Nenhuma cópia de arquivo é executada) hbase> snapshot ‘tableName’, ‘snapshotName’
Para listar todos os instantâneos, use o
list_snapshot
comando. ele exibirá o nome do instantâneo, a tabela de origem e a data e hora de criação. hbase> list_snapshots SNAPSHOT TABLE + CREATION TIME TestSnapshot TestTable (Mon Feb 25 21:13:49 +0000 2013)
Para remover um instantâneo, use o
delete_snapshot
comando. A remoção de um instantâneo não afeta as tabelas clonadas ou outros instantâneos subsequentes obtidos. hbase> delete_snapshot 'snapshotName'
Para criar uma nova tabela a partir de um instantâneo especificado (clone), use o
clone_snapshot
comando. Nenhuma cópia de dados é executada, então você não acaba usando o dobro do espaço para os mesmos dados. hbase> clone_snapshot 'snapshotName', 'newTableName'
Para substituir o esquema/dados da tabela atual por um conteúdo de instantâneo especificado, use o
restore_snapshot
comando. hbase> restore_snapshot 'snapshotName'
Para exportar um instantâneo existente para outro cluster, use o
ExportSnapshot
ferramenta. A exportação não afeta a carga de trabalho dos RegionServers, funciona no nível do HDFS e você precisa especificar um local do HDFS (o hbase.rootdir do outro cluster). hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot SnapshotName -copy-to hdfs:///srv2:8082/hbase
Limitações atuais
Os instantâneos dependem de algumas suposições e, atualmente, existem algumas ferramentas que não estão totalmente integradas ao novo recurso:
- Mesclar regiões referenciadas por um instantâneo causa perda de dados no instantâneo e nas tabelas clonadas.
- A restauração de uma tabela com replicação ativada para a tabela restaurada termina com os dois clusters fora de sincronia. A tabela não é restaurada na réplica.
Conclusão
Atualmente, o recurso de instantâneo inclui todas as funcionalidades básicas necessárias, mas ainda há muito trabalho a fazer, incluindo métricas, integração de UI da Web, otimizações de uso de disco e muito mais.
Para saber mais sobre como configurar o HBase e usar instantâneos, revise a documentação.
Matteo Bertozzi é engenheiro de software na equipe da plataforma e um committer do HBase.