Atualizações de versão in-loco para o Apache Flink - Managed Service for Apache Flink

Anteriormente, o Amazon Managed Service for Apache Flink era conhecido como Amazon Kinesis Data Analytics for Apache Flink.

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Atualizações de versão in-loco para o Apache Flink

Com atualizações de versão in-loco para o Apache Flink, você mantém a rastreabilidade do aplicativo em relação a um único ARN em todas as versões do Apache Flink. Isso inclui instantâneos, registros, métricas, tags, configurações do Flink, aumentos no limite de recursos, VPCs e muito mais. Você pode realizar atualizações de versão in-loco para o Apache Flink para atualizar aplicativos existentes para uma nova versão do Flink no Amazon Managed Service para Apache Flink. Para realizar essa tarefa, você pode usar o AWS CLI AWS CloudFormation,, AWS SDK ou o. AWS Management Console

nota

Você não pode usar atualizações de versão in-loco para o Apache Flink com o Amazon Managed Service para Apache Flink Studio.

Atualizando aplicativos usando atualizações de versão in-loco para o Apache Flink

Antes de começar, recomendamos que você assista a este vídeo: Atualizações de versão in-loco.

Para realizar atualizações de versão in-loco para o Apache Flink, você pode usar o AWS CLI, AWS CloudFormation, AWS SDK ou o. AWS Management Console Você pode usar esse recurso com qualquer aplicativo existente que você usa com o Managed Service for Apache Flink em um estado READY ouRUNNING. Ele usa a UpdateApplication API para adicionar a capacidade de alterar o tempo de execução do Flink.

Antes da atualização: Atualizando seu aplicativo Apache Flink

Ao escrever seus aplicativos Flink, você os agrupa com suas dependências em um JAR de aplicativo e carrega o JAR no seu bucket do Amazon S3. A partir daí, o Amazon Managed Service para Apache Flink executa o trabalho no novo tempo de execução do Flink que você selecionou. Talvez seja necessário atualizar seus aplicativos para obter compatibilidade com o tempo de execução do Flink para o qual você deseja fazer o upgrade. Pode haver inconsistências entre as versões do Flink que fazem com que a atualização da versão falhe. Geralmente, isso ocorre com conectores para fontes (entrada) ou destinos (coletores, saída) e dependências do Scala. O Flink 1.15 e versões posteriores no Managed Service for Apache Flink são independentes de Scala, e seu JAR deve conter a versão do Scala que você planeja usar.

Para atualizar seu aplicativo

  1. Leia os conselhos da comunidade Flink sobre como atualizar aplicativos com o estado. Consulte Atualização de aplicativos e versões do Flink.

  2. Leia a lista de problemas e limitações conhecidos. Consulte Precauções e problemas conhecidos.

  3. Atualize suas dependências e teste seus aplicativos localmente. Essas dependências normalmente são:

    1. O tempo de execução e a API do Flink.

    2. Conectores recomendados para o novo tempo de execução do Flink. Você pode encontrá-los nas versões Release para o tempo de execução específico para o qual deseja atualizar.

    3. Scala — O Apache Flink é independente de Scala, começando com e incluindo o Flink 1.15. Você deve incluir as dependências do Scala que deseja usar no JAR do seu aplicativo.

  4. Crie um novo aplicativo JAR no arquivo zip e faça o upload para o Amazon S3. Recomendamos que você use um nome diferente do arquivo JAR/ZIP anterior. Se precisar reverter, você usará essas informações.

  5. Se você estiver executando aplicativos com estado, é altamente recomendável que você tire um instantâneo do seu aplicativo atual. Isso permite reverter de forma contínua se você encontrar problemas durante ou após a atualização.

Atualizando seu aplicativo para uma nova versão do Apache Flink

Você pode atualizar seu aplicativo Flink usando a UpdateApplicationação.

Você pode chamar a UpdateApplication API de várias maneiras:

  • Use o fluxo de trabalho de configuração existente no AWS Management Console.

    • Acesse a página do seu aplicativo no AWS Management Console.

    • Selecione Configurar.

    • Selecione o novo tempo de execução e o snapshot a partir do qual você deseja começar, também conhecido como configuração de restauração. Use a configuração mais recente como configuração de restauração para iniciar o aplicativo a partir do instantâneo mais recente. Aponte para o novo aplicativo atualizado JAR/Zip no Amazon S3.

  • Use a ação AWS CLI de atualização do aplicativo.

  • Uso AWS CloudFormation (CFN).

    • Atualize o RuntimeEnvironmentcampo. Anteriormente, AWS CloudFormation excluía o aplicativo e criava um novo, fazendo com que seus instantâneos e outros históricos do aplicativo fossem perdidos. Agora AWS CloudFormation atualiza seu RuntimeEnvironment local e não exclui seu aplicativo.

  • Use o AWS SDK.

    • Consulte a documentação do SDK para a linguagem de programação de sua escolha. Consulte UpdateApplication.

Você pode realizar a atualização enquanto o aplicativo estiver no RUNNING estado ou enquanto o aplicativo estiver parado no READY estado. O Amazon Managed Service para Apache Flink valida para verificar a compatibilidade entre a versão original do tempo de execução e a versão do tempo de execução de destino. Essa verificação de compatibilidade é executada quando você executa UpdateApplicationenquanto estiver no RUNNING estado ou na próxima, StartApplicationse você atualizar enquanto estiver no READY estado.

O exemplo a seguir mostra a atualização de um aplicativo no RUNNING estado chamado UpgradeTest Flink 1.18 no Leste dos EUA (Norte da Virgínia) usando AWS CLI e iniciando o aplicativo atualizado a partir do snapshot mais recente.

aws --region us-east-1 kinesisanalyticsv2 update-application \ --application-name UpgradeTest --runtime-environment-update "FLINK-1_18" \ --application-configuration-update '{"ApplicationCodeConfigurationUpdate": '\ '{"CodeContentUpdate": {"S3ContentLocationUpdate": '\ '{"FileKeyUpdate": "flink_1_18_app.jar"}}}}' \ --run-configuration-update '{"ApplicationRestoreConfiguration": '\ '{"ApplicationRestoreType": "RESTORE_FROM_LATEST_SNAPSHOT"}}' \ --current-application-version-id ${current_application_version}
  • Se você habilitou os instantâneos do serviço e deseja continuar o aplicativo a partir do snapshot mais recente, o Amazon Managed Service para Apache Flink verifica se o tempo de execução do RUNNING aplicativo atual é compatível com o tempo de execução de destino selecionado.

  • Se você especificou um snapshot a partir do qual continuar o tempo de execução de destino, o Amazon Managed Service para Apache Flink verifica se o tempo de execução de destino é compatível com o snapshot especificado. Se a verificação de compatibilidade falhar, sua solicitação de atualização será rejeitada e seu aplicativo permanecerá inalterado no RUNNING estado.

  • Se você optar por iniciar seu aplicativo sem um snapshot, o Amazon Managed Service para Apache Flink não executará nenhuma verificação de compatibilidade.

  • Se o aplicativo atualizado falhar ou ficar preso em um UPDATING estado transitivo, siga as instruções na Reversão seção para retornar ao estado íntegro.

Fluxo de processo para execução de aplicativos de estado

O diagrama a seguir representa o fluxo de trabalho recomendado para atualizar o aplicativo durante a execução. Presumimos que o aplicativo tenha estado e que você tenha ativado os instantâneos. Para esse fluxo de trabalho, na atualização, você restaura o aplicativo a partir do snapshot mais recente que foi automaticamente obtido pelo Amazon Managed Service para o Apache Flink antes da atualização.

O exemplo a seguir mostra a atualização de um aplicativo no READY estado chamado UpgradeTest Flink 1.18 no Leste dos EUA (Norte da Virgínia) usando o. AWS CLI Não há um instantâneo especificado para iniciar o aplicativo porque o aplicativo não está em execução. Você pode especificar um instantâneo ao emitir a solicitação inicial do aplicativo.

aws --region us-east-1 kinesisanalyticsv2 update-application \ --application-name UpgradeTest --runtime-environment-update "FLINK-1_18" \ --application-configuration-update '{"ApplicationCodeConfigurationUpdate": '\ '{"CodeContentUpdate": {"S3ContentLocationUpdate": '\ '{"FileKeyUpdate": "flink_1_18_app.jar"}}}}' \ --current-application-version-id ${current_application_version}
  • Você pode atualizar o tempo de execução de seus aplicativos em READY estado para qualquer versão do Flink. O Amazon Managed Service para Apache Flink não executa nenhuma verificação até você iniciar seu aplicativo.

  • O Amazon Managed Service para Apache Flink só executa verificações de compatibilidade com o snapshot que você selecionou para iniciar o aplicativo. Essas são verificações básicas de compatibilidade de acordo com a Tabela de Compatibilidade do Flink. Eles verificam apenas a versão do Flink com a qual o instantâneo foi tirado e a versão do Flink que você está almejando. Se o tempo de execução do Flink do snapshot selecionado for incompatível com o novo tempo de execução do aplicativo, a solicitação inicial poderá ser rejeitada.

Fluxo de processo para aplicativos de estado pronto

O diagrama a seguir representa o fluxo de trabalho recomendado para atualizar o aplicativo enquanto estiver pronto. Presumimos que o aplicativo tenha estado e que você tenha ativado os instantâneos. Para esse fluxo de trabalho, na atualização, você restaura o aplicativo a partir do snapshot mais recente que foi automaticamente obtido pelo Amazon Managed Service para o Apache Flink quando o aplicativo foi interrompido.

Reversão

Se você tiver problemas com seu aplicativo ou encontrar inconsistências no código do aplicativo entre as versões do Flink, poderá reverter usando o AWS CLI, AWS CloudFormation, AWS SDK ou o. AWS Management Console Os exemplos a seguir mostram como é a reversão em diferentes cenários de falha.

A atualização do tempo de execução foi bem-sucedida, o aplicativo está funcionandoRUNNING, mas o trabalho está falhando e está sendo reiniciado continuamente

Suponha que você esteja tentando atualizar um aplicativo com estado chamado TestApplication de Flink 1.15 para Flink 1.18 no Leste dos EUA (Norte da Virgínia). No entanto, o aplicativo Flink 1.18 atualizado está falhando ao iniciar ou está sendo reiniciado constantemente, mesmo que o aplicativo esteja em estado. RUNNING Esse é um cenário de falha comum. Para evitar mais tempo de inatividade, recomendamos que você reverta seu aplicativo imediatamente para a versão anterior em execução (Flink 1.15) e diagnostique o problema posteriormente.

Para reverter o aplicativo para a versão em execução anterior, use o AWS CLI comando rollback-application ou a ação da API. RollbackApplication Essa ação da API reverte as alterações que você fez que resultaram na versão mais recente. Em seguida, ele reinicia seu aplicativo usando o último snapshot bem-sucedido.

É altamente recomendável que você tire um instantâneo do seu aplicativo existente antes de tentar fazer o upgrade. Isso ajudará a evitar a perda de dados ou a necessidade de reprocessar dados.

Nesse cenário de falha, não AWS CloudFormation reverterá o aplicativo para você. Você deve atualizar o CloudFormation modelo para apontar para o tempo de execução anterior e para o código anterior para CloudFormation forçar a atualização do aplicativo. Caso contrário, CloudFormation presume que seu aplicativo tenha sido atualizado ao fazer a transição para o RUNNING estado.

Revertendo um aplicativo que está preso UPDATING

Se seu aplicativo ficar preso no AUTOSCALING estado UPDATING or após uma tentativa de atualização, o Amazon Managed Service para Apache Flink oferece o AWS CLI comando rollback-applications, ou a ação de RollbackApplicationsAPI que pode reverter o aplicativo para a versão anterior ao travamento ou estado bloqueado. UPDATING AUTOSCALING Essa API reverte as alterações que você fez que causaram a paralisação UPDATING ou o estado AUTOSCALING transitivo do aplicativo.

Melhores práticas e recomendações gerais

  • Teste o novo trabalho/tempo de execução sem estado em um ambiente que não seja de produção antes de tentar uma atualização de produção.

  • Considere primeiro testar a atualização com estado com um aplicativo que não seja de produção.

  • Certifique-se de que seu novo gráfico de tarefas tenha um estado compatível com o instantâneo que você usará para iniciar seu aplicativo atualizado.

    • Certifique-se de que os tipos armazenados nos estados do operador permaneçam os mesmos. Se o tipo mudou, o Apache Flink não pode restaurar o estado do operador.

    • Certifique-se de que os IDs de operador que você definiu usando o uid método permaneçam os mesmos. O Apache Flink tem uma forte recomendação para atribuir IDs exclusivos aos operadores. Para obter mais informações, consulte Atribuição de IDs de operadores na documentação do Apache Flink.

      Se você não atribuir IDs aos seus operadores, o Flink os gera automaticamente. Nesse caso, eles podem depender da estrutura do programa e, se alterados, podem causar problemas de compatibilidade. O Flink usa IDs de operador para combinar o estado no instantâneo com o operador. A alteração das IDs do operador faz com que o aplicativo não seja iniciado ou que o estado armazenado no instantâneo seja descartado e o novo operador seja iniciado sem estado.

    • Não altere a chave usada para armazenar o estado da chave.

    • Não modifique o tipo de entrada de operadores com estado, como janela ou junção. Isso altera implicitamente o tipo do estado interno do operador, causando uma incompatibilidade de estado.

Precauções e problemas conhecidos

Não são permitidas alterações de configuração do Flink 1.19 e versões posteriores

  • Se você estiver atualizando seu tempo de execução do Flink 1.18 ou anterior para o Flink 1.19 ou posterior, as alterações na configuração da tarefa do Flink usando o código de tarefa do Flink não são mais permitidas. Como resultado, a inscrição não conseguirá enviar o trabalho. Um registro de erros indica quais configurações não permitidas foram modificadas em tempo de execução. Para ter mais informações, consulte FlinkRuntimeException: “Não foram detectadas alterações de configuração permitidas”.

Limitações conhecidas da compatibilidade de estados

  • Se você estiver usando a API Table, o Apache Flink não garante a compatibilidade de estados entre as versões do Flink. Para obter mais informações, consulte Stateful Upgrades and Evolution na documentação do Apache Flink.

  • Os estados do Flink 1.6 não são compatíveis com o Flink 1.18. A API rejeita sua solicitação se você tentar atualizar da versão 1.6 para a versão 1.18 e posterior com o estado. Você pode atualizar para 1.8, 1.11, 1.13 e 1.15 e tirar um instantâneo e, em seguida, atualizar para 1.18 e versões posteriores. Para obter mais informações, consulte Atualizando aplicativos e versões do Flink na documentação do Apache Flink.

Problemas conhecidos com o Flink Kinesis Connector

  • Se você estiver usando o Flink 1.11 ou anterior e usando o amazon-kinesis-connector-flink conector para suporte E nhanced-fan-out (EFO), deverá tomar medidas adicionais para uma atualização contínua para o Flink 1.13 ou posterior. Isso ocorre devido à alteração no nome do pacote do conector. Para obter mais informações, consulte amazon-kinesis-connector-flink.

    O amazon-kinesis-connector-flink conector para Flink 1.11 e versões anteriores usa a embalagemsoftware.amazon.kinesis, enquanto o conector Kinesis para Flink 1.13 e versões posteriores usa. org.apache.flink.streaming.connectors.kinesis Use essa ferramenta para apoiar sua migração: amazon-kinesis-connector-flink-state-migrator.

  • Se você estiver usando o Flink 1.13 ou anterior FlinkKinesisProducer e atualizando para o Flink 1.15 ou posterior, para uma atualização com estado, você deve continuar usando o Flink 1.15 ou posterior, FlinkKinesisProducer em vez do mais novo. KinesisStreamsSink No entanto, se você já tiver um uid conjunto personalizado em sua pia, poderá alternar para FlinkKinesisProducer ele KinesisStreamsSink porque não mantém o estado. O Flink o tratará como o mesmo operador porque um personalizado foi uid definido.

Aplicativos Flink escritos em Scala

  • A partir do Flink 1.15, o Apache Flink não inclui o Scala no tempo de execução. Você deve incluir a versão do Scala que deseja usar e outras dependências do Scala em seu código JAR/ZIP ao atualizar para o Flink 1.15 ou posterior. Para obter mais informações, consulte Amazon Managed Service for Apache Flink for Apache Flink versão 1.15.2.

  • Se seu aplicativo usa o Scala e você o está atualizando do Flink 1.11 ou anterior (Scala 2.11) para o Flink 1.13 (Scala 2.12), certifique-se de que seu código use o Scala 2.12. Caso contrário, seu aplicativo Flink 1.13 pode falhar em encontrar classes Scala 2.11 no tempo de execução do Flink 1.13.

Coisas a considerar ao fazer o downgrade do aplicativo Flink

  • O downgrade dos aplicativos Flink é possível, mas limitado aos casos em que o aplicativo estava sendo executado anteriormente com a versão mais antiga do Flink. Para uma atualização com estado, o Managed Service para Apache Flink exigirá o uso de um snapshot tirado com uma versão correspondente ou anterior para o downgrade.

  • Se você estiver atualizando seu tempo de execução do Flink 1.13 ou posterior para o Flink 1.11 ou anterior e se seu aplicativo usar o back-end de HashMap estado, seu aplicativo falhará continuamente.