Executando tarefas em paralelo

Saiba como executar trabalhos em IBM Cloud® Code Engine com eficiência operacional.

Processar com eficiência muitos arquivos usando o processamento de tarefas

Suponha que você tenha muitos arquivos armazenados em um depósito do IBM Cloud Object Storage e que deseje usar o processamento em lote no Code Engine. O objetivo é ler arquivos de um depósito, manipular os arquivos e armazená-los em um depósito diferente do Object Storage da maneira mais eficiente possível Vamos supor que você tenha 2000 arquivos no depósito de entrada a cada dia Todos os arquivos têm nome de arquivo diferente e os nomes de arquivo começam com um caractere alfabético (A-Z, a-z).

Conforme você planeja uma solução para esse cenário, primeiro você pensa em uma solução baseada em evento. Nesse caso, para cada arquivo gravado no depósito de entrada do Object Storage, um evento é criado e um aplicativo Code Engine é chamado. Usando eventos, um único arquivo pode acionar processamento individual, que pode ser ineficiente para muitos arquivos.

A execução de uma tarefa em lote pode ser uma abordagem melhor? Sim, pode! Vamos ver porque as tarefas em lote são mais adequadas para manipular vários arquivos juntos.

  1. Determine uma abordagem para dividir o conjunto de arquivos em fluxos paralelos Vamos dividir os arquivos com base no primeiro caractere do nome do arquivo. Com essa abordagem, é possível ter 26 fluxos, com cada fluxo responsável por arquivos que começa com um caractere específico. É possível identificar um fluxo específico lendo a variável de ambiente JOB_INDEX injetada automaticamente de uma instância da tarefa em execução. Consulte Variáveis de ambiente injetadas automaticamente para tarefas. Para este exemplo, é possível configurar suas instâncias de tarefa especificando o número de instâncias como 26 ou os índices de matriz como 0-25..

    Cada instância da tarefa em execução recebe um índice de 0 a 25. Em seu código, use o padrão a seguir para distribuir os dados de entrada para as instâncias da tarefa

    • instância da tarefa com JOB_INDEX=0 funciona em arquivos que começam com A ou a
    • instância da tarefa com JOB_INDEX=1 funciona em arquivos que começam com B ou b
    • instância da tarefa com JOB_INDEX=2 funciona em arquivos que iniciam com C ou c
    • [D ... y]
    • instância da tarefa com JOB_INDEX=25 funciona em arquivos que começam com Z ou z

    Como cada fluxo está processando diversos arquivos, defina o comprimento de fila de um fluxo como o número de arquivos que são processados pelo fluxo único

  2. Em Code Engine, crie a tarefa e sua configuração.

    • Especifique os índices de matriz de tarefas como 0-25, que representa os 26 fluxos paralelos
    • Especifique os recursos de CPU e de memória para a sua tarefa ou assuma os padrões Cada índice de tarefa obtém os mesmos recursos de CPU e de memória que você especifica para a tarefa; por exemplo, 1 vCPU e 4 GB de memória..
  3. Execute o seu trabalho No console do Code Engine, é possível visualizar o número de índices de tarefas que estão pendentes, em execução e concluídos. A tarefa termina quando o último índice da tarefa conclui sua execução

Processar um subconjunto de dados e atribuir dinamicamente o trabalho a instâncias de execução de trabalho paralelas

Suponha que você não deseja que seja limitado a um número específico de instâncias paralelas

No cenário anterior, 26 fluxos paralelos foram definidos e as execuções de tarefas enviadas foram executadas nos 26 fluxos paralelos definidos.

No entanto, suponha que você não deseja ser limitado a um número específico de instâncias paralelas e que deseja executar uma tarefa que designa dinamicamente fluxos de trabalho a uma instância de execução de tarefa específica Nesse caso, é possível usar as variáveis de ambiente JOB_INDEX e JOB_ARRAY_SIZE para derivar um valor que determina qual fluxo de trabalho é processado. Essas variáveis de ambiente são injetadas automaticamente para as tarefas

  • A variável de ambiente JOB_INDEX é o valor do índice de uma instância de execução de tarefa específica..
  • A variável de ambiente JOB_ARRAY_SIZE especifica o número de instâncias de tarefas a serem executadas em paralelo. Esse valor é especificado diretamente como o tamanho da matriz de execução da tarefa ou calculado contando os índices de matriz especificados.

Por exemplo, digamos que você tenha configurado um tamanho de matriz de 10 para que cada instância de execução da tarefa funcione em 10% dos dados gerais (10 instâncias de execução da tarefa executadas em paralelo). Com essa definição de configuração, a variável de ambiente JOB_INDEX determina em qual das 10% partes de dados são trabalhadas e o valor calculado para JOB_ARRAY_SIZE é 10.

No entanto, suponha que você deseje executar novamente 3 das 10 instâncias iniciais de execução da tarefa porque elas falharam anteriormente Os outros 70% dos dados foram processados com sucesso Você deseja especificar os 3 índices com falha específicos ao reenviar a execução da tarefa.. Suponha que você deseja executar novamente os índices 3, 7 e 9

Para essa nova execução da tarefa, digamos que você atualize apenas os índices de matriz; por exemplo, "3, 7, 9" Como o valor da variável de ambiente JOB_ARRAY_SIZE é calculado automaticamente quando os índices de matriz são especificados em vez do tamanho da matriz, o valor de JOB_ARRAY_SIZE agora é 3 em vez de 10, pois 3 índices de matriz foram especificados.

Em vez disso, para certificar-se de que sua ação de execução de tarefa envie (ou reenvie) processa os chunks corretos de dados para os índices especificados 3, 7 e 9, é possível substituir o valor calculado automaticamente da variável de ambiente JOB_ARRAY_SIZE usando a opção --array-size-var-override na CLI ou especificando um valor customizado no campo de entrada JOB_ARRAY_SIZE no console.

Ao definir o valor de substituição do tamanho da matriz personalizada como 10, as instâncias de execução de trabalho calculam corretamente o tamanho do bloco como 10% e as instâncias de execução de trabalho reenviadas processam os dados que você deseja (índices 3, 7 e 9). É possível usar essa opção para impingir um valor de tamanho de matriz constante para cenários de nova execução de tarefa, em que apenas algumas instâncias de tarefa são enviadas ou reenviadas....

Depois de implementar essa abordagem de execução de tarefa, é possível aumentar ou diminuir dinamicamente o número de execuções de tarefas paralelas

Em contraste com a abordagem de designação de uso da variável de ambiente JOB_INDEX para definir o relacionamento do fluxo de serviço de execução da tarefa, esse método de substituição da variável de ambiente JOB_ARRAY_SIZE para designar dinamicamente fluxos de serviço é mais flexível e permite adaptar uma execução de tarefa específica para atender às suas necessidades.

Benefícios da execução de tarefas em lote paralelas

Essa abordagem de implementação de tarefas em lote paralelas oferece benefícios

  • Inicialização reduzida-Como um índice de tarefa processa arquivos com caracteres iniciais semelhantes, apenas uma inicialização ou configuração de conexão é necessária por índice de tarefa. Essa abordagem economiza recursos e custos quando comparada à inicialização individual por arquivo. Com a solução de tarefa paralela, há 26 inicializações em vez de 2000.

  • Uso eficiente de recursos-Ao dividir a tarefa em fluxos de execução paralelos mais longos, essa solução usa os recursos disponíveis de forma mais eficiente, enquanto a velocidade do processamento é maximizada

Considerações ao planejar tarefas em lote paralelas

Considere os seguintes pontos ao planejar soluções de tarefa em lote paralelas.

  • Balanceando índices de tarefas paralelas e comprimento da fila-É essencial encontrar um bom equilíbrio entre o número de fluxos (índices de tarefas paralelas) e o comprimento da fila. Poucos índices de tarefa não podem usar totalmente os recursos disponíveis, enquanto muitos índices podem aumentar o processo de inicialização e aumentar a carga nos serviços de nuvem, como Object Storage. Esse efeito pode resultar em limites de taxa quando você chama outros serviços de nuvem

  • Tempo de processamento de tarefa semelhante-Quando você planeja sua solução, considere que cada índice de tarefa leva aproximadamente o mesmo tempo para concluir sua tarefa Evite cenários em que um índice de tarefa leva muito mais tempo do que outros, já que o tempo de processamento pode causar ineficiências no uso de recursos e aumentar o tempo de processamento da tarefa

  • Uso de várias tarefas-para o cenário anterior, uma abordagem diferente é usar várias tarefas. Essas diversas tarefas não dependem de índices de matriz configurados Em vez disso, considere criar 2 tarefas em lote, uma para arquivos que começam com A - Z e outra para arquivos que começam com a - z. Sem quaisquer mudanças em seu código, é possível acionar essas duas tarefas em paralelo ou sequencialmente, com base em seus requisitos de processamento e disponibilidade de recurso...

  • Mecanismo de acionamento de tarefa-É possível escolher acionar a tarefa com uma assinatura cron em intervalos específicos ou com um aplicativo acionador que monitora o depósito do Object Storage para novos arquivos e inicia o processamento em lote conforme necessário. Dependendo de seu cenário, é possível otimizar o uso do Code Engine para eficiência de custo versus tempo de resposta para a rapidez com que os arquivos são processados após serem gravados no depósito.