Configurar backup e replicação para Apache HBase e Apache Phoenix no HDInsight
O Apache HBase suporta várias abordagens para proteção contra perda de dados:
- Copie a
hbase
pasta - Exportar e depois Importar
- Copiar tabelas
- Instantâneos
- Replicação
Nota
O Apache Phoenix armazena seus metadados em tabelas do HBase, para que o backup dos metadados seja feito quando você fizer backup das tabelas do catálogo do sistema HBase.
As seções a seguir descrevem o cenário de uso para cada uma dessas abordagens.
Copie a pasta hbase
Com essa abordagem, você copia todos os dados do HBase, sem poder selecionar um subconjunto de tabelas ou famílias de colunas. As abordagens subsequentes proporcionam um maior controlo.
O HBase no HDInsight usa o armazenamento padrão selecionado ao criar o cluster, blobs de Armazenamento do Azure ou Armazenamento do Azure Data Lake. Em ambos os casos, o HBase armazena seus arquivos de dados e metadados no seguinte caminho:
/hbase
Em uma conta de Armazenamento do Azure', a
hbase
pasta reside na raiz do contêiner de blob:wasbs://<containername>@<accountname>.blob.core.windows.net/hbase
No Armazenamento do Azure Data Lake, a
hbase
pasta reside sob o caminho raiz especificado ao provisionar um cluster. Esse caminho raiz normalmente tem uma pasta, com umaclusters
subpasta com o nome do cluster HDInsight:/clusters/<clusterName>/hbase
Em ambos os casos, a hbase
pasta contém todos os dados que o HBase liberou para o disco, mas pode não conter os dados na memória. Antes de confiar nessa pasta como uma representação precisa dos dados do HBase, você deve desligar o cluster.
Depois de excluir o cluster, você pode deixar os dados no lugar ou copiar os dados para um novo local:
Crie uma nova instância do HDInsight apontando para o local de armazenamento atual. A nova instância é criada com todos os dados existentes.
Copie a
hbase
pasta para um contêiner de blob de Armazenamento do Azure diferente ou local de Armazenamento Data Lake e inicie um novo cluster com esses dados. Para o Armazenamento do Azure, use o AzCopy, e para o Armazenamento do Data Lake use o AdlCopy.
Exportar e depois Importar
No cluster HDInsight de origem, use o utilitário Exportar (incluído no HBase) para exportar dados de uma tabela de origem para o armazenamento anexado padrão. Em seguida, você pode copiar a pasta exportada para o local de armazenamento de destino e executar o utilitário Importar no cluster HDInsight de destino.
Para exportar dados da tabela, primeiro SSH para o nó principal do cluster HDInsight de origem e, em seguida, execute o seguinte hbase
comando:
hbase org.apache.hadoop.hbase.mapreduce.Export "<tableName>" "/<path>/<to>/<export>"
O diretório de exportação ainda não deve existir. O nome da tabela diferencia maiúsculas de minúsculas.
Para importar dados da tabela, SSH para o nó principal do cluster HDInsight de destino e execute o seguinte hbase
comando:
hbase org.apache.hadoop.hbase.mapreduce.Import "<tableName>" "/<path>/<to>/<export>"
A tabela já deve existir.
Especifique o caminho de exportação completo para o armazenamento padrão ou para qualquer uma das opções de armazenamento anexadas. Por exemplo, no Armazenamento do Azure:
wasbs://<containername>@<accountname>.blob.core.windows.net/<path>
No Azure Data Lake Storage Gen2, a sintaxe é:
abfs://<containername>@<accountname>.dfs.core.windows.net/<path>
No Azure Data Lake Storage Gen1, a sintaxe é:
adl://<accountName>.azuredatalakestore.net:443/<path>
Essa abordagem oferece granularidade no nível da tabela. Você também pode especificar um intervalo de datas para as linhas a serem incluídas, o que permite executar o processo incrementalmente. Cada data é em milissegundos desde a época Unix.
hbase org.apache.hadoop.hbase.mapreduce.Export "<tableName>" "/<path>/<to>/<export>" <numberOfVersions> <startTimeInMS> <endTimeInMS>
Tem de especificar o número de versões de cada linha a exportar. Para incluir todas as versões no intervalo de datas, defina <numberOfVersions>
como um valor maior do que o máximo possível de versões de linha, como 100000.
Copiar tabelas
O utilitário CopyTable copia dados de uma tabela de origem, linha por linha, para uma tabela de destino existente com o mesmo esquema da fonte. A tabela de destino pode estar no mesmo cluster ou em um cluster HBase diferente. Os nomes das tabelas diferenciam maiúsculas de minúsculas.
Para usar CopyTable em um cluster, SSH no nó principal do cluster HDInsight de origem e execute este hbase
comando:
hbase org.apache.hadoop.hbase.mapreduce.CopyTable --new.name=<destTableName> <srcTableName>
Para usar CopyTable para copiar para uma tabela em um cluster diferente, adicione o switch com o peer
endereço do cluster de destino:
hbase org.apache.hadoop.hbase.mapreduce.CopyTable --new.name=<destTableName> --peer.adr=<destinationAddress> <srcTableName>
O endereço de destino é composto pelas seguintes três partes:
<destinationAddress> = <ZooKeeperQuorum>:<Port>:<ZnodeParent>
<ZooKeeperQuorum>
é uma lista separada por vírgulas de nomes FQDN de nós do Apache ZooKeeper, por exemplo:<zookeepername1.54o2oqawzlwevlfxgay2500xtg.dx.internal.cloudapp.net,zookeepername2.54o2oqawzlwevlfxgay2500xtg.dx.internal.cloudapp.net,zookeepername3.54o2oqawzlwevlfxgay2500xtg.dx.internal.cloudapp.net><><>
<Port>
no HDInsight o padrão é 2181 e<ZnodeParent>
é/hbase-unsecure
, portanto, o completo<destinationAddress>
seria:<zookeepername1.54o2oqawzlwevlfxgay2500xtg.dx.internal.cloudapp.net,zookeepername2.54o2oqawzlwevlfxgay2500xtg.dx.internal.cloudapp.net,zookeepername3.54o2oqawzlwevlfxgay2500xtg.dx.internal.cloudapp.net><<>>:2181:/hbase-unsecure
Consulte Coletando manualmente a lista de quórum do Apache ZooKeeper neste artigo para obter detalhes sobre como recuperar esses valores para seu cluster HDInsight.
O utilitário CopyTable também suporta parâmetros para especificar o intervalo de tempo de linhas a serem copiadas e para especificar o subconjunto de famílias de colunas em uma tabela a ser copiada. Para ver a lista completa de parâmetros suportados por CopyTable, execute CopyTable sem quaisquer parâmetros:
hbase org.apache.hadoop.hbase.mapreduce.CopyTable
CopyTable verifica todo o conteúdo da tabela de origem que será copiado para a tabela de destino. Isso pode reduzir o desempenho do cluster HBase enquanto o CopyTable é executado.
Nota
Para automatizar a cópia de dados entre tabelas, consulte o hdi_copy_table.sh
script no repositório do Azure HBase Utils no GitHub.
Coletar manualmente a lista de quórum do Apache ZooKeeper
Quando ambos os clusters HDInsight estão na mesma rede virtual, conforme descrito anteriormente, a resolução de nome de host interno é automática. Para usar o CopyTable para clusters HDInsight em duas redes virtuais separadas conectadas por um Gateway VPN, você precisará fornecer os endereços IP do host dos nós do Zookeeper no quórum.
Para adquirir os nomes de host de quorum, execute o seguinte comando curl:
curl -u admin:<password> -X GET -H "X-Requested-By: ambari" "https://<clusterName>.azurehdinsight.net/api/v1/clusters/<clusterName>/configurations?type=hbase-site&tag=TOPOLOGY_RESOLVED" | grep "hbase.zookeeper.quorum"
O comando curl recupera um documento JSON com informações de configuração do HBase e retorna grep
apenas a entrada "hbase.zookeeper.quorum", por exemplo:
"hbase.zookeeper.quorum" : "<zookeepername1>.54o2oqawzlwevlfxgay2500xtg.dx.internal.cloudapp.net,<zookeepername2>.54o2oqawzlwevlfxgay2500xtg.dx.internal.cloudapp.net,<zookeepername3>.54o2oqawzlwevlfxgay2500xtg.dx.internal.cloudapp.net"
O valor de nomes de host de quorum é a cadeia de caracteres inteira à direita dos dois pontos.
Para recuperar os endereços IP desses hosts, use o seguinte comando curl para cada host na lista anterior:
curl -u admin:<password> -X GET -H "X-Requested-By: ambari" "https://<clusterName>.azurehdinsight.net/api/v1/clusters/<clusterName>/hosts/<zookeeperHostFullName>" | grep "ip"
Neste comando curl, é o nome DNS completo de um host ZooKeeper, <zookeeperHostFullName>
como o exemplo <zookeepername1>.54o2oqawzlwevlfxgay2500xtg.dx.internal.cloudapp.net
. A saída do comando contém o endereço IP do host especificado, por exemplo:
100 "ip" : "10.0.0.9",
Depois de coletar os endereços IP de todos os nós do ZooKeeper em seu quórum, reconstrua o endereço de destino:
<destinationAddress> = <Host_1_IP>,<Host_2_IP>,<Host_3_IP>:<Port>:<ZnodeParent>
No nosso exemplo:
<destinationAddress> = 10.0.0.9,10.0.0.8,10.0.0.12:2181:/hbase-unsecure
Instantâneos
Os snapshots permitem que você faça um backup point-in-time dos dados em seu armazenamento de dados do HBase. Os snapshots têm uma sobrecarga mínima e são concluídos em segundos, porque uma operação de snapshot é efetivamente uma operação de metadados que captura os nomes de todos os arquivos armazenados naquele instante. No momento de um instantâneo, nenhum dado real é copiado. Os instantâneos dependem da natureza imutável dos dados armazenados no HDFS, onde atualizações, exclusões e inserções são representadas como novos dados. Você pode restaurar (clonar) um instantâneo no mesmo cluster ou exportar um instantâneo para outro cluster.
Para criar um instantâneo, SSH no nó principal do cluster HBase do HDInsight e inicie o hbase
shell:
hbase shell
Dentro do shell hbase, use o comando snapshot com os nomes da tabela e deste snapshot:
snapshot '<tableName>', '<snapshotName>'
Para restaurar um snapshot por nome dentro do hbase
shell, primeiro desative a tabela, depois restaure o snapshot e reative a tabela:
disable '<tableName>'
restore_snapshot '<snapshotName>'
enable '<tableName>'
Para restaurar um instantâneo para uma nova tabela, use clone_snapshot:
clone_snapshot '<snapshotName>', '<newTableName>'
Para exportar um snapshot para o HDFS para uso por outro cluster, primeiro crie o snapshot conforme descrito anteriormente e, em seguida, use o utilitário ExportSnapshot. Execute este utilitário de dentro da sessão SSH para o nó principal, não dentro do hbase
shell:
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot <snapshotName> -copy-to <hdfsHBaseLocation>
O <hdfsHBaseLocation>
pode ser qualquer um dos locais de armazenamento acessíveis ao cluster de origem e deve apontar para a pasta hbase usada pelo cluster de destino. Por exemplo, se você tiver uma conta secundária de Armazenamento do Azure anexada ao cluster de origem e essa conta fornecer acesso ao contêiner usado pelo armazenamento padrão do cluster de destino, você poderá usar este comando:
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot 'Snapshot1' -copy-to 'wasbs://secondcluster@myaccount.blob.core.windows.net/hbase'
Se você não tiver uma conta secundária do Armazenamento do Azure anexada ao cluster de origem ou se o cluster de origem for um cluster local (ou cluster não HDI), poderá enfrentar problemas de autorização ao tentar acessar a conta de armazenamento do cluster HDI. Para resolver isso, especifique a chave para sua conta de armazenamento como um parâmetro de linha de comando, conforme mostrado no exemplo a seguir. Você pode obter a chave para sua conta de armazenamento no portal do Azure.
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -Dfs.azure.account.key.myaccount.blob.core.windows.net=mykey -snapshot 'Snapshot1' -copy-to 'wasbs://secondcluster@myaccount.blob.core.windows.net/hbase'
Se o cluster de destino for um cluster ADLS Gen 2, altere o comando anterior para ajustar as configurações usadas pelo ADLS Gen 2:
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -Dfs.azure.account.key.<account_name>.dfs.core.windows.net=<key> -Dfs.azure.account.auth.type.<account_name>.dfs.core.windows.net=SharedKey -Dfs.azure.always.use.https.<account_name>.dfs.core.windows.net=false -Dfs.azure.account.keyprovider.<account_name>.dfs.core.windows.net=org.apache.hadoop.fs.azurebfs.services.SimpleKeyProvider -snapshot 'Snapshot1' -copy-to 'abfs://<container>@<account_name>.dfs.core.windows.net/hbase'
Depois que o snapshot for exportado, SSH no nó principal do cluster de destino e restaure o snapshot usando o clone_snapshot
comando conforme descrito anteriormente.
Os instantâneos fornecem um backup completo de uma tabela no momento do snapshot
comando. Os instantâneos não fornecem a capacidade de executar instantâneos incrementais por janelas de tempo, nem de especificar subconjuntos de famílias de colunas a serem incluídos no instantâneo.
Replicação
A replicação do HBase envia automaticamente as transações de um cluster de origem para um cluster de destino, usando um mecanismo assíncrono com sobrecarga mínima no cluster de origem. No HDInsight, você pode configurar a replicação entre clusters onde:
- Os clusters de origem e destino estão na mesma rede virtual.
- Os clusters de origem e destino estão em diferentes redes virtuais conectadas por um gateway VPN, mas ambos os clusters existem na mesma localização geográfica.
- O cluster de origem e os clusters de destino estão em diferentes redes virtuais conectadas por um gateway VPN e cada cluster existe em uma localização geográfica diferente.
As etapas gerais para configurar a replicação são:
- No cluster de origem, crie as tabelas e preencha os dados.
- No cluster de destino, crie tabelas de destino vazias com o esquema da tabela de origem.
- Registre o cluster de destino como um par ao cluster de origem.
- Habilite a replicação nas tabelas de origem desejadas.
- Copie os dados existentes das tabelas de origem para as tabelas de destino.
- A replicação copia automaticamente novas modificações de dados para as tabelas de origem para as tabelas de destino.
Para habilitar a replicação no HDInsight, aplique uma Ação de Script ao cluster HDInsight de origem em execução. Para obter um passo a passo sobre como habilitar a replicação em seu cluster ou experimentar a replicação em clusters de exemplo criados em redes virtuais usando modelos do Azure Resource Manager, consulte Configurar a replicação do Apache HBase. Esse artigo também inclui instruções para habilitar a replicação de metadados do Phoenix.