Logo Zephyrnet

Amazon Managed Service per Apache Flink ora supporta Apache Flink versione 1.18 | Servizi Web di Amazon

Data:

Apache Flink è un motore di elaborazione distribuito open source, che offre potenti interfacce di programmazione per l'elaborazione sia in flusso che in batch, con supporto di prima classe per l'elaborazione stateful e la semantica del tempo di evento. Apache Flink supporta più linguaggi di programmazione, Java, Python, Scala, SQL e più API con diversi livelli di astrazione, che possono essere utilizzati in modo intercambiabile nella stessa applicazione.

Servizio gestito da Amazon per Apache Flink, che offre un'esperienza serverless completamente gestita nell'esecuzione delle applicazioni Apache Flink, ora supporta Apache Flink 1.18.1, l'ultima versione di Apache Flink al momento in cui scrivo.

In questo post, discutiamo alcune delle nuove interessanti funzionalità e capacità di Apache Flink, introdotte con le versioni principali più recenti, 1.16, 1.17 e 1.18, e ora supportate nel servizio gestito per Apache Flink.

Nuovi connettori

Prima di immergerci nelle nuove funzionalità di Apache Flink disponibili con la versione 1.18.1, esploriamo le nuove funzionalità che derivano dalla disponibilità di molti nuovi connettori open source.

OpenSearch

Un dedicato OpenSearch è ora disponibile per essere incluso nei tuoi progetti, consentendo a un'applicazione Apache Flink di scrivere i dati direttamente in OpenSearch, senza fare affidamento sulla modalità di compatibilità Elasticsearch. Questo connettore è compatibile con Servizio Amazon OpenSearch fornito e Servizio OpenSearch senza server.

Questo nuovo connettore supporta API SQL e tabelle, lavorando sia con Java che con Python, e il API del flusso di dati, solo per Java. Fuori dagli schemi, fornisce garanzie almeno una volta, sincronizzando le scritture con il checkpoint Flink. È possibile ottenere una semantica esattamente una volta utilizzando ID deterministici e il metodo upsert.

Per impostazione predefinita, il connettore utilizza le librerie client OpenSearch versione 1.x. Puoi passare alla versione 2.x tramite aggiungendo le dipendenze corrette.

Amazon DynamoDB

Gli sviluppatori Apache Flink possono ora utilizzare un connettore dedicato in cui scrivere i dati Amazon DynamoDB. Questo connettore è basato su Apache Flink AsyncSink, sviluppato da AWS e ora parte integrante del progetto Apache Flink, per semplificare l'implementazione di connettori sink efficienti, utilizzando richieste di scrittura non bloccanti e batching adattivo.

Anche questo connettore supporta entrambi SQL e tabella API, Java e Python e Flusso di dati API, solo per Java. Per impostazione predefinita, il sink scrive in batch per ottimizzare la velocità effettiva. Una caratteristica notevole della versione SQL è il supporto per la clausola PARTITIONED BY. Specificando una o più chiavi, è possibile ottenere una certa deduplicazione lato client, inviando solo il record più recente per chiave con ogni scrittura batch. È possibile ottenere un risultato equivalente con l'API DataStream specificando un elenco di chiavi di partizione da sovrascrivere all'interno di ciascun batch.

Questo connettore funziona solo come lavandino. Non puoi utilizzarlo per leggere da DynamoDB. Per cercare i dati in DynamoDB, devi comunque implementare una ricerca utilizzando il file API I/O asincrona Flink o implementare una funzione personalizzata definita dall'utente (UDF), per SQL.

MongoDB

Un altro connettore interessante è per MongoDB. In questo caso sono disponibili sia source che sink, per entrambi i file SQL e tabella API e Flusso di dati API. Il nuovo connettore fa ora ufficialmente parte del progetto Apache Flink ed è supportato dalla comunità. Questo nuovo connettore sostituisce quello vecchio fornito direttamente da MongoDB, che supporta solo le API Flink Sink e Source precedenti.

Come per altri connettori di archivio dati, l'origine può essere utilizzata come origine limitata, in modalità batch o per le ricerche. Il sink funziona sia in modalità batch che in streaming, supportando sia la modalità upsert che quella append.

Tra le molte caratteristiche degne di nota di questo connettore, vale la pena menzionare la possibilità di abilitare la memorizzazione nella cache quando si utilizza l'origine per le ricerche. Fuori dagli schemi, il lavandino supporta le garanzie almeno una volta. Quando viene definita una chiave primaria, il sink può supportare la semantica esattamente una volta tramite upsert idempotenti. Il connettore sink supporta anche la semantica esattamente una volta, con upsert idempotenti, quando viene definita la chiave primaria.

Nuovo versioning del connettore

Non una nuova funzionalità, ma un fattore importante da considerare quando si aggiorna una vecchia applicazione Apache Flink, è il nuovo controllo delle versioni del connettore. A partire dalla versione 1.17 di Apache Flink, la maggior parte dei connettori sono stati esternalizzati dalla distribuzione principale di Apache Flink e seguono un controllo delle versioni indipendente.

Per includere la dipendenza corretta, è necessario specificare la versione dell'artefatto con il modulo: <connector-version>-<flink-version>

Ad esempio, l'ultimo connettore Kafka, funzionante anche con Streaming gestito da Amazon per Apache Kafka (Amazon MSK), al momento in cui scrivo è la versione 3.1.0. Se stai utilizzando Apache Flink 1.18, la dipendenza da utilizzare sarà la seguente:

<dependency> 
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-kafka</artifactId> 
    <version>3.1.0-1.18</version>
</dependency>

Nel Cinesi amazzonica, la nuova versione del connettore è 4.2.0. La dipendenza per Apache Flink 1.18 sarà la seguente:

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-kinesis</artifactId> 
    <version>4.2.0-1.18</version>
</dependency>

Nelle sezioni seguenti, discuteremo più delle nuove potenti funzionalità ora disponibili in Apache Flink 1.18 e supportate in Amazon Managed Service per Apache Flink.

SQL

In Apache Flink SQL, gli utenti possono fornire suggerimenti per unire query che possono essere utilizzate per suggerire all'ottimizzatore di avere effetto sul piano di query. In particolare, nelle applicazioni di streaming, join di ricerca vengono utilizzati per arricchire una tabella, che rappresenta i dati in streaming, con i dati che vengono interrogati da un sistema esterno, in genere un database. Dalla versione 1.16 sono stati introdotti numerosi miglioramenti per i join di ricerca, consentendo di regolare il comportamento del join e migliorare le prestazioni:

  • Cache di ricerca è una funzionalità potente che consente di memorizzare nella cache in memoria i record utilizzati più frequentemente, riducendo la pressione sul database. In precedenza, la cache di ricerca era specifica per alcuni connettori. A partire da Apache Flink 1.16, questa opzione è diventata disponibile per tutti i connettori che supportano internamente la ricerca (FLIP-221). Al momento della stesura di questo articolo, JDBC, Alvearee Base H i connettori supportano la cache di ricerca. La cache di ricerca ha tre modalità disponibili: FULL, per un piccolo set di dati che può essere conservato interamente in memoria, PARTIAL, per un set di dati di grandi dimensioni, memorizzando nella cache solo i record più recenti oppure NONE, per disabilitare completamente la cache. Per PARTIAL cache, puoi anche configurare il numero di righe da bufferizzare e il time-to-live.
  • Ricerca asincrona è un'altra caratteristica che può migliorare notevolmente le prestazioni. La ricerca asincrona fornisce in Apache Flink SQL una funzionalità simile a I/O asincrono disponibile nell'API DataStream. Consente ad Apache Flink di emettere nuove richieste al database senza bloccare il thread di elaborazione finché non vengono ricevute le risposte alle ricerche precedenti. Analogamente all'I/O asincrono, è possibile configurare la ricerca asincrona per imporre l'ordinamento o consentire risultati non ordinati oppure regolare la capacità del buffer e il timeout.
  • Puoi anche configurare a strategia di ripetizione della ricerca in combinazione con PARTIAL or NONE cache di ricerca, per configurare il comportamento in caso di ricerca fallita nel database esterno.

Tutti questi comportamenti possono essere controllati utilizzando a LOOKUP suggerimento, come nell'esempio seguente, in cui mostriamo un join di ricerca utilizzando la ricerca asincrona:

SELECT 
    /*+ LOOKUP('table'='Customers', 'async'='true', 'output-mode'='allow_unordered') */ 
    O.order_id, O.total, C.address
FROM Orders AS O 
JOIN Customers FOR SYSTEM_TIME AS OF O.proc_time AS C 
  ON O.customer_id = O.customer_id

PyFlink

In questa sezione discutiamo dei nuovi miglioramenti e del supporto in PyFlink.

Supporto per Python 3.10

Le versioni più recenti di Apache Flink hanno introdotto numerosi miglioramenti per gli utenti PyFlink. Innanzitutto, Python 3.10 è ora supportato e il supporto di Python 3.6 è stato completamente rimosso (FLINK-29421). Il servizio gestito per Apache Flink attualmente utilizza il runtime Python 3.10 per eseguire le applicazioni PyFlink.

Avvicinarsi alla parità di funzionalità

Dal punto di vista dell'API di programmazione, PyFlink si sta avvicinando a Java in ogni versione. L'API DataStream ora supporta funzionalità come output laterali e stato di trasmissione e le lacune sull'API a finestre sono state colmate. PyFlink ora supporta anche nuovi connettori come Flussi di dati di Amazon Kinesis direttamente dall'API DataStream.

Miglioramenti alla modalità thread

PyFlink è molto efficiente. Il sovraccarico dell'esecuzione degli operatori API Flink in PyFlink è minimo rispetto a Java o Scala, perché il runtime esegue effettivamente l'implementazione dell'operatore direttamente nella JVM, indipendentemente dalla lingua dell'applicazione. Ma quando hai una funzione definita dall'utente, le cose sono leggermente diverse. Una riga di codice Python semplice come lambda x: x + 1, o complessa come una funzione Panda, deve essere eseguita in un runtime Python.

Per impostazione predefinita, Apache Flink esegue un runtime Python su ciascun Task Manager, esterno alla JVM. Ogni record viene serializzato, passato al runtime Python tramite comunicazione tra processi, deserializzato ed elaborato nel runtime Python. Il risultato viene quindi serializzato e restituito alla JVM, dove viene deserializzato. Questo è PyFlink Modalità PROCESSO. È molto stabile ma introduce un sovraccarico e, in alcuni casi, potrebbe diventare un collo di bottiglia nelle prestazioni.

Dalla versione 1.15, supporta anche Apache Flink Modalità FILATO per PyFlink. In questa modalità, le funzioni Python definite dall'utente vengono eseguite all'interno della JVM stessa, rimuovendo il sovraccarico di serializzazione/deserializzazione e di comunicazione tra processi. La modalità THREAD ha alcune limitazioni; ad esempio, la modalità THREAD non può essere utilizzata per Panda o UDAF (funzioni aggregate definite dall'utente, costituite da molti record di input e un record di output), ma può migliorare sostanzialmente le prestazioni di un'applicazione PyFlink.

Con la versione 1.16, il supporto della modalità THREAD è stato sostanzialmente esteso, coprendo anche l'API Python DataStream.

La modalità THREAD è supportata dal servizio gestito per Apache Flink e può esserlo abilitato direttamente dalla tua applicazione PyFlink.

Supporto Apple Silicon

Se utilizzi macchine basate su Apple Silicon per sviluppare applicazioni PyFlink, sviluppando per PyFlink 1.15, probabilmente hai riscontrato alcuni dei noti problemi di dipendenza Python su Apple Silicon. Questi problemi sono stati finalmente risolti (FLINK-25188). Queste limitazioni non influiscono sulle applicazioni PyFlink in esecuzione sul servizio gestito per Apache Flink. Prima della versione 1.16, se volevi sviluppare un'applicazione PyFlink su una macchina che utilizzava chipset M1, M2 o M3, dovevi usare alcuni soluzioni alternative, perché era impossibile installare PyFlink 1.15 o versioni precedenti direttamente sulla macchina.

Miglioramenti dei checkpoint non allineati

Apache Flink 1.15 supportava già checkpoint incrementali e buffer debloating. Queste funzionalità possono essere utilizzate, in particolare in combinazione, per migliorare le prestazioni del checkpoint, rendendo la durata del checkpoint più prevedibile, soprattutto in presenza di contropressione. Per ulteriori informazioni su queste funzionalità, vedere Ottimizza i checkpoint nel tuo Amazon Managed Service per le applicazioni Apache Flink con debloating del buffer e checkpoint non allineati.

Con le versioni 1.16 e 1.17 sono state introdotte diverse modifiche per migliorare stabilità e prestazioni.

Gestire la distorsione dei dati

Apache Flink utilizza filigrane per supportare la semantica del tempo degli eventi. Le filigrane sono record speciali, normalmente inseriti nel flusso dall'operatore di origine, che segnano l'avanzamento del tempo dell'evento per operatori come le aggregazioni di finestre temporali dell'evento. Una tecnica comune è quella di ritardare le filigrane dall'ora dell'ultimo evento osservato, per consentire agli eventi di essere fuori ordine, almeno in una certa misura.

Tuttavia, l’uso delle filigrane presenta una sfida. Quando l'applicazione ha più origini, ad esempio riceve eventi da più partizioni di un argomento Kafka, le filigrane vengono generate in modo indipendente per ciascuna partizione. Internamente ogni operatore attende sempre lo stesso watermark su tutte le partizioni di input, praticamente allineandolo sulla partizione più lenta. Lo svantaggio è che se una delle partizioni non riceve dati, le filigrane non avanzano, aumentando la latenza end-to-end. Per questo motivo, an timeout di inattività opzionale è stato introdotto in molte fonti di streaming. Dopo il timeout configurato, la generazione della filigrana ignora qualsiasi partizione che non riceve alcun record e le filigrane possono progredire.

Puoi anche affrontare una sfida simile ma opposta se una fonte riceve eventi molto più velocemente delle altre. Le filigrane sono allineate alla partizione più lenta, il che significa che qualsiasi aggregazione di finestre attenderà la filigrana. I record provenienti dalla sorgente veloce devono attendere, essendo bufferizzati. Ciò potrebbe comportare il buffering di un volume eccessivo di dati e una crescita incontrollabile dello stato dell'operatore.

Per risolvere il problema delle fonti più veloci, a partire da Apache Flink 1.17, puoi abilitare l'allineamento della filigrana delle suddivisioni delle fonti (FLINK-28853). Questo meccanismo, disabilitato per impostazione predefinita, garantisce che nessuna partizione avanzi i propri watermark troppo velocemente, rispetto ad altre partizioni. Puoi unire più fonti, come più argomenti di input, assegnando lo stesso ID del gruppo di allineamento e configurando la durata della deriva massima dalla filigrana corrente. Se una partizione specifica riceve eventi troppo velocemente, l'operatore di origine sospende il consumo di quella partizione finché la deriva non viene ridotta al di sotto della soglia configurata.

Puoi abilitarlo per ciascuna sorgente separatamente. Tutto ciò che serve è specificare un ID del gruppo di allineamento, che unirà tutte le fonti che hanno lo stesso ID, e la durata della deriva massima dall'attuale filigrana minima. Ciò metterà in pausa il consumo delle attività secondarie di origine che stanno avanzando troppo velocemente, finché la deriva non sarà inferiore alla soglia specificata.

Il seguente frammento di codice mostra come impostare l'allineamento della filigrana delle suddivisioni dell'origine su un'origine Kafka che emette filigrane delimitate fuori ordine:

KafkaSource<Event> kafkaSource = ...
DataStream<Event> stream = env.fromSource(
    kafkaSource,
    WatermarkStrategy.<Event>forBoundedOutOfOrderness( Duration.ofSeconds(20))
        .withWatermarkAlignment("alignment-group-1", Duration.ofSeconds(20), Duration.ofSeconds(1)),
    "Kafka source"));

Questa funzione è disponibile solo con FLIP-217 fonti compatibili, che supportano l'allineamento della filigrana delle suddivisioni delle fonti. Al momento della stesura, tra i principali connettori di origine streaming, solo l'origine Kafka supporta questa funzionalità.

Supporto diretto per il formato Protobuf

Le API SQL e Tabelle ora supportano direttamente Formato protocollo. Per utilizzare questo formato, è necessario generare le classi Java Protobuf dal file .proto file di definizione dello schema e includerli come dipendenze nell'applicazione.

Il formato Protobuf funziona solo con le API SQL e Table e solo per leggere o scrivere dati serializzati Protobuf da un'origine o in un sink. Attualmente, Flink non supporta direttamente Protobuf per serializzare direttamente lo stato e non supporta l'evoluzione dello schema, come fa per Avro, Per esempio. Devi ancora registrare un serializzatore personalizzato con qualche sovraccarico per la tua applicazione.

Mantenere Apache Flink open source

Apache Flink si affida internamente ad Akka per l'invio di dati tra attività secondarie. Nel 2022, Lightbend, la società dietro Akka, ha annunciato un cambio di licenza per le future versioni di Akka, da Apache 2.0 a una licenza più restrittiva, e che Akka 2.6, la versione utilizzata da Apache Flink, non riceverà alcun ulteriore aggiornamento o correzione di sicurezza.

Sebbene Akka sia stato storicamente molto stabile e non richieda aggiornamenti frequenti, questo cambio di licenza ha rappresentato un rischio per il progetto Apache Flink. La decisione della comunità Apache Flink è stata quella di sostituire Akka con un fork della versione 2.6, chiamato Apache Pekko (FLINK-32468). Questo fork manterrà la licenza Apache 2.0 e riceverà tutti gli aggiornamenti richiesti dalla comunità. Nel frattempo la comunità Apache Flink valuterà se eliminare completamente la dipendenza da Akka o Pekko.

Compressione dello stato

Apache Flink offre una compressione opzionale (impostazione predefinita: disattivata) per tutti i checkpoint e i punti di salvataggio. Apache Flink ha identificato un bug in Flink 1.18.1 in cui lo stato dell'operatore non poteva essere ripristinato correttamente quando la compressione degli snapshot era abilitata. Ciò potrebbe comportare la perdita di dati o l'impossibilità di ripristinare dal checkpoint. Per risolvere questo problema, Managed Service per Apache Flink ha eseguito il backport di fisso che sarà incluso nelle versioni future di Apache Flink.

Aggiornamenti della versione sul posto con il servizio gestito per Apache Flink

Se stai attualmente eseguendo un'applicazione sul servizio gestito per Apache Flink utilizzando Apache Flink 1.15 o versione precedente, ora puoi aggiornarla sul posto alla 1.18 senza perdere lo stato, utilizzando il comando Interfaccia della riga di comando di AWS (AWS CLI), AWS CloudFormazione or Kit di sviluppo cloud AWS (AWS CDK) o qualsiasi strumento che utilizza l'API AWS.

I AggiornaApplicazione L'azione API ora supporta l'aggiornamento della versione runtime Apache Flink di un servizio gestito esistente per l'applicazione Apache Flink. È possibile utilizzare UpdateApplication direttamente su un'applicazione in esecuzione.

Prima di procedere con l'aggiornamento sul posto, è necessario verificare e aggiornare le dipendenze incluse nella propria applicazione, assicurandosi che siano compatibili con la nuova versione di Apache Flink. In particolare, è necessario aggiornare eventuali librerie, connettori ed eventualmente la versione di Scala di Apache Flink.

Inoltre, ti consigliamo di testare l'applicazione aggiornata prima di procedere con l'aggiornamento. Consigliamo di eseguire test localmente e in un ambiente non di produzione, utilizzando la versione runtime Apache Flink di destinazione, per garantire che non siano state introdotte regressioni.

Infine, se la tua applicazione è stateful, ti consigliamo di prendere un file istantanea dello stato dell'applicazione in esecuzione. Ciò ti consentirà di ripristinare la versione precedente dell'applicazione.

Quando sei pronto, ora puoi utilizzare il file AggiornaApplicazione Azione API o aggiornamento-applicazione Comando AWS CLI per aggiornare la versione runtime dell'applicazione e indirizzarla al nuovo artefatto dell'applicazione, JAR o file zip, con le dipendenze aggiornate.

Per informazioni più dettagliate sul processo e sull'API, fare riferimento a Aggiornamento della versione sul posto per Apache Flink. La documentazione include istruzioni passo passo e un video per guidarti attraverso il processo di aggiornamento.

Conclusioni

In questo post abbiamo esaminato alcune delle nuove funzionalità di Apache Flink, supportate in Amazon Managed Service per Apache Flink. Questa lista non è comprensibile. Apache Flink ha inoltre introdotto alcune funzionalità molto promettenti, come il TTL a livello di operatore per l'API SQL e Table [FLIP-292] e Viaggio nel tempo [FLIP-308], ma questi non sono ancora supportati dall'API e non sono ancora realmente accessibili agli utenti. Per questo motivo abbiamo deciso di non trattarli in questo post.

Con il supporto di Apache Flink 1.18, il servizio gestito per Apache Flink ora supporta l'ultima versione rilasciata di Apache Flink. Abbiamo visto alcune delle nuove interessanti funzionalità e dei nuovi connettori disponibili con Apache Flink 1.18 e come il servizio gestito per Apache Flink ti aiuta ad aggiornare un'applicazione esistente.

Puoi trovare ulteriori dettagli sulle versioni recenti nel blog Apache Flink e nelle note sulla versione:

Se non conosci Apache Flink, ti ​​consigliamo il nostro guida alla scelta dell'API e del linguaggio corretti e seguendo il guida introduttiva per iniziare a utilizzare il servizio gestito per Apache Flink.


Informazioni sugli autori

Lorenzo NicoraLorenzo Nicora lavora come Senior Streaming Solution Architect presso AWS, aiutando i clienti in tutta l'area EMEA. Costruisce sistemi cloud-native e ad alta intensità di dati da oltre 25 anni, lavorando nel settore finanziario sia attraverso consulenze che per società di prodotti FinTech. Ha sfruttato ampiamente le tecnologie open source e ha contribuito a diversi progetti, tra cui Apache Flink.

Francesco MorilloFrancesco Morillo è un architetto di soluzioni di streaming presso AWS. Francisco lavora con i clienti AWS, aiutandoli a progettare architetture di analisi in tempo reale utilizzando i servizi AWS, supportando Amazon MSK e Amazon Managed Service per Apache Flink.

spot_img

L'ultima intelligenza

spot_img