Migrar do repositório HDFS local para o Armazenamento do Azure com o Azure Data Box

Você pode migrar dados de um repositório HDFS local do cluster Hadoop para o Armazenamento do Azure (Armazenamento de Blobs ou Data Lake Storage Gen2) usando um dispositivo Data Box. Você pode escolher entre um Data Box Disk, um Data Box de 80 TB ou um Data Box Heavy de 770 TB.

Este artigo mostra como realizar as tarefas abaixo:

  • Preparar-se para migrar os dados
  • Copiar os dados para um dispositivo Data Box Disk, Data Box ou Data Box Heavy
  • Enviar o dispositivo de volta à Microsoft
  • Aplicar permissões de acesso a arquivos e diretórios (somente Data Lake Storage Gen2)

Pré-requisitos

Você precisa dos itens abaixo para realizar a migração.

Se você estiver pronto, vamos começar.

Copiar os dados para um dispositivo Data Box

Se os dados couberem em um só dispositivo Data Box, você copiará os dados para ele.

Se o tamanho dos dados exceder a capacidade do dispositivo Data Box, use o procedimento opcional para dividir os dados em mais de um dispositivo Data Box e depois realize esta etapa.

Para copiar os dados do repositório HDFS local para um dispositivo Data Box, você definirá algumas coisas e usará a ferramenta DistCp.

Siga estas etapas para copiar dados por meio das APIs REST do Armazenamento de blobs/objetos para o dispositivo Data Box. A interface da API REST fará com que o dispositivo apareça como um repositório HDFS para o cluster.

  1. Antes de copiar os dados por REST, identifique os primitivos de segurança e de conexão para a conexão com a interface REST no Data Box ou Data Box Heavy. Entre na IU da Web local do Data Box e abra a página Conectar e copiar. Na conta de armazenamento do Azure do seu dispositivo, em Configurações de acesso, localize e selecione REST.

  2. Na caixa de diálogo Acessar a conta de armazenamento e carregar os dados, copie o ponto de extremidade do serviço Blob e a chave de conta de armazenamento. No ponto de extremidade do serviço Blob, omita o https:// e a barra final.

    Neste caso, o ponto de extremidade é: https://mystorageaccount.blob.mydataboxno.microsoftdatabox.com/. A parte do host do URI que você usa é: mystorageaccount.blob.mydataboxno.microsoftdatabox.com. Veja o exemplo em Conectar a REST por HTTP.

  3. Adicione o ponto de extremidade e o endereço IP do nó do Data Box ou do Data Box Heavy a /etc/hosts em cada nó.

    10.128.5.42  mystorageaccount.blob.mydataboxno.microsoftdatabox.com
    

    Se você usar outro mecanismo para o DNS, verifique se o ponto de extremidade do Data Box pode ser resolvido.

  4. Defina a variável azjars do shell como o local dos arquivos jar hadoop-azure e azure-storage. Esses arquivos estão no diretório de instalação do Hadoop.

    Para determinar se eles existem, use o seguinte comando: ls -l $<hadoop_install_dir>/share/hadoop/tools/lib/ | grep azure. Substitua o espaço reservado <hadoop_install_dir> pelo caminho do diretório em que você instalou o Hadoop. Use caminhos totalmente qualificados.

    Exemplos:

    azjars=$hadoop_install_dir/share/hadoop/tools/lib/hadoop-azure-2.6.0-cdh5.14.0.jar azjars=$azjars,$hadoop_install_dir/share/hadoop/tools/lib/microsoft-windowsazure-storage-sdk-0.6.0.jar

  5. Crie o contêiner de armazenamento que você deseja usar para a cópia de dados. Você também deve especificar um diretório de destino como parte desse comando. Pode ser um diretório de destino fictício por enquanto.

    hadoop fs -libjars $azjars \
    -D fs.AbstractFileSystem.wasb.Impl=org.apache.hadoop.fs.azure.Wasb \
    -D fs.azure.account.key.<blob_service_endpoint>=<account_key> \
    -mkdir -p  wasb://<container_name>@<blob_service_endpoint>/<destination_directory>
    
    • Substitua o espaço reservado <blob_service_endpoint> pelo nome do ponto de extremidade do serviço Blob.

    • Substitua o espaço reservado <account_key> pela chave de acesso da sua conta.

    • Substitua o espaço reservado <container-name> pelo nome do contêiner.

    • Substitua o espaço reservado <destination_directory> pelo nome do diretório no qual você deseja copiar os dados.

  6. Execute um comando de lista para confirmar a criação do contêiner e do diretório.

    hadoop fs -libjars $azjars \
    -D fs.AbstractFileSystem.wasb.Impl=org.apache.hadoop.fs.azure.Wasb \
    -D fs.azure.account.key.<blob_service_endpoint>=<account_key> \
    -ls -R  wasb://<container_name>@<blob_service_endpoint>/
    
    • Substitua o espaço reservado <blob_service_endpoint> pelo nome do ponto de extremidade do serviço Blob.

    • Substitua o espaço reservado <account_key> pela chave de acesso da sua conta.

    • Substitua o espaço reservado <container-name> pelo nome do contêiner.

  7. Copie os dados do HDFS do Hadoop para o armazenamento de blobs do Data Box, no contêiner que você criou. Se o diretório de destino da cópia não for encontrado, o comando o criará automaticamente.

    hadoop distcp \
    -libjars $azjars \
    -D fs.AbstractFileSystem.wasb.Impl=org.apache.hadoop.fs.azure.Wasb \
    -D fs.azure.account.key.<blob_service_endpoint<>=<account_key> \
    -filters <exclusion_filelist_file> \
    [-f filelist_file | /<source_directory> \
           wasb://<container_name>@<blob_service_endpoint>/<destination_directory>
    
    • Substitua o espaço reservado <blob_service_endpoint> pelo nome do ponto de extremidade do serviço Blob.

    • Substitua o espaço reservado <account_key> pela chave de acesso da sua conta.

    • Substitua o espaço reservado <container-name> pelo nome do contêiner.

    • Substitua o espaço reservado <exlusion_filelist_file> pelo nome do arquivo que contém a lista de exclusões de arquivo.

    • Substitua o espaço reservado <source_directory> pelo nome do diretório que contém os dados que você quer copiar.

    • Substitua o espaço reservado <destination_directory> pelo nome do diretório no qual você deseja copiar os dados.

    A opção -libjars é usada para disponibilizar o hadoop-azure*.jar e os arquivos dependentes de azure-storage*.jar ao distcp. Talvez isso já ocorra em alguns clusters.

    O exemplo a seguir mostra como usar o comando distcp para copiar dados.

     hadoop distcp \
    -libjars $azjars \
    -D fs.AbstractFileSystem.wasb.Impl=org.apache.hadoop.fs.azure.Wasb \
    -D fs.azure.account.key.mystorageaccount.blob.mydataboxno.microsoftdatabox.com=myaccountkey \
    -filter ./exclusions.lst -f /tmp/copylist1 -m 4 \
    /data/testfiles \
    wasb://hdfscontainer@mystorageaccount.blob.mydataboxno.microsoftdatabox.com/data
    

    Para melhorar a velocidade de cópia:

    • Altere o número de mapeadores. (O número padrão de mapeadores é 20. O exemplo acima usa m = 4 mapeadores.)

    • Experimente -D fs.azure.concurrentRequestCount.out=<thread_number>. Substitua <thread_number> pelo número de threads por mapeador. O produto do número de mapeadores e o número de threads por mapeador, m*<thread_number>, não deve exceder 32.

    • Execute vários distcp em paralelo.

    • Lembre-se de que arquivos grandes têm desempenho melhor do que arquivos pequenos.

    • Caso você tenha arquivos maiores que 200 GB, recomendamos alterar o tamanho do bloco para 100 MB com os seguintes parâmetros:

    hadoop distcp \ 
    -libjars $azjars \ 
    -Dfs.azure.write.request.size= 104857600 \ 
    -Dfs.AbstractFileSystem.wasb.Impl=org.apache.hadoop.fs.azure.Wasb \ 
    -Dfs.azure.account.key.<blob_service_endpoint<>=<account_key> \ 
    -strategy dynamic \ 
    -Dmapreduce.map.memory.mb=16384 \ 
    -Dfs.azure.concurrentRequestCount.out=8 \ 
    -Dmapreduce.map.java.opts=-Xmx8196m \ 
    -m 4 \ 
    -update \ 
    /data/bigfile wasb://hadoop@mystorageaccount.blob.core.windows.net/bigfile
    

Enviar o Data Box à Microsoft

Siga estas etapas para preparar e enviar o dispositivo Data Box à Microsoft.

  1. Primeiro, prepare-se para enviar o Data Box ou o Data Box Heavy.

  2. Após a preparação do dispositivo, baixe os arquivos de BOM. Você usa esses arquivos de manifesto ou de BOM posteriormente para verificar os dados carregados no Azure.

  3. Desligue o dispositivo e remova os cabos.

  4. Agende uma retirada com a UPS.

  5. Quando a Microsoft recebe o dispositivo, ele é conectado à rede do data center, e os dados são carregados na conta de armazenamento que você especificou quando fez o pedido do dispositivo. Confirme que todos os dados foram carregados no Azure usando os arquivos de BOM.

Aplicar permissões de acesso a arquivos e diretórios (somente Data Lake Storage Gen2)

Você já tem os dados em sua conta do Armazenamento do Azure. Agora, você aplica permissões de acesso aos arquivos e aos diretórios.

Observação

Esta etapa é necessária apenas para quem usa o Azure Data Lake Storage Gen2 como armazenamento de dados. Se você usa apenas uma conta de armazenamento de blobs sem namespace hierárquico como armazenamento de dados, ignore esta seção.

Criar uma entidade de serviço para a conta do Azure Data Lake Storage Gen2 habilitada

Para criar uma entidade de serviço, confira Como usar o portal para criar um aplicativo do Microsoft Entra e uma entidade de serviço que possam acessar recursos.

  • Ao executar as etapas da seção Atribuir o aplicativo a uma função do artigo, atribua a função Colaborador dos Dados do Storage Blob à entidade de serviço.

  • Ao seguir as etapas da seção Obter valores para se conectar do artigo, salve a ID do aplicativo e o segredo do cliente em um arquivo de texto. Você precisará deles em breve.

Gerar uma lista dos arquivos copiados com as respectivas permissões

No cluster Hadoop local, execute este comando:


sudo -u hdfs ./copy-acls.sh -s /{hdfs_path} > ./filelist.json

O comando gera a lista dos arquivos copiados com as respectivas permissões.

Observação

Dependendo do número de arquivos no HDFS, a execução do comando pode demorar.

Gerar uma lista de identidades e mapeá-las para identidades do Microsoft Entra

  1. Baixe o script copy-acls.py. Confira a seção Baixar scripts auxiliares e configurar o nó de borda para executá-los deste artigo.

  2. Execute este comando para gerar uma lista de identidades exclusivas.

    
    ./copy-acls.py -s ./filelist.json -i ./id_map.json -g
    

    O script gera um arquivo chamado id_map.json, que contém as identidades que você precisa mapear às identidades do ADD.

  3. Abra o arquivo id_map.json em um editor de texto.

  4. Para cada objeto JSON que aparece no arquivo, atualize o atributo target de um nome UPN ou OID (ObjectId) do Microsoft Entra, com a identidade mapeada apropriada. Salve o arquivo quando terminar. Você precisará dele na próxima etapa.

Aplicar permissões a arquivos copiados e aplicar mapeamentos de identidade

Execute este comando para aplicar permissões aos dados que você copiou para a conta do Data Lake Storage Gen2 habilitada:

./copy-acls.py -s ./filelist.json -i ./id_map.json  -A <storage-account-name> -C <container-name> --dest-spn-id <application-id>  --dest-spn-secret <client-secret>
  • Substitua o espaço reservado <storage-account-name> pelo nome da sua conta de armazenamento.

  • Substitua o espaço reservado <container-name> pelo nome do contêiner.

  • Substitua os espaços reservados <application-id> e <client-secret> pela ID do aplicativo e o segredo do cliente que você anotou ao criar a entidade de serviço.

Apêndice: dividir dados em mais de um dispositivo Data Box

Antes de mover os dados para o dispositivo Data Box, você precisa baixar alguns scripts auxiliares, organizar os dados para que caibam no dispositivo e excluir os arquivos desnecessários.

Baixar scripts auxiliares e configurar o nó de borda para executá-los

  1. No nó de borda ou principal do cluster Hadoop local, execute este comando:

    
    git clone https://github.com/jamesbak/databox-adls-loader.git
    cd databox-adls-loader
    

    O comando clona o repositório do GitHub que contém os scripts auxiliares.

  2. Verifique se o pacote jq está instalado no computador local.

    
    sudo apt-get install jq
    
  3. Instale o pacote de Python Requests.

    
    pip install requests
    
  4. Defina as permissões de execução nos scripts necessários.

    
    chmod +x *.py *.sh
    
    

Organizar os dados para que caibam em um dispositivo Data Box

Se o tamanho dos dados exceder o tamanho de um dispositivo Data Box, divida os arquivos em grupos para armazená-los em mais de um dispositivo.

Se os dados não excederem o tamanho de um único dispositivo Data Box, prossiga para a seção seguinte.

  1. Com permissões elevadas, execute o script generate-file-list que você baixou na seção anterior.

    Aqui está uma descrição dos parâmetros de comando:

    sudo -u hdfs ./generate-file-list.py [-h] [-s DATABOX_SIZE] [-b FILELIST_BASENAME]
                     [-f LOG_CONFIG] [-l LOG_FILE]
                     [-v {DEBUG,INFO,WARNING,ERROR}]
                     path
    
    where:
    positional arguments:
    path                  The base HDFS path to process.
    
    optional arguments:
    -h, --help            show this help message and exit
    -s DATABOX_SIZE, --databox-size DATABOX_SIZE
                         The size of each Data Box in bytes.
    -b FILELIST_BASENAME, --filelist-basename FILELIST_BASENAME
                         The base name for the output filelists. Lists will be
                         named basename1, basename2, ... .
    -f LOG_CONFIG, --log-config LOG_CONFIG
                         The name of a configuration file for logging.
    -l LOG_FILE, --log-file LOG_FILE
                         Name of file to have log output written to (default is
                         stdout/stderr)
    -v {DEBUG,INFO,WARNING,ERROR}, --log-level {DEBUG,INFO,WARNING,ERROR}
                         Level of log information to output. Default is 'INFO'.
    
  2. Copie as listas de arquivos geradas para o HDFS, de modo que o trabalho do DistCp possa acessá-las.

    hadoop fs -copyFromLocal {filelist_pattern} /[hdfs directory]
    

Excluir arquivos desnecessários

Você precisa excluir alguns diretórios do trabalho do DistCp. Por exemplo, exclua os diretórios que contêm informações de estado que mantêm o cluster em operação.

No cluster Hadoop local em que você iniciará o trabalho do DistCp, crie um arquivo que especifique a lista dos diretórios a serem excluídos.

Aqui está um exemplo:

.*ranger/audit.*
.*/hbase/data/WALs.*

Próximas etapas

Aprenda como o Data Lake Storage Gen2 funciona com clusters do HDInsight. Para saber mais, consulte Usar o Azure Data Lake Storage Gen2 com clusters Azur HDInsight.