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 metastore do BigLake 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.

Ficheiros obrigatórios

Tem de ter os seguintes ficheiros de migração num contentor do Cloud Storage antes de poder agendar uma transferência de lago de dados do HDFS:

  • O ficheiro de metadados extraído (hive-dumper-output.zip)
  • O ficheiro YAML de configuração da tradução (*.config.yaml)
  • Os ficheiros YAML de mapeamento de tabelas

As secções seguintes descrevem como criar estes ficheiros.

hive-dumper-output.zip

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.

Ficheiro YAML de configuração da tradução

Crie um YAML de configuração de tradução com um nome que contenha o sufixo .config.yaml, por exemplo, translation.config.yaml, e carregue-o para o mesmo contentor que contém hive-dumper-output.zip. Configure o YAML de configuração de tradução para mapear caminhos HDFS para pastas geridas do Cloud Storage, semelhante ao seguinte exemplo:

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 seus ficheiros migrados.

O campo location_expression é uma expressão do idioma de expressão comum (IEC).

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

Gere tabelas que mapeiam ficheiros YAML

Para gerar um ficheiro YAML de mapeamento de tabelas, execute o 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: o URI base para um contentor do Cloud Storage que contém o ficheiro YAML de mapeamento de tabelas. Por exemplo, gs://output_bucket/tables/.
  • 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.

Quando executada, a API do serviço de tradução devolve um WORKFLOW_ID e inicia uma tarefa assíncrona em segundo plano. Pode monitorizar o estado desta tarefa através do seguinte comando:

  curl \
  -H "Content-Type:application/json" \
  -H "Authorization:Bearer TOKEN" -X GET https://bigquerymigration.googleapis.com/v2alpha/projects/PROJECT_ID/locations/LOCATION/workflows/WORKFLOW_ID

Quando estiver concluído, os ficheiros YAML de mapeamento de tabelas são criados. Os ficheiros YAML de mapeamento de tabelas podem consistir em vários ficheiros de mapeamento, um para cada tabela, armazenados na pasta do Cloud Storage.

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",
    "destination_dataproc_metastore":"DATAPROC_METASTORE",
    "translation_output_gcs_path":"gs://TRANSLATION_OUTPUT_BUCKET/metadata/config/default_database/",
    "table_metadata_path":"gs://DUMPER_BUCKET/hive-dumper-output.zip"}'

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 project_id usada 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.
  • DATAPROC_METASTORE: o Dataproc Metastore de destino para o destino de OSS gerido. Em alternativa, para usar o BigLake Metastore, pode omitir este campo da configuração de transferência. Para mais informações sobre a utilização do BigLake Metastore para migrar metadados, consulte o artigo Migração de metadados.

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.

Migração de metadados

Os metadados podem ser migrados para o Dataproc Metastore ou o BigLake Metastore com os dados subjacentes armazenados no Cloud Storage.

Para transferir metadados para o Dataproc Metastore, especifique o URL para o seu metastore no campo destination_dataproc_metastore.

Para transferir metadados para o metastore do BigLake, não precisa de especificar um campo destination_dataproc_metastore na configuração da transferência. O sistema determina automaticamente o conjunto de dados de destino do BigQuery a partir do campo targetName nos ficheiros de mapeamento YAML gerados. O campo targetName está formatado como um identificador de duas partes, por exemplo, bigquery_dataset_name.bigquery_table_name. Por predefinição, a nomenclatura é alinhada com o seu sistema de origem. Tem de garantir que o conjunto de dados do BigQuery com o nome do esquema de origem existe. Caso contrário, crie-o antes de executar a transferência.

Para usar outro conjunto de dados do BigQuery, tem de fornecer um ficheiro YAML de configuração adicional (com o sufixo config.yaml) no DUMPER_BUCKET que contenha um conjunto de regras de reescrita de objetos e, em seguida, gerar os mapeamentos de tradução. O exemplo seguinte é um conjunto de regras que mapeia a base de dados de origem denominada my_hive_db para um conjunto de dados do BigQuery denominado my_bq_dataset:

relation:
  - match:
      schema: my_hive_db
    outputName:
      database: null
      schema: my_bq_dataset

O parâmetro schema tem de corresponder ao nome do conjunto de dados do BigQuery e o parâmetro relation tem de corresponder ao nome da tabela. Para mais informações, consulte o artigo Mapeamento de nomes de saída.

O parâmetro database também tem de ser definido como null.

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 agenda 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.

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.