Migre tabelas de um lago de dados HDFS

Este documento mostra como migrar as tabelas do data lake do Apache Hadoop Distributed File System (HDFS) para o Google Cloud.

Pode usar o conetor de migração do data lake do HDFS no Serviço de transferência de dados do BigQuery para migrar as suas tabelas do Hive e Iceberg de várias distribuições do Hadoop, tanto em ambientes nas instalações como na nuvem, para o Google Cloud.

Com o conetor do lago de dados HDFS, pode registar as tabelas do lago de dados HDFS no Dataproc Metastore e no BigLake metastore enquanto usa o Cloud Storage como armazenamento subjacente para os seus ficheiros.

O diagrama seguinte apresenta uma vista geral do processo de migração de tabelas do cluster Hadoop.

Vista geral da migração de tabelas do lago de dados do Hive para o BigQuery.

Limitações

As transferências de data lakes do HDFS estão sujeitas às seguintes limitações:

  • Para migrar tabelas Iceberg, tem de registar as tabelas no metastore do BigLake para permitir o acesso de escrita para motores de código aberto (como o Spark ou o Flink) e permitir o acesso de leitura para o BigQuery.
  • Para migrar tabelas do Hive, tem de registar as tabelas no Dataproc Metastore para permitir o acesso de escrita para motores de código aberto e o acesso de leitura para o BigQuery.
  • Tem de usar a ferramenta de linha de comandos bq para migrar uma tabela de data lake do HDFS para o BigQuery.

Antes de começar

Antes de agendar uma transferência do data lake do HDFS, tem de fazer o seguinte:

Crie um contentor do Cloud Storage para ficheiros migrados

Crie um contentor do Cloud Storage que vai ser o destino dos ficheiros do lago de dados migrados. Este contentor é referido neste documento como MIGRATION_BUCKET.

Gere um ficheiro de metadados para o Apache Hive

Execute a ferramenta dwh-migration-dumper para extrair metadados para o Apache Hive. A ferramenta gera um ficheiro denominado hive-dumper-output.zip num contentor do Cloud Storage, referido neste documento como DUMPER_BUCKET.

Ativar APIs

Ative as seguintes APIs no seu Google Cloud projeto:

  • API da Transferência de dados
  • API Storage Transfer

É criado um agente de serviço quando ativa a API Data Transfer.

Configure autorizações

  1. Crie uma conta de serviço e atribua-lhe a função de administrador do BigQuery (roles/bigquery.admin). Esta conta de serviço é usada para criar a configuração de transferência.
  2. É criado um agente de serviço (P4SA) quando ativa a API Data Transfer. Conceda-lhe as seguintes funções:
    • roles/metastore.metadataOwner
    • roles/storagetransfer.admin
    • roles/serviceusage.serviceUsageConsumer
    • roles/storage.objectViewer
      • Se estiver a migrar metadados para tabelas Iceberg do BigLake, conceda-lhe as funções roles/storage.objectAdmin e roles/bigquery.admin em vez de roles/storage.objectViewer.
  3. Conceda à função do agente do serviço roles/iam.serviceAccountTokenCreator com o seguinte comando:

    gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-bigquerydatatransfer.iam.gserviceaccount.com --role roles/iam.serviceAccountTokenCreator

Configure o Storage Transfer Agent

Para configurar o agente de transferência de armazenamento necessário para uma transferência do lago de dados do HDFS, faça o seguinte:

  1. Configure as autorizações para executar o agente de transferência de armazenamento no seu cluster Hadoop.
  2. Instale o Docker em máquinas de agentes no local.
  3. Crie um conjunto de agentes do serviço de transferência de armazenamento no seu projeto Google Cloud .
  4. Instale agentes nas suas máquinas de agentes no local.

Agende uma transferência de lago de dados do HDFS

Para agendar uma transferência do lago de dados do HDFS, introduza o comando bq mk e forneça a flag de criação de transferência --transfer_config:

  bq mk --transfer_config
  --data_source=hadoop
  --display_name='TRANSFER_NAME'
  --service_account_name='SERVICE_ACCOUNT'
  --project_id='PROJECT_ID'
  --location='REGION'
  --params='{"table_name_patterns":"LIST_OF_TABLES",
    "agent_pool_name":"AGENT_POOL_NAME",
    "table_metadata_path":"gs://DUMPER_BUCKET/hive-dumper-output.zip",
    "target_gcs_file_path":"gs://MIGRATION_BUCKET",
    "destination_dataproc_metastore":"DATAPROC_METASTORE",
    "destination_bigquery_dataset":"BIGLAKE_METASTORE",
    "translation_output_gcs_path":"gs://TRANSLATION_OUTPUT_BUCKET/metadata/config/default_database/"
    }'

Substitua o seguinte:

  • TRANSFER_NAME: o nome a apresentar da configuração de transferência. O nome da transferência pode ser qualquer valor que lhe permita identificar a transferência se precisar de a modificar mais tarde.
  • SERVICE_ACCOUNT: o nome da conta de serviço usado para autenticar a sua transferência. A conta de serviço deve ser propriedade da mesma conta de gestor que foi project_idusada para criar a transferência e deve ter todas as autorizações necessárias.
  • PROJECT_ID: o ID do seu Google Cloud projeto. Se o --project_id não for fornecido para especificar um projeto em particular, é usado o projeto predefinido.
  • REGION: localização desta configuração de transferência.
  • LIST_OF_TABLES: uma lista de entidades a transferir. Use uma especificação de nomenclatura hierárquica: database.table. Este campo suporta a expressão regular RE2 para especificar tabelas. Por exemplo:
    • db1..*: especifica todas as tabelas na base de dados
    • db1.table1;db2.table2: uma lista de tabelas
  • AGENT_POOL_NAME: o nome do conjunto de agentes usado para criar agentes.
  • DUMPER_BUCKET: o contentor do Cloud Storage que contém o ficheiro hive-dumper-output.zip.
  • MIGRATION_BUCKET: caminho do GCS de destino para o qual todos os ficheiros subjacentes vão ser carregados.

  • Os metadados podem ser migrados para o Dataproc Metastore ou o metastore do BigLake com os dados subjacentes armazenados no Cloud Storage. Pode especificar o destino através de um dos seguintes parâmetros:

    • Para transferir metadados para o Dataproc Metastore, use o parâmetro destination_dataproc_metastore e especifique o URL para o seu metastore em DATAPROC_METASTORE.
    • Em alternativa, para transferir metadados para o metastore do BigLake, use o parâmetro destination_bigquery_dataset e especifique o conjunto de dados do BigQuery em BIGLAKE_METASTORE.
  • TRANSLATION_OUTPUT_BUCKET: (Opcional) Especifique um contentor do Cloud Storage para o resultado da tradução. Para mais informações, consulte o artigo Usar o resultado da tradução.

Execute este comando para criar a configuração de transferência e iniciar a transferência do lago de dados do HDFS. As transferências são agendadas para serem executadas a cada 24 horas por predefinição, mas podem ser configuradas com opções de agendamento de transferências.

Quando a transferência estiver concluída, as suas tabelas no cluster Hadoop são migradas para o MIGRATION_BUCKET.

Opções de carregamento de dados

As secções seguintes fornecem mais informações sobre como pode configurar as suas transferências do data lake do HDFS.

Transferências incrementais

Quando uma configuração de transferência é configurada com um agendamento recorrente, todas as transferências subsequentes atualizam a tabela no Google Cloud com as atualizações mais recentes feitas à tabela de origem. Por exemplo, todas as operações de inserção, eliminação ou atualização com alterações ao esquema são refletidas em Google Cloud com cada transferência.

Opções de agendamento de transferências

Por predefinição, as transferências são agendadas para serem executadas a cada 24 horas. Para configurar a frequência com que as transferências são executadas, adicione a flag --schedule à configuração de transferência e especifique uma programação de transferência com a sintaxe schedule. As transferências do data lake do HDFS têm de ter um mínimo de 24 horas entre execuções de transferências.

Para transferências únicas, pode adicionar a flag end_time à configuração de transferência para executar a transferência apenas uma vez.

Configure a saída da tradução

Pode configurar um caminho do Cloud Storage e uma base de dados únicos para cada tabela migrada. Para tal, siga os passos seguintes para gerar um ficheiro YAML de mapeamento de tabelas que pode usar na configuração de transferência.

  1. Crie um ficheiro YAML de configuração (com o sufixo config.yaml) na pasta DUMPER_BUCKET que contenha o seguinte:

        type: object_rewriter
        relation:
        - match:
            relationRegex: ".*"
          external:
            location_expression: "'gs://MIGRATION_BUCKET/' + table.schema + '/' + table.name"
    • Substitua MIGRATION_BUCKET pelo nome do contentor do Cloud Storage que é o destino dos ficheiros de tabelas migrados. O campo location_expression é uma expressão do idioma de expressão comum (IEC).
  2. Crie outro ficheiro YAML de configuração (com o sufixo config.yaml) no diretório DUMPER_BUCKET que contenha o seguinte:

        type: experimental_object_rewriter
        relation:
          - match:
              schema: SOURCE_DATABASE
            outputName:
              database: null
              schema: TARGET_DATABASE
    • Substitua SOURCE_DATABASE e TARGET_DATABASE pelo nome da base de dados de origem e da base de dados do Dataproc Metastore ou do conjunto de dados do BigQuery, consoante o metastore escolhido. Certifique-se de que o conjunto de dados do BigQuery existe se estiver a configurar o metastore do BigLake.

    Para mais informações sobre este YAML de configuração, consulte as diretrizes para criar um ficheiro YAML de configuração.

  3. Gere o ficheiro YAML de mapeamento de tabelas através do seguinte comando:

    curl -d '{
      "tasks": {
          "string": {
            "type": "HiveQL2BigQuery_Translation",
            "translation_details": {
                "target_base_uri": "TRANSLATION_OUTPUT_BUCKET",
                "source_target_mapping": {
                  "source_spec": {
                      "base_uri": "DUMPER_BUCKET"
                  }
                },
                "target_types": ["metadata"]
            }
          }
      }
      }' \
      -H "Content-Type:application/json" \
      -H "Authorization: Bearer TOKEN" -X POST https://bigquerymigration.googleapis.com/v2alpha/projects/PROJECT_ID/locations/LOCATION/workflows

    Substitua o seguinte:

    • TRANSLATION_OUTPUT_BUCKET: (Opcional) Especifique um contentor do Cloud Storage para o resultado da tradução. Para mais informações, consulte o artigo Usar o resultado da tradução.
    • DUMPER_BUCKET: o URI base do contentor do Cloud Storage que contém o ficheiro YAML de hive-dumper-output.zip e configuração.
    • TOKEN: o token OAuth. Pode gerar este ficheiro na linha de comandos com o comando gcloud auth print-access-token.
    • PROJECT_ID: o projeto para processar a tradução.
    • LOCATION: a localização onde o trabalho é processado. Por exemplo, eu ou us.
  4. Monitorize o estado desta tarefa. Quando estiver concluído, é gerado um ficheiro de mapeamento para cada tabela na base de dados num caminho predefinido em TRANSLATION_OUTPUT_BUCKET.

Monitorize as transferências do lago de dados do HDFS

Depois de agendar uma transferência de data lake do HDFS, pode monitorizar a tarefa de transferência com comandos da ferramenta de linhas de comando bq. Para obter informações sobre como monitorizar as tarefas de transferência, consulte o artigo Veja as suas transferências.

Monitorize o estado da migração de tabelas

Também pode executar a ferramenta dwh-dts-status para monitorizar o estado de todas as tabelas transferidas numa configuração de transferência ou numa base de dados específica. Também pode usar a ferramenta dwh-dts-status para listar todas as configurações de transferência num projeto.

Antes de começar

Antes de poder usar a ferramenta dwh-dts-status, faça o seguinte:

  1. Obtenha a ferramenta dwh-dts-status transferindo o pacote dwh-migration-tool do dwh-migration-toolsrepositório do GitHub.

  2. Autentique a sua conta para Google Cloud com o seguinte comando:

    gcloud auth application-default login
    

    Para mais informações, consulte o artigo Como funcionam as Credenciais padrão da aplicação.

  3. Verifique se o utilizador tem a função bigquery.admin e logging.viewer. Para mais informações sobre as funções de IAM, consulte o artigo Referência de controlo de acesso.

Apresenta todas as configurações de transferência num projeto

Para apresentar uma lista de todas as configurações de transferência num projeto, use o seguinte comando:

  ./dwh-dts-status --list-transfer-configs --project-id=[PROJECT_ID] --location=[LOCATION]

Substitua o seguinte:

  • PROJECT_ID : o ID do projeto Google Cloud que está a executar as transferências.
  • LOCATION : a localização onde a configuração de transferência foi criada.

Este comando gera uma tabela com uma lista de nomes e IDs de configuração de transferência.

Veja os estados de todas as tabelas numa configuração

Para ver o estado de todas as tabelas incluídas numa configuração de transferência, use o seguinte comando:

  ./dwh-dts-status --list-status-for-config --project-id=[PROJECT_ID] --config-id=[CONFIG_ID] --location=[LOCATION]

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto Google Cloud que está a executar as transferências.
  • LOCATION: a localização onde a configuração de transferência foi criada.
  • CONFIG_ID: o ID da configuração de transferência especificada.

Este comando gera uma tabela com uma lista de tabelas e o respetivo estado de transferência na configuração de transferência especificada. O estado da transferência pode ter um dos seguintes valores: PENDING, RUNNING, SUCCEEDED, FAILED, CANCELLED.

Veja os estados de todas as tabelas numa base de dados

Para ver o estado de todas as tabelas transferidas de uma base de dados específica, use o seguinte comando:

  ./dwh-dts-status --list-status-for-database --project-id=[PROJECT_ID] --database=[DATABASE]

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto Google Cloud que está a executar as transferências.
  • DATABASE:o nome da base de dados especificada.

Este comando gera uma tabela com uma lista de tabelas e o respetivo estado de transferência na base de dados especificada. O estado da transferência pode ter um dos seguintes valores: PENDING, RUNNING, SUCCEEDED, FAILED, CANCELLED.