Por que meu trabalho no AWS Glue falha com nós perdidos quando migro um conjunto de dados grande do Amazon RDS para o Amazon S3?

4 minuto de leitura
0

Estou migrando um grande conjunto de dados do Amazon Relational Database Service (Amazon RDS) ou de um banco de dados JDBC local para o Amazon Simple Storage Service (Amazon S3) usando o AWS Glue. Meu trabalho de ETL é executado por um longo tempo e depois falha com nós perdidos.

Descrição breve

O AWS Glue usa uma única conexão para ler todo o conjunto de dados. Se você estiver migrando uma tabela JDBC grande, o trabalho de ETL poderá ser executado por um longo período sem sinais de progresso no lado do AWS Glue. Em seguida, o trabalho pode eventualmente falhar devido a problemas de espaço em disco (nós perdidos). Para resolver esse problema, leia a tabela JDBC em paralelo. Se o trabalho ainda falhar com nós perdidos, use uma expressão SQL como um predicado de push-down.

Resolução

Use um ou mais dos métodos a seguir para resolver erros de nós perdidos em conjuntos de dados JDBC.

Ler a tabela JDBC em paralelo

Se a tabela não tiver colunas numéricas (INT ou BIGINT), use a opção hashfield para particionar os dados. Defina hashfield como o nome de uma coluna na tabela JDBC. Para obter melhores resultados, escolha uma coluna com uma distribuição uniforme de valores.

Se a tabela tiver colunas numéricas, defina as opções hashpartitions e hashexpression na tabela ou ao criar o DynamicFrame:

  • hashpartitions: define o número de tarefas que o AWS Glue cria para ler os dados
  • hashexpression: divide linhas uniformemente entre tarefas

Veja a seguir um exemplo de como definir hashpartitions e hashexpression ao criar um DynamicFrame com uma conexão JDBC. Em connection_option, substitua o URL do JDBC, o nome do usuário, a senha, o nome da tabela e o nome da coluna.

connection_option= {"url": "jdbc:mysql://mysql–instance1.123456789012.us-east-1.rds.amazonaws.com:3306/database", "user": "your_user_name", "password": "your_password","dbtable": "your_table","hashexpression":"column_name","hashpartitions":"10"}

datasource0 = glueContext.create_dynamic_frame.from_options('mysql',connection_options=connection_option,transformation_ctx = "datasource0")

Aqui está um exemplo de como definir hashpartitions e hashexpression ao criar um DynamicFrame a partir do catálogo do AWS Glue:

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "your_database", table_name = "your_table",additional_options={"hashexpression":"column_name","hashpartitions":"10"}, transformation_ctx = "datasource0")

Observação: definir valores maiores para hashpartitions pode reduzir a performance da sua tabela. Isso porque cada tarefa lê a tabela inteira e, em seguida, retorna um conjunto de linhas para o executor.

Para mais informações, consulte Fazer a leitura de tabelas JDBC em paralelo.

Usar uma expressão SQL como um predicado de push-down

Observação: a expressão SQL a seguir não funciona como um predicado de push-down para bancos de dados Oracle. No entanto, essa expressão funciona como um predicado de push down para todos os outros bancos de dados com suporte nativo pelo AWS Glue (Amazon Aurora, MariaDB, Microsoft SQL Server, MySQL e PostgreSQL).

Se a tabela contiver bilhões de logs e tebibytes (TiB) de dados, o trabalho poderá levar muito tempo para ser concluído ou falhar com nós perdidos, mesmo depois de você definir hashpartitions e hashexpression. Para resolver esses problemas, use uma expressão SQL semelhante à seguinte com a opção hashexpression:

column_name > 1000 AND column_name < 2000 AND column_name

A expressão SQL atua como um predicado de push-down e força o trabalho para ler um conjunto de linhas por execução de tarefa, em vez de ler todos os dados de uma vez. A declaração completa é semelhante à seguinte:

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "sampledb", table_name = "test_table",additional_options={"hashexpression":"column_name > 1000 AND column_name < 2000 AND column_name","hashpartitions":"10"}, transformation_ctx = "datasource0")

Observação: certifique-se de desativar marcadores de trabalho para as execuções iniciais de tarefas com essa configuração. Quando você executa um trabalho com um marcador de trabalho, o AWS Glue registra o valor máximo da coluna. Quando você executar o trabalho novamente, o AWS Glue processará somente as linhas que tiverem valores maiores que o do marcador anterior. Você pode ativar marcadores de trabalho durante a última execução do trabalho, conforme necessário.


Informações relacionadas

Por que minha tarefa do AWS Glue falha com o erro "Exit status: -100. Diagnóstico: Contêiner lançado em um nó *lost*"?

Definir conexões no Catálogo de Dados do AWS Glue

AWS OFICIAL
AWS OFICIALAtualizada há 2 anos