Migre dados do HBase para o Bigtable offline

Esta página descreve as considerações e os processos para migrar dados de um cluster do Apache HBase para uma instância do Bigtable noGoogle Cloud.

O processo descrito nesta página requer que coloque a sua aplicação offline. Se quiser migrar sem tempo de inatividade, consulte as orientações para a migração online em Replique do HBase para o Bigtable.

Para migrar dados para o Bigtable a partir de um cluster do HBase alojado num Google Cloud serviço, como o Dataproc ou o Compute Engine, consulte o artigo Migrar o HBase alojado no Google Cloud para o Bigtable.

Antes de iniciar esta migração, deve considerar as implicações no desempenho, a estrutura do esquema do Bigtable, a sua abordagem à autenticação e autorização, e o conjunto de funcionalidades do Bigtable.

Considerações pré-migração

Esta secção sugere alguns aspetos a rever e a ter em conta antes de iniciar a migração.

Desempenho

Com uma carga de trabalho típica, o Bigtable oferece um desempenho altamente previsível. Certifique-se de que compreende os fatores que afetam o desempenho do Bigtable antes de migrar os seus dados.

Design do esquema do Bigtable

Na maioria dos casos, pode usar o mesmo esquema de design no Bigtable que usa no HBase. Se quiser alterar o seu esquema ou se o seu exemplo de utilização estiver a mudar, reveja os conceitos apresentados em Conceber o seu esquema antes de migrar os seus dados.

Autenticação e autorização

Antes de conceber o controlo de acesso para o Bigtable, reveja os processos de autenticação e autorização do HBase existentes.

O Bigtable usa os mecanismos padrão Google Cloud's para autenticaçãoe gestão de identidade e acesso para fornecer controlo de acesso, pelo que converte a sua autorização existente no HBase para IAM. Pode mapear os grupos Hadoop existentes que fornecem mecanismos de controlo de acesso para o HBase a diferentes contas de serviço.

O Bigtable permite-lhe controlar o acesso ao nível do projeto, da instância e da tabela. Para mais informações, consulte o artigo Controlo de acesso.

Requisito de período de descanso

A abordagem de migração descrita nesta página envolve colocar a sua aplicação offline durante a migração. Se a sua empresa não puder tolerar o tempo de inatividade enquanto migra para o Bigtable, consulte as orientações para a migração online em Replique do HBase para o Bigtable.

Migre o HBase para o Bigtable

Para migrar os seus dados do HBase para o Bigtable, exporte uma cópia instantânea do HBase para cada tabela para o Cloud Storage e, em seguida, importe os dados para o Bigtable. Estes passos destinam-se a um único cluster do HBase e são descritos detalhadamente nas próximas secções.

  1. Parar de enviar gravações para o cluster do HBase.
  2. Tire instantâneos das tabelas do cluster HBase.
  3. Exporte os ficheiros de instantâneos para o Cloud Storage.
  4. Calcular hashes e exportá-los para o Cloud Storage.
  5. Crie tabelas de destino no Bigtable.
  6. Importe os dados do HBase do Cloud Storage para o Bigtable.
  7. Valide os dados importados.
  8. A rota escreve no Bigtable.

Antes de começar

  1. Crie um contentor do Cloud Storage para armazenar os seus instantâneos. Crie o contentor na mesma localização em que planeia executar a tarefa do Dataflow.

  2. Crie uma instância do Bigtable para armazenar as novas tabelas.

  3. Identifique o cluster Hadoop que está a exportar. Pode executar as tarefas para a migração diretamente no cluster do HBase ou num cluster do Hadoop separado que tenha conetividade de rede com o Namenode e os Datanodes do cluster do HBase.

  4. Instale e configure o conetor do Cloud Storage em todos os nós no cluster do Hadoop, bem como no anfitrião a partir do qual a tarefa é iniciada. Para ver os passos de instalação detalhados, consulte o artigo Instalar o conector do Cloud Storage.

  5. Abra uma shell de comandos num anfitrião que possa estabelecer ligação ao cluster do HBase e ao projeto do Bigtable. É aqui que vai concluir os passos seguintes.

  6. Obtenha a ferramenta de tradução de esquemas:

    wget BIGTABLE_HBASE_TOOLS_URL
    

    Substitua BIGTABLE_HBASE_TOOLS_URL pelo URL da JAR with dependencies mais recente disponível no repositório Maven da ferramenta. O nome do ficheiro é semelhante a https://repo1.maven.org/maven2/com/google/cloud/bigtable/bigtable-hbase-1.x-tools/1.24.0/bigtable-hbase-1.x-tools-1.24.0-jar-with-dependencies.jar.

    Para encontrar o URL ou transferir manualmente o JAR, faça o seguinte:

    1. Aceda ao repositório.
    2. Clique no número da versão mais recente.
    3. Identifique o JAR with dependencies file (normalmente, na parte superior).
    4. Clique com o botão direito do rato e copie o URL ou clique para transferir o ficheiro.
  7. Obtenha a ferramenta de importação:

    wget BIGTABLE_BEAM_IMPORT_URL
    

    Substitua BIGTABLE_BEAM_IMPORT_URL pelo URL da shaded JAR mais recente disponível no repositório Maven da ferramenta. O nome do ficheiro é semelhante a https://repo1.maven.org/maven2/com/google/cloud/bigtable/bigtable-beam-import/1.24.0/bigtable-beam-import-1.24.0-shaded.jar.

    Para encontrar o URL ou transferir manualmente o JAR, faça o seguinte:

    1. Aceda ao repositório.
    2. Clique no número da versão mais recente.
    3. Clique em Transferências.
    4. Passe o cursor do rato sobre shaded.jar.
    5. Clique com o botão direito do rato e copie o URL ou clique para transferir o ficheiro.
  8. Defina as seguintes variáveis de ambiente:

    #Google Cloud
    
    export PROJECT_ID=PROJECT_ID
    export INSTANCE_ID=INSTANCE_ID
    export REGION=REGION
    export CLUSTER_NUM_NODES=CLUSTER_NUM_NODES
    
    #JAR files
    
    export TRANSLATE_JAR=TRANSLATE_JAR
    export IMPORT_JAR=IMPORT_JAR
    
    #Cloud Storage
    
    export BUCKET_NAME="gs://BUCKET_NAME"
    export MIGRATION_DESTINATION_DIRECTORY="$BUCKET_NAME/hbase-migration-snap"
    
    #HBase
    
    export ZOOKEEPER_QUORUM=ZOOKEPER_QUORUM
    export ZOOKEEPER_PORT=2181
    export ZOOKEEPER_QUORUM_AND_PORT="$ZOOKEEPER_QUORUM:$ZOOKEEPER_PORT"
    export MIGRATION_SOURCE_DIRECTORY=MIGRATION_SOURCE_DIRECTORY
    

    Substitua o seguinte:

    • PROJECT_ID: o Google Cloud projeto em que a sua instância se encontra
    • INSTANCE_ID: o identificador da instância do Bigtable para a qual está a importar os dados
    • REGION: uma região que contém um dos clusters na sua instância do Bigtable. Exemplo: northamerica-northeast2
    • CLUSTER_NUM_NODES: o número de nós na sua instância do Bigtable
    • TRANSLATE_JAR: o nome e o número da versão do ficheiro JAR bigtable hbase tools que transferiu do Maven. O valor deve ter um aspeto semelhante a bigtable-hbase-1.x-tools-1.24.0-jar-with-dependencies.jar.
    • IMPORT_JAR: o nome e o número da versão do ficheiro JAR bigtable-beam-import que transferiu do Maven. O valor deve ter um aspeto semelhante a bigtable-beam-import-1.24.0-shaded.jar.
    • BUCKET_NAME: o nome do contentor do Cloud Storage onde está a armazenar as suas capturas de ecrã
    • ZOOKEEPER_QUORUM: o anfitrião do zookeeper ao qual a ferramenta se vai ligar, no formato host1.myownpersonaldomain.com
    • MIGRATION_SOURCE_DIRECTORY: o diretório no seu anfitrião do HBase que contém os dados que quer migrar, no formato hdfs://host1.myownpersonaldomain.com:8020/hbase
  9. (Opcional) Para confirmar que as variáveis foram definidas corretamente, execute o comando printenv para ver todas as variáveis de ambiente.

Pare de enviar gravações para o HBase

Antes de tirar instantâneos das suas tabelas HBase, pare de enviar gravações para o seu cluster HBase.

Tire instantâneos de tabelas HBase

Quando o cluster do HBase deixar de ingerir dados, tire uma captura de ecrã de cada tabela que planeia migrar para o Bigtable.

Inicialmente, uma captura instantânea tem uma pegada de armazenamento mínima no cluster do HBase, mas, ao longo do tempo, pode crescer até atingir o mesmo tamanho da tabela original. A captura instantânea não consome recursos da CPU.

Execute o seguinte comando para cada tabela, usando um nome exclusivo para cada instantâneo:

echo "snapshot 'TABLE_NAME', 'SNAPSHOT_NAME'" | hbase shell -n

Substitua o seguinte:

  • TABLE_NAME: o nome da tabela HBase a partir da qual está a exportar dados.
  • SNAPSHOT_NAME: o nome do novo instantâneo

Exporte as capturas instantâneas do HBase para o Cloud Storage

Depois de criar as capturas instantâneas, tem de as exportar. Quando estiver a executar tarefas de exportação num cluster HBase de produção, monitorize o cluster e outros recursos do HBase para garantir que os clusters permanecem em bom estado.

Para cada instantâneo que quer exportar, execute o seguinte:

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-Dhbase.zookeeper.quorum=$ZOOKEEPER_QUORUM_AND_PORT -snapshot SNAPSHOT_NAME \
    -copy-from $MIGRATION_SOURCE_DIRECTORY \
    -copy-to $MIGRATION_DESTINATION_DIRECTORY/data

Substitua SNAPSHOT_NAME pelo nome do instantâneo a exportar.

Calcule e exporte hashes

Em seguida, crie hashes para usar na validação após a conclusão da migração. HashTable é uma ferramenta de validação fornecida pelo HBase que calcula hashes para intervalos de linhas e exporta-os para ficheiros. Pode executar uma tarefa sync-table na tabela de destino para fazer corresponder os hashes e ganhar confiança na integridade dos dados migrados.

Execute o seguinte comando para cada tabela que exportou:

hbase org.apache.hadoop.hbase.mapreduce.HashTable --batchsize=32000 --numhashfiles=20 \
TABLE_NAME $MIGRATION_DESTINATION_DIRECTORY/hashtable/TABLE_NAME

Substitua o seguinte:

  • TABLE_NAME: o nome da tabela HBase para a qual criou uma captura instantânea e exportou

Crie tabelas de destino

O passo seguinte é criar uma tabela de destino na instância do Bigtable para cada instantâneo que exportou. Use uma conta com autorização bigtable.tables.create para a instância.

Este guia usa a ferramenta de tradução do esquema do Bigtable, que cria automaticamente a tabela para si. No entanto, se não quiser que o esquema do Bigtable corresponda exatamente ao esquema do HBase, pode criar uma tabela através da ferramenta de linha de comandos cbt ou da consola Google Cloud .

A ferramenta de tradução de esquemas do Bigtable captura o esquema da tabela do HBase, incluindo o nome da tabela, as famílias de colunas, as políticas de recolha de lixo e as divisões. Em seguida, cria uma tabela semelhante no Bigtable.

Para cada tabela que quer importar, execute o seguinte comando para copiar o esquema do HBase para o Bigtable.

java \
 -Dgoogle.bigtable.project.id=$PROJECT_ID \
 -Dgoogle.bigtable.instance.id=$INSTANCE_ID \
 -Dgoogle.bigtable.table.filter=TABLE_NAME \
 -Dhbase.zookeeper.quorum=$ZOOKEEPER_QUORUM \
 -Dhbase.zookeeper.property.clientPort=$ZOOKEEPER_PORT \
 -jar $TRANSLATE_JAR

Substitua TABLE_NAME pelo nome da tabela HBase que está a importar. A ferramenta de tradução de esquemas usa este nome para a nova tabela do Bigtable.

Opcionalmente, também pode substituir TABLE_NAME por uma expressão regular, como ".*", que capture todas as tabelas que quer criar e, em seguida, executar o comando apenas uma vez.

Importe os dados do HBase para o Bigtable através do Dataflow

Depois de ter uma tabela pronta para migrar os dados, pode importar e validar os dados.

Tabelas não comprimidas

Se as suas tabelas HBase não estiverem comprimidas, execute o seguinte comando para cada tabela que quer migrar:

java -jar $IMPORT_JAR importsnapshot \
    --runner=DataflowRunner \
    --project=$PROJECT_ID \
    --bigtableInstanceId=$INSTANCE_ID \
    --bigtableTableId=TABLE_NAME \
    --hbaseSnapshotSourceDir=$MIGRATION_DESTINATION_DIRECTORY/data \
    --snapshotName=SNAPSHOT_NAME \
    --stagingLocation=$MIGRATION_DESTINATION_DIRECTORY/staging \
    --tempLocation=$MIGRATION_DESTINATION_DIRECTORY/temp \
    --maxNumWorkers=$(expr 3 \* $CLUSTER_NUM_NODES) \
    --region=$REGION

Substitua o seguinte:

  • TABLE_NAME: o nome da tabela HBase que está a importar. A ferramenta de tradução de esquemas usa este nome para a nova tabela do Bigtable. Não são suportados novos nomes de tabelas.
  • SNAPSHOT_NAME: o nome que atribuiu à imagem da tabela que está a importar

Depois de executar o comando, a ferramenta restaura a cópia instantânea do HBase para o seu contentor do Cloud Storage e, em seguida, inicia a tarefa de importação. O processo de restauro da captura de ecrã pode demorar vários minutos a ser concluído, consoante o tamanho da captura de ecrã.

Tenha em atenção as seguintes dicas quando importar:

  • Para melhorar o desempenho do carregamento de dados, certifique-se de que define maxNumWorkers. Este valor ajuda a garantir que a tarefa de importação tem capacidade de computação suficiente para ser concluída num período razoável, mas não tanta que sobrecarregue a instância do Bigtable.
    • Se também não estiver a usar a instância do Bigtable para outra carga de trabalho, multiplique o número de nós na instância do Bigtable por 3 e use esse número para maxNumWorkers.
    • Se estiver a usar a instância para outra carga de trabalho ao mesmo tempo que está a importar os dados do HBase, reduza o valor de maxNumWorkers adequadamente.
  • Use o tipo de trabalhador predefinido.
  • Durante a importação, deve monitorizar a utilização da CPU da instância do Bigtable. Se a utilização da CPU na instância do Bigtable for demasiado elevada, pode ter de adicionar nós adicionais. Pode demorar até 20 minutos para o cluster oferecer a vantagem de desempenho dos nós adicionais.

Para mais informações sobre a monitorização da instância do Bigtable, consulte o artigo Monitorização.

Tabelas comprimidas com Snappy

Se estiver a importar tabelas comprimidas com Snappy, tem de usar uma imagem de contentor personalizada no pipeline do Dataflow. A imagem do contentor personalizado que usa para importar dados comprimidos para o Bigtable oferece suporte para a biblioteca de compressão nativa do Hadoop. Tem de ter a versão 2.30.0 ou posterior do SDK do Apache Beam para usar o Dataflow Runner v2 e tem de ter a versão 2.3.0 ou posterior da biblioteca do cliente HBase para Java.

Para importar tabelas comprimidas com o formato Snappy, execute o mesmo comando que executa para tabelas não comprimidas, mas adicione a seguinte opção:

    --enableSnappy=true

Valide os dados importados no Bigtable

Para validar os dados importados, tem de executar a tarefa sync-table. A tarefa sync-tablecalcula hashes para intervalos de linhas no Bigtable e, em seguida, faz a correspondência com o resultado da tabela de hash que calculou anteriormente.

Para executar a tarefa sync-table, execute o seguinte na shell de comandos:

java -jar $IMPORT_JAR sync-table  \
    --runner=dataflow \
    --project=$PROJECT_ID \
    --bigtableInstanceId=$INSTANCE_ID \
    --bigtableTableId=TABLE_NAME \
    --outputPrefix=$MIGRATION_DESTINATION_DIRECTORY/sync-table/output-TABLE_NAME-$(date +"%s") \
    --stagingLocation=$MIGRATION_DESTINATION_DIRECTORY/sync-table/staging \
    --hashTableOutputDir=$MIGRATION_DESTINATION_DIRECTORY/hashtable/TABLE_NAME \
    --tempLocation=$MIGRATION_DESTINATION_DIRECTORY/sync-table/dataflow-test/temp \
    --region=$REGION

Substitua TABLE_NAME pelo nome da tabela HBase que está a importar.

Quando a tarefa sync-table estiver concluída, abra a página Detalhes da tarefa do Dataflow e reveja a secção Contadores personalizados da tarefa. Se a tarefa de importação importar com êxito todos os dados, o valor de ranges_matched tem um valor e o valor de ranges_not_matched é 0.

Contadores personalizados do Dataflow

Se ranges_not_matched mostrar um valor, abra a página Registos, escolha Registos do trabalhador e filtre por Divergência no intervalo. O resultado legível por computador destes registos é armazenado no Cloud Storage no destino de saída que cria na opção outputPrefix da tabela de sincronização.

Registos de trabalhadores do Dataflow

Pode tentar novamente a tarefa de importação ou escrever um script para ler os ficheiros de saída e determinar onde ocorreram as incompatibilidades. Cada linha no ficheiro de saída é um registo JSON serializado de um intervalo com incompatibilidade.

A rota escreve no Bigtable

Depois de validar os dados de cada tabela no cluster, pode configurar as suas aplicações para encaminhar todo o respetivo tráfego para o Bigtable e, em seguida, descontinuar a instância do HBase.

Quando a migração estiver concluída, pode eliminar as capturas de ecrã na instância do HBase.

O que se segue?