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á.
Guia de compatibilidade estadual para atualizações do Flink 2.2
Ao atualizar do Flink 1.x para o Flink 2.2, problemas de compatibilidade de estado podem impedir que seu aplicativo seja restaurado a partir de instantâneos. Este guia ajuda você a identificar possíveis problemas de compatibilidade e fornece estratégias de migração.
Entendendo as mudanças de compatibilidade de estado
O Amazon Managed Service para Apache Flink 2.2 introduz várias alterações de serialização que afetam a compatibilidade de estados. Os seguintes são os principais:
-
Atualização da versão Kryo: O Apache Flink 2.2 atualiza o serializador Kryo incluído da versão 2 para a versão 5. Como o Kryo v5 usa um formato de codificação binária diferente do Kryo v2, qualquer estado do operador serializado via Kryo em um ponto de salvamento Flink 1.x não pode ser restaurado no Flink 2.2.
-
Serialização de coleções Java: no Flink 1.x, as coleções Java (como
HashMapArrayList, eHashSet) POJOs foram serializadas usando o Kryo. O Flink 2.2 introduz serializadores otimizados específicos da coleção que são incompatíveis com o estado serializado Kryo da versão 1.x. Aplicativos que usam coleções Java com serializadores POJO ou Kryo na versão 1.x não podem restaurar esse estado no Flink 2.2. Consulte a documentaçãodo Flink para obter mais detalhes sobre tipos de dados e serialização. -
Compatibilidade do Kinesis Connector: a versão do conector Kinesis Data Streams (KDS) inferior a 5.0 mantém um estado que não é compatível com o conector Kinesis Flink 2.2 versão 6.0. Você deve migrar para a versão 5.0 ou superior do conector antes da atualização.
Referência de compatibilidade de serialização
Analise todas as declarações de estado em seu aplicativo e combine os tipos de serialização com a tabela abaixo. Se algum tipo de estado for incompatível, consulte a Migração estadual seção antes de continuar com a atualização.
| Tipo de serialização | Compatível? | Detalhes |
|---|---|---|
abril (SpecificRecord,GenericRecord) |
Sim | Usa seu próprio formato binário independente do Kryo. Certifique-se de usar as informações do tipo Avro nativo do Flink, não o Avro registrado como um serializador Kryo. |
| Protobuf | Sim | Usa sua própria codificação binária independente do Kryo. Verifique se as alterações do esquema seguem as regras de evolução compatíveis com versões anteriores. |
| POJOs sem coleções | Sim | Gerenciado pelo serializador POJO do Flink — mas somente se a classe atender a todos os critérios do POJO: classe pública, construtor público sem arg, todos os campos públicos ou acessíveis por meio de getters/setters e todos os tipos de campo próprios serializáveis pelo Flink. Um POJO que viole qualquer um desses itens volta silenciosamente para Kryo e se torna incompatível. |
| Personalizado TypeSerializers | Sim | Compatível somente se seu serializador não delegar internamente ao Kryo. |
| Estado da API do SQL e da tabela | Sim (com ressalva) | Usa os serializadores internos do Flink. No entanto, o Apache Flink não garante a compatibilidade de estado entre as versões principais dos aplicativos da API de tabela. Teste primeiro em um ambiente que não seja de produção. |
POJOs com coleções Java (HashMap,ArrayList,HashSet) |
Não | No Flink 1.x, as coleções internas POJOs foram serializadas via Kryo v2. O Flink 2.2 introduz serializadores de coleção dedicados cujo formato binário é incompatível com o formato Kryo v2. |
| Classes de casos Scala | Não | Serializado via Kryo no Flink 1.x. A atualização do Kryo v2 para v5 altera o formato binário. |
| Registros Java | Não | Normalmente, retorne à serialização Kryo no Flink 1.x. Verifique testando comdisableGenericTypes(). |
| Tipos de bibliotecas de terceiros | Não | Os tipos sem um serializador personalizado registrado retornam ao Kryo. A alteração do formato binário Kryo v2 para v5 quebra a compatibilidade. |
| Qualquer tipo usando o Kryo fallback | Não | Se o Flink não conseguir lidar com um tipo com um serializador embutido ou registrado, ele retornará ao Kryo. Todo estado serializado do Kryo a partir de 1.x é incompatível com 2.2. |
Métodos diagnósticos
Você pode identificar problemas de compatibilidade de estado de forma proativa examinando os registros do aplicativo ou inspecionando os registros após a operação da UpdateApplication API.
Identifique o fallback do Kryo em seu aplicativo
Você pode usar o seguinte padrão de regex em seus registros para identificar o fallback do Kryo em seu aplicativo:
Class class (?<className>[^\s]+) cannot be used as a POJO type
Log de amostra:
Class class org.apache.flink.streaming.connectors.kinesis.model.SequenceNumber cannot be used as a POJO type because not all fields are valid POJO fields, and must be processed as GenericType. Please read the Flink documentation on "Data Types & Serialization" for details of the effect on performance and schema evolution.
Se a atualização falhar usando a UpdateApplication API, as exceções a seguir podem indicar que você está enfrentando uma incompatibilidade de estado baseada em serializador:
IndexOutOfBoundsException
Caused by: java.lang.IndexOutOfBoundsException: Index 116 out of bounds for length 1 at java.base/jdk.internal.util.Preconditions.outOfBounds(Unknown Source) at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Unknown Source) at java.base/jdk.internal.util.Preconditions.checkIndex(Unknown Source) at java.base/java.util.Objects.checkIndex(Unknown Source) at java.base/java.util.ArrayList.get(Unknown Source) at com.esotericsoftware.kryo.util.MapReferenceResolver.getReadObject(MapReferenceResolver.java:77) at com.esotericsoftware.kryo.Kryo.readReferenceOrNull(Kryo.java:923) ... 23 more
StateMigrationException (POJOSerializer)
Caused by: org.apache.flink.util.StateMigrationException: The new state serializer (org.apache.flink.api.java.typeutils.runtime.PojoSerializer@8bf85b5d) must not be incompatible with the old state serializer (org.apache.flink.api.java.typeutils.runtime.PojoSerializer@3282ee3).
Lista de verificação de pré-atualização
Revise todas as declarações estaduais em sua inscrição
Verifique POJOs com coleções (
HashMap,ArrayList,HashSet)Verifique os métodos de serialização para cada tipo de estado
Crie um aplicativo de réplica de produção e teste a compatibilidade do estado usando a UpdateApplication API nesta réplica
Se o estado for incompatível, selecione uma estratégia em Migração estadual
Ative a reversão automática na configuração do aplicativo Flink de produção
Migração estadual
Reconstruir o estado completo
Ideal para aplicativos em que o estado pode ser reconstruído a partir dos dados de origem.
Se seu aplicativo puder reconstruir o estado a partir dos dados de origem:
Pare o aplicativo Flink 1.x
Atualize para o Flink 2.x com código atualizado
Comece com
SKIP_RESTORE_FROM_SNAPSHOTPermitir que o aplicativo reconstrua o estado
aws kinesisanalyticsv2 start-application \ --application-name MyApplication \ --run-configuration '{ "ApplicationRestoreConfiguration": { "ApplicationRestoreType": "SKIP_RESTORE_FROM_SNAPSHOT" } }'
Práticas recomendadas
Sempre use Avro ou Protobuf para estados complexos — eles fornecem a evolução do esquema e são independentes do Kryo
Evite coleções em POJOs — Use o Flink nativo
ListStateeMapStateem vez dissoTeste a restauração do estado localmente — antes da atualização da produção, teste com instantâneos reais
Tire instantâneos com frequência — especialmente antes das principais atualizações de versões
Ativar reversão automática — Configure seu aplicativo MSF para reverter automaticamente em caso de falha
Documente seus tipos de estado — mantenha a documentação de todos os tipos de estados e seus métodos de serialização
Monitore os tamanhos dos pontos de verificação — O aumento dos tamanhos dos pontos de verificação pode indicar problemas de serialização
Próximas etapas
Planeje sua atualização: VejaAtualizando para o Flink 2.2: guia completo.
Em caso de dúvidas ou problemas durante a migração, consulte Solucionar problemas do Managed Service for Apache Flink ou entre em contato com o AWS Support.