Melhores práticas para funções definidas pelo usuário do Amazon Redshift Lambda


Enquanto trabalhava com Funções Lambda definidas pelo usuário (UDFs) em Redshift da Amazonconhecer as práticas recomendadas pode ajudá-lo a agilizar o desenvolvimento dos respectivos recursos e reduzir gargalos comuns de desempenho e custos desnecessários.

Você se pergunta qual linguagem de programação poderia melhorar o desempenho de sua UDF, de que outra forma você pode usar os benefícios do processamento em lote e quais considerações de gerenciamento de simultaneidade podem ser aplicáveis ​​ao seu caso? Neste submit, respondemos essas e outras perguntas fornecendo uma visão consolidada de práticas para melhorar a eficiência do seu Lambda UDF. Explicamos como escolher uma linguagem de programação, usar bibliotecas existentes de maneira eficaz, minimizar tamanhos de carga útil, gerenciar dados de retorno e processamento em lote. Discutimos considerações de escalabilidade e simultaneidade nos níveis de conta e por função. Por fim, examinamos os benefícios e nuances do uso de serviços externos com suas Lambda UDFs.

Fundo

O Amazon Redshift é um serviço de information warehouse em nuvem rápido e com escala de petabytes que torna simples e econômica a análise de dados usando SQL padrão e ferramentas de enterprise intelligence existentes.

AWS Lambda é um serviço de computação que permite executar código sem provisionar ou gerenciar servidores, oferecendo suporte a uma ampla variedade de linguagens de programação e dimensionando automaticamente seus aplicativos.

As UDFs Lambda do Amazon Redshift permitem executar funções Lambda diretamente do SQL, o que libera recursos como integração de API externa, implantação de código unificado, melhor escalabilidade computacional e separação de custos.

Pré-requisitos

  • Requisitos de configuração da conta AWS
  • Conhecimento básico de criação de função Lambda
  • Acesso ao cluster do Amazon Redshift e permissões UDF.

Práticas recomendadas de otimização de desempenho

O diagrama a seguir contém referências visuais necessárias da descrição das práticas recomendadas.

Melhores práticas para funções definidas pelo usuário do Amazon Redshift Lambda

Use linguagens de programação eficientes

Você pode escolher entre uma ampla variedade de ambientes de tempo de execução e linguagens de programação do Lambda. Essa escolha afeta tanto o desempenho quanto o faturamento. Código com melhor desempenho pode ajudar a reduzir o custo da computação Lambda e melhorar a velocidade da consulta SQL. Consultas SQL mais rápidas também podem ajudar a reduzir custos do Redshift Serverless e potencialmente melhorar o rendimento de clusters provisionados, dependendo de sua carga de trabalho e configuração específicas.

Ao escolher uma linguagem de programação para suas UDFs Lambda, os benchmarks podem ajudar a prever o desempenho e as implicações de custo. A famosa equipe de jogos de benchmarks do Debian fornece insights publicamente disponíveis para diferentes idiomas em seus resultados de micro-benchmark. Por exemplo, seus Python versus Golang a comparação mostra uma melhoria de até 2 ordens de magnitude no tempo de execução e uma redução duas vezes maior no consumo de memória se você pudesse usar Golang em vez de Python. Isso pode refletir positivamente no desempenho do Lambda UDF e nos custos do Lambda para os respectivos cenários.

Use bibliotecas existentes de forma eficiente

Para cada linguagem fornecida pelo Lambda, você pode explorar toda a coleção de bibliotecas para ajudá-lo a implementar melhor as tarefas do ponto de vista da velocidade e do consumo de recursos. Ao fazer a transição para Lambda UDFs, revise esse aspecto com atenção.

Por exemplo, se a sua função Python manipula conjuntos de dados, pode valer a pena considerar o uso do método Pandas biblioteca.

Evite dados desnecessários em cargas úteis

O Lambda limita o tamanho da carga útil de solicitação e resposta a 6MB para invocações síncronas. Considerando isso, o Redshift está se esforçando ao máximo para agrupar os valores de modo que o número de lotes (e, portanto, as chamadas Lambda) seja mínimo, o que reduz a sobrecarga de comunicação. Assim, os dados desnecessários, como aqueles adicionados para uso futuro, mas não imediatamente acionáveis, podem reduzir a eficiência deste esforço.

Lembre-se de retornar o tamanho dos dados

Como, do ponto de vista do Redshift, cada função Lambda é um sistema fechado, é impossível saber qual o tamanho dos dados retornados antes de executar a função. Nesse caso, se a carga retornada for maior que o limite de carga do Lambda, o Redshift terá que tentar novamente com o lote de saída de tamanho menor. Isso continuará até que uma carga útil de retorno adequada seja alcançada. Embora seja o melhor esforço, o processo pode trazer uma sobrecarga notável.

Para evitar essa sobrecarga, você pode usar o conhecimento do seu código Lambda para definir diretamente o tamanho máximo do lote no lado do Redshift usando o comando MAX_BATCH_SIZE cláusula na sua definição do Lambda UDF.

Aproveite os benefícios do processamento de valores em lotes

As chamadas em lote oferecem novas oportunidades de otimização para suas UDFs. Ter um lote de muitos valores passados ​​​​para a função de uma vez permite o uso de várias técnicas de otimização.

Por exemplo, memoização (cache de resultados), quando sua função pode evitar a execução da mesma lógica nos mesmos valores, reduzindo assim o tempo whole de execução. A biblioteca Python padrão ferramentas funcionais fornece cache conveniente e decoradores de cache menos usados ​​recentemente (LRU) implementando exatamente isso.

Escalabilidade e gerenciamento de simultaneidade

Aumente a simultaneidade no nível da conta

O Redshift utiliza controle avançado de congestionamento para fornecer o melhor desempenho em um ambiente altamente competitivo. Lambda fornece uma simultaneidade padrão limite de 1.000 execuções simultâneas por região da AWS para uma conta. No entanto, se este último não for suficiente, você sempre pode solicitar o aumento da cota no nível da conta para simultaneidade Lambda, que pode chegar a dezenas de milhares.

Observe que mesmo com um espaço de simultaneidade restrito, nossa implementação do Lambda UDF fará o melhor esforço para minimizar o congestionamento e equalizar as probabilities de chamadas de função nos clusters Redshift em sua conta.

Restringir simultaneidade de função com simultaneidade reservada

Se você quiser isolar algumas das funções do Lambda em um escopo de simultaneidade restrito, por exemplo, você tem uma equipe de ciência de dados experimentando a geração de incorporação usando UDFs do Lambda e não deseja que elas afetem muito a simultaneidade do Lambda da sua conta, talvez você queira definir uma simultaneidade reservada para suas funções específicas operarem.

Saiba mais sobre simultaneidade reservada no Lambda.

Integração e serviços externos

Chame serviços externos existentes para uma execução perfect

Em alguns casos, pode valer a pena considerar o uso de serviços ou componentes externos existentes em seu aplicativo, em vez de reimplementar você mesmo as mesmas tarefas no código Lambda. Por exemplo, você pode usar o Open Coverage Agent (OPA) para verificação de políticas, um serviço gerenciado Protegrity para proteger seus dados confidenciais, há também uma variedade de serviços que fornecem aceleração de {hardware} para tarefas computacionalmente pesadas.

Observe que alguns serviços têm seu próprio controle de lote com tamanho de lote limitado. Para isso, implementamos uma configuração de contagem de linhas em lote por função MAX_BATCH_ROWS como uma cláusula na definição do Lambda UDF.

Para saber mais sobre a interação de serviços externos usando Lambda UDFs, consulte os seguintes hyperlinks:

Conclusão

As UDFs Lambda fornecem uma maneira de ampliar seus recursos de information warehouse. Ao implementar as práticas recomendadas desta postagem, você pode ajudar a otimizar seus Lambda UDFs para desempenho e eficiência de custos. As principais conclusões desta postagem são:

  • otimização de desempenho, mostrando como escolher linguagens e ferramentas de programação eficientes, minimizar tamanhos de carga útil e aproveitar o processamento em lote para reduzir tempo e custos de execução
  • gerenciamento de escalabilidade, mostrando como definir configurações de simultaneidade apropriadas nos níveis de conta e função para lidar com cargas de trabalho variadas de maneira eficaz
  • eficiência de integração, explicando como se beneficiar de serviços externos para evitar a reinvenção da funcionalidade e, ao mesmo tempo, manter o desempenho perfect.

Para mais informações, visite o Documentação do Redshift e discover os exemplos de integração mencionados nesta postagem.

Sobre o autor

Sergei Konoplev

Sergei Konoplev

Sergei é engenheiro de banco de dados sênior na equipe do Amazon Redshift e está conduzindo uma série de iniciativas, desde operações até observabilidade e ferramentas de IA, incluindo ampliar os limites do Lambda UDF. Fora do trabalho, Sergey pega ondas no Oceano Pacífico e gosta de ler em voz alta (e dublar) para sua filha.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *