Estou usando o AWS Glue para migrar um grande conjunto de dados do Amazon Relational Database Service (Amazon RDS) ou de um banco de dados JDBC on-premises para o Amazon Simple Storage Service (Amazon S3). 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ê migrar uma tabela JDBC grande, a tarefa de ETL poderá ser executada por um longo período sem 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
Para resolver erros de nós perdidos em conjuntos de dados JDBC, use um ou mais dos métodos a seguir.
Ler a tabela JDBC em paralelo
Se a tabela não tiver colunas numéricas, como 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 que tenha 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. Para mais informações, consulte Fazer a leitura de tabelas JDBC em paralelo.
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")
Observação: substitua o URL do JDBC, your_user_name, your_password, your_table e column_name pelas suas informações.
Veja a seguir um exemplo de como definir hashpartitions e hashexpression ao criar um DynamicFrame a partir do catálogo de dados 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: se você definir valores maiores para hashpartitions, é possível reduzir o desempenho da sua tabela. Isso porque cada tarefa lê a tabela inteira e, em seguida, retorna um conjunto de linhas para o executor.
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 pushdown para bancos de dados Oracle. Essa expressão funciona como um predicado pushdown para todos os outros bancos de dados que o AWS Glue oferece suporte nativo. Esses bancos de dados incluem Amazon Aurora, MariaDB, Microsoft SQL Server, MySQL e PostgreSQL.
Se a tabela contiver bilhões de registros e tebibytes (TiB) de dados, o trabalho poderá levar muito tempo para ser concluído ou falhar com nós perdidos. Esse atraso ou falha pode ocorrer 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 pushdown. A expressão força o trabalho a ler um conjunto de linhas por trabalho executado, 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: desative os marcadores de tarefas para 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. Ative os favoritos do 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*"?
Conectando-se aos dados