Como migrar dados do HBase para o Cloud Bigtable

Neste artigo, descrevemos as considerações e os processos para migrar os dados de um cluster Apache HBase para um cluster do Cloud Bigtable no Google Cloud.

Antes de começar essa migração, avalie as implicações de desempenho, o design do esquema do Bigtable, as consequências para sua abordagem de autenticação e autorização e o conjunto de recursos do Bigtable.

Implicações no desempenho

No processamento de cargas de trabalho típicas, o Bigtable tem um desempenho altamente previsível. Quando tudo está dentro da normalidade, dependendo do tipo de armazenamento usado pelo cluster, o desempenho esperado para cada nó do cluster do Bigtable é:

Tipo de armazenamento Leituras   Gravações Verificações
SSD 10.000 linhas por segundo a 6 ms ou 10.000 linhas por segundo a 6 ms 220 MB/s
HDD 500 linhas por segundo a 200 ms ou 10.000 linhas por segundo a 50 ms 180 MB/s

As estimativas mostradas na lista são baseadas em linhas com 1 KB de dados. Além disso, elas refletem uma carga de trabalho somente leitura ou somente gravação. O desempenho de uma carga de trabalho mista de leituras e gravações pode variar.

Os números relativos ao desempenho são uma referência, não uma regra. O desempenho por nó pode variar com base na carga de trabalho e no tamanho de valor típico de uma solicitação ou resposta. Para mais informações, consulte Noções básicas sobre o desempenho do Bigtable.

Projeto de esquema do Bigtable

Projetar um esquema do Bigtable não é como criar um esquema para um banco de dados relacional. Antes de projetar seu esquema, analise os conceitos definidos em Como criar seu esquema.

Você também precisa manter o esquema abaixo dos limites de tamanho recomendados. Como diretriz, mantenha linhas únicas abaixo de 100 MB e valores únicos abaixo de 10 MB. Talvez você encontre cenários em que seja preciso armazenar grandes valores. Isso pode impactar o desempenho, porque a extração de grandes valores requer tempo e memória. Avalie esses cenários caso a caso.

Autenticação e autorização

Antes de projetar o controle de acesso para o Bigtable, analise os processos atuais de autenticação e autorização do HBase.

O Bigtable usa os mecanismos padrão de autenticação do Google Cloud e o gerenciamento de identidade e acesso para fornecer controle de acesso. Assim, você converte sua autorização atual no HBase para o IAM. É possível mapear os grupos atuais do Hadoop que fornecem mecanismos de controle de acesso para o HBase para diferentes contas de serviço.

O Bigtable permite controlar o acesso nos níveis de projeto, instância e tabela. Para mais informações, consulte Controle de acesso.

Como migrar o HBase para o Bigtable

Para migrar seus dados do HBase para o Bigtable, exporte-os como uma série de arquivos sequenciais do Hadoop. Este é um formato de arquivo usado pelo HBase e constituído de pares de chave-valor binários.

Para migrar a tabela do HBase para o Bigtable, siga estas etapas:

  1. Colete detalhes do HBase.
  2. Exporte tabelas do HBase para arquivos de sequência.
  3. Transfira os arquivos sequenciais para o Cloud Storage.
  4. Importe os arquivos sequenciais para o Bigtable usando o Dataflow.
  5. Valide a transferência.

Planejar a migração: coletar detalhes do HBase

Para se preparar para a migração, reúna as seguintes informações do cluster atual do HBase, porque você precisará delas para criar a tabela de destino.

  • Lista de tabelas.
  • contagens de linhas
  • Contagens de células
  • Detalhes do grupo de colunas, incluindo tempo de vida e número máximo de versões.

Para coletar facilmente esses detalhes em uma tabela de origem, use o seguinte script, que deixa o resultado no HDFS:

#!/usr/bin/env bash
# Table Name is the Source HBase Table Name
TABLENAME="$1"
# Export Directory will be located on HDFS
EXPORTDIR="$2"
hadoop fs -mkdir -p ${EXPORTDIR}
hbase shell << EOQ
describe ${TABLENAME}
EOQ | hadoop fs -put - ${EXPORTDIR}/${TABLENAME}-schema.json
hbase shell << EOQ
get_splits ${TABLENAME}
EOQ | hadoop fs -put - ${EXPORTDIR}/${TABLENAME}-splits.txt

Exportar a tabela do HBase para o Cloud Storage

Quando você souber as noções básicas das tabelas do HBase a serem migradas, exporte a tabela para arquivos de sequência e mova-a para o Cloud Storage. Antes de realizar ações para migrar dados on-line, execute as etapas a seguir para garantir que o cluster atenda aos pré-requisitos para acessar o Google Cloud:

  • Instalar o conector do Cloud Storage

    Se você quiser migrar dados on-line usando distcp, instale e configure o conector do Cloud Storage. Primeiro, identifique o sistema de arquivos HDFS de gerenciamento dos dados que você quer migrar. Em seguida, determine qual nó cliente no cluster do Hadoop tem acesso a esse sistema de arquivos. Por fim, instale o conector no nó cliente. Para ver os detalhes das etapas de instalação, consulte Como instalar o conector do Cloud Storage.

  • Instale o Cloud SDK

    Para migrar dados com distcp ou gsutil, instale o SDK do Cloud no nó do cliente de cluster do Hadoop em que a migração será iniciada. Para ver os detalhes das etapas de instalação, consulte a documentação do SDK do Cloud.

Exportar a tabela HBase para o HDFS

Em seguida, exporte a tabela do HBase que você quer migrar para algum lugar no cluster do Hadoop. Vamos supor que o nome da tabela HBase seja [MY_NEW_TABLE]. O diretório de destino está no seu diretório de usuários no HDFS. Exporte a tabela HBase como arquivos sequenciais usando os seguintes comandos:

TABLENAME="my-new-table"
EXPORTDIR=/usr/[USERNAME]/hbase-${TABLENAME}-export
hadoop fs -mkdir -p ${EXPORTDIR}
MAXVERSIONS=2147483647
cd ${HBASE_HOME}
bin/hbase org.apache.hadoop.hbase.mapreduce.Export my-new-table \
    /user/hbase-${TABLENAME} \
    -export ${MAXVERSIONS}
bin/hbase org.apache.hadoop.hbase.mapreduce.Export \
    -Dmapred.output.compress=true \
    -Dmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec \
    -DRAW_SCAN=true \
    -Dhbase.client.scanner.caching=100 \
    -Dmapred.map.tasks.speculative.execution=false \
    -Dmapred.reduce.tasks.speculative.execution=false \
    ${TABLENAME} ${EXPORTDIR} ${MAXVERSIONS}

Migrar os arquivos sequenciais do HDFS para o Cloud Storage

O próximo passo é transferir os arquivos de sequência para um bucket do Cloud Storage. Dependendo do tamanho dos dados, do número de arquivos, da origem dos dados e da largura de banda disponível, é possível escolher a opção apropriada para mover arquivos sequenciais para o Cloud Storage: Transfer Appliance, distcp, gsutil ou o Serviço de transferência do Cloud Storage.

Usar o Transfer Appliance

Use o Transfer Appliance para migrar os dados quando:

  • você quiser controlar a largura de banda de saída com uma programação;
  • o tamanho dos dados for maior que 20 TB.

Com essa opção, você não precisa comprar ou provisionar uma rede extra com o Google. O tempo de transferência total, ou seja, tempo de envio do dispositivo, reidratação etc. é de cerca de 100 Mbps.

Para mover dados com o Transfer Appliance, copie os arquivos de sequência para ele e envie o dispositivo de volta ao Google. O Google carrega os dados no Google Cloud. Para mais informações, consulte esta documentação do Transfer Appliance.

Usar o distcp

Use o distcp para migrar seus dados quando:

  • a largura de banda disponível para migração for maior que 100 Mbps;
  • o conector do Cloud Storage e o SDK do Cloud puderem ser instalados no ambiente Hadoop de origem;
  • o gerenciamento de um novo job do Hadoop para executar a migração de dados for aceitável;
  • o tamanho dos dados for menor que 20 TB.

Para mover dados com distcp, use o nó do cliente de cluster do Hadoop configurado com o conector do Cloud Storage para enviar um job do MapReduce e copiar os arquivos sequenciais para o Cloud Storage:

hadoop distcp hdfs://[NAMENODE]:[NAMENODE_PORT]/[SOURCE_DIRECTORY] \
gs://[BUCKET]/DESTINATION_DIRECTORY]

Usar a gsutil

Use o gsutil para migrar seus dados quando:

  • a largura de banda disponível para migração for maior que 100 Mbps;
  • o SDK do Cloud puder ser instalado no ambiente Hadoop de origem;
  • o gerenciamento de um novo job do Hadoop para executar a migração de dados não for aceitável;
  • o tamanho dos dados for menor que 10 TB.

Para mover dados com gsutil, use seu nó cliente de cluster do Hadoop para iniciar a migração de dados:

TABLENAME="my-new-table"
EXPORTDIR=/usr/[USERNAME]/hbase-${TABLENAME}-export
gsutil -m cp -r  ${EXPORTDIR} gs://[BUCKET]

Usar o Storage Transfer Service

Use o Storage Transfer Service para migrar os dados quando:

  • sua fonte de dados for um bucket do Amazon S3, um local HTTP/HTTPS ou um bucket do Cloud Storage;
  • o tamanho dos dados for menor que 10 TB.

Há três opções no Storage Transfer Service que facilitam as transferências de dados e a sincronização entre origens e coletores de dados. Por exemplo, é possível executar as seguintes ações:

  • Programar operações de transferência única ou operações de transferência recorrentes.
  • Excluir objetos existentes no bucket de destino caso eles não tenham um objeto correspondente na origem.
  • Apagar os objetos da origem depois de transferi-los.
  • Agendar a sincronização periódica da origem dos dados com o coletor usando filtros avançados, com base nas datas de criação dos arquivos, em filtros de nome de arquivo e nas horas do dia em que você prefere importar dados.

Para mais informações, consulte esta documentação do Storage Transfer Service.

Criar a tabela de destino

A próxima etapa é criar a tabela de destino no Bigtable.

Primeiro, use a ferramenta de linha de comando gcloud para instalar a ferramenta cliente do Bigtable cbt.

gcloud components update
gcloud components install cbt

Em seguida, crie uma tabela no Bigtable com os grupos de colunas apropriados do seu esforço de descoberta anterior.

Use as divisões atuais e divida previamente a tabela de destino à medida que você a cria. Isso vai melhorar o desempenho da carga em massa.

Por exemplo, se as divisões atuais forem:

'15861', '29374', '38173', '180922', '203294', '335846', '641111', '746477', '807307', '871053', '931689', '1729462', '1952670', '4356485', '4943705', '5968738', '6917370', '8993145', '10624362', '11309714', '12056747', '12772074', '14370672', '16583264', '18835454', '21194008', '22021148', '23702800', '25532516', '55555555'

Em seguida, configure um projeto padrão e uma instância do Bigtable para a ferramenta cbt para sua conta de usuário desta forma:

$ cat > ${HOME}/.cbtrc << EOF
project = [YOUR-GCP-PROJECT]
instance = [BIGTABLE-INSTANCE-NAME]
EOF

Crie estas divisões na tabela de destino:

cbt -instance my-instance createtable my-new-table \
splits=15861,29374,38173,180922,203294,335846,641111,746477,807307,871053,931689,\
1729462,1952670,4356485,4943705,5968738,6917370,8993145,10624362,11309714,\
12056747,12772074,14370672,16583264,18835454,21194008,22021148,23702800,\
5532516,55555555

Crie grupos de colunas na tabela de destino que correspondam aos grupos que você descobriu anteriormente. Por exemplo, se você descobriu que há duas famílias de colunas, cf1 e cf2, crie o grupo de colunas cf1 no Bigtable assim:

cbt createfamily my-new-table cf1

Crie o grupo de colunas cf2 assim:

cbt createfamily my-new-table cf2

Depois de criar os grupos de colunas, é importante atualizar a política de coleta de lixo de cada grupo, incluindo a idade máxima e o número máximo de versões para os valores. É necessário fazer isso mesmo que você tenha usado as configurações padrão do HBase para sua tabela do HBase, porque as ferramentas nativas do Bigtable usam uma configuração padrão diferente do HBase.

cbt setgcpolicy [TABLE] [FAMILY] ( maxage=[D]| maxversions=[N] )

Importar os dados do HBase para o Bigtable usando o Dataflow

Há duas maneiras de importar dados para o Bigtable. Consulte Como importar arquivos sequenciais nos documentos do Bigtable para mais detalhes.

Preste atenção nas seguintes dicas:

  • Para melhorar o desempenho do carregamento de dados, defina maxNumWorkers. Esse valor ajuda a garantir que o job de importação tenha potência de computação suficiente para ser concluído em um tempo razoável, mas não a ponto de sobrecarregar o cluster do Bigtable.

  • Durante a importação, monitore o uso da CPU do cluster Bigtable. A seção uso da CPU do documento de monitoramento do Bigtable fornece mais informações sobre esse tópico. Se a utilização da CPU no cluster do Bigtable for muito alta, talvez seja necessário adicionar mais nós. O benefício de desempenho dos nós extras pode levar até 20 minutos para ser recebido.

Para mais informações sobre o monitoramento da instância do Bigtable, consulte Como monitorar uma instância do Bigtable.

Verificar os dados importados no Bigtable

Para validar os dados importados, use algumas verificações diferentes:

  • Verificação da correspondência da contagem de linhas. O job do Dataflow vai informar a contagem total de linhas. Esse valor precisa corresponder à contagem de linhas da tabela HBase de origem.
  • Verificação pontual com consultas a linhas específicas. É possível selecionar um conjunto específico de chaves de linha da tabela de origem e consultá-las na tabela de destino para verificar se correspondem:
cbt lookup [destination-table] [rowkey1]
cbt lookup [destination-table] [rowkey2]

A seguir