Apache Flink på K8s och Kafka: PyFlink, Go, drift och hanterad prissättning
Tillståndsbaserad strömning, kontrollpunkter, K8s, PyFlink, Go.
Apache Flink är ett ramverk för statusbevarande beräkningar över obegränsade och begränsade dataströmmar.
Team implementerar det för korrekt, låglatens strömning med semantik för händelsetid (vattenmärken), feltolerans (kontrollpunkter), kontrollerade uppgraderingar (sparpunkter) och operativa ytor (mätvärden och REST).

Denna guide riktar sig till DevOps- och Go/Python-utvecklare. Den jämför implementationsmodeller (självhanterad vs hanterad), förklarar kärnarkitekturen, täcker Kubernetes (Helm och Operator) och enskilda installationer, kontrasterar Flink med Spark, Kafka Streams, Beam och strömmande databaser, och visar PyFlink samt Go-integrationsmönster inklusive rörledningar för LLM och AI.
För bredare sammanhang kring datainfrastrukturmönster inklusive objektlagring, databaser och meddelandeöverföring, se Datainfrastruktur för AI-system: Objektlagring, databaser, sökning & AI-dataarkitektur.
Vad är Apache Flink och varför team använder det för realtidsbehandling
Apache Flink är explicit positionerat som en strömbehandlingsmotor med status: du modellerar din logik som ett rörledningsflöde av operatörer och Flink kör det som ett distribuerat dataflöde med hanterad status och tidssemantik. I modern Flink-dokumentation beskriver projektet sig själv som ett ramverk och en distribuerad behandlingsmotor för statusbevarande beräkningar över obegränsade och begränsade dataströmmar.
Från ett praktiskt DevOps- och mjukvaruutvecklingsperspektiv är Flink ett bra val när du behöver minst en av dessa egenskaper:
Om du behöver join/aggregering/enrichment med låglatens och garantier för korrekthet, använder du typiskt Flinks händelsetidsbehandling, där “tid” är när händelsen inträffade (inte när den anlände), och vattenmärken kommunicerar händelsetidsframsteg genom rörledningen.
Om du behöver statusbevarande beräkning i stor skala (rullande räknare, sessioner, bedrägeriregler, karaktärsutveckling), behandlar Flink status som en första-klassad del av programmeringsmodellen och gör den feltolerant via kontrollpunkter (checkpointing).
Om du behöver operativt robust strömmande (fel, rullande uppgraderingar, omstarter), sparar Flink status och strömpositioner så att jobbet kan återhämta sig och fortsätta med samma semantik “som en felfri exekvering”.
Typiska användningsfall för DevOps, Go, Python och AI-team
Flink används bredvidan för “data rörledningar & ETL”, “strömmande analys” och “händelsestyrda applikationer” (kategorierna som används av Flink-dokumentationen).
För en DevOps + Go/Python-stack ser typiska mönster ut så här:
En Go-tjänst producerar händelser till Kafka; Flink konsumerar dessa händelser, utför statusbevarande behandling (t.ex. deduplikering, fönstrad aggregering, berikning) och skriver sedan härledda fakta tillbaka till Kafka eller en databas. Flinks operatörs- och kontrollpunktsmekanismer finns för att göra dessa statusbaserade rörledningar produktionsklara.
För ML/LLM-team pekar PyFlink explicit ut scenarier som “maskininlärningsförutsägelser” och laddning av maskininlärningsmodeller inuti Python-UDF:s som en motivation för beroendehantering, vilket är ett direkt stöd för mönster där “Flink-jobb som onlineinferens / karaktärsutvecklingskörning”.
Apache Flink-arkitektur och kärnfunktioner
Apache Flink-klusterrarkitektur för produktionsdeployment
Flinks körstöd består av två processtyper: JobManager och TaskManagers. Dokumentationen betonar att klienter skickar dataflödet till JobManager; klienten kan sedan koppla bort (avkopplad läge) eller stanna ansluten (anslutet läge).
JobManager koordinerar distribuerad exekvering: schemaläggning, reaktion på uppgiftens slutförande/fel, koordinering av kontrollpunkter och koordinering av återhämtning. Internt inkluderar den: ResourceManager (slotar/resurser), Dispatcher (REST + Web UI + skapande av JobMaster per jobb) och JobMaster (hanterar ett jobb).
TaskManagers exekverar operatörer/uppgifter och utbyter/buffrar dataströmmar. Den minsta schemaläggningseenheten är task slot; flera operatörer kan exekveras i en slot (operatörskedjor och slots delning påverkar detta).
Operatörskedjor och uppgiftsslotar för prestanda och kostnadskontroll
Flink kedjer operatörsubuppgifter till uppgifter, där varje uppgift exekveras av en enda tråd. Detta beskrivs som en prestandaoptimering som minskar trädöverföring och buffringsoverhead, vilket ökar genomsnittlig prestanda och minskar latens.
Slotar är operativa eftersom de är enheten för resursplanering/isolering. Flink noterar att varje TaskManager kan ha en eller flera uppgiftsslotar; slotning reserverar hanterat minne per slot, men isolerar inte CPU.
Händelsetidsbehandling, vattenmärken och sen data
Flink stödjer flera tidssynsätt – händelsetid, inläsningstid, bearbetningstid – och använder vattenmärken för att modellera framsteg i händelsetid.
För att arbeta med händelsetid behöver Flink tidsstämplar tilldelade till händelser och vattenmärken genererade; den officiella dokumentationen om “Generering av vattenmärken” förklarar tidsstämplingstilldelning och vattenmärkesgenerering som kärnbyggstenar, där WatermarkStrategy är det standardiserade sättet att konfigurera vanliga strategier.
Felhantering: kontrollpunkter jämfört med sparpunkter i verkliga system
Kontrollpunktering finns eftersom “varje funktion och operatör i Flink kan vara statusbevarande”; status måste kontrolleras för att bli feltolerant. Kontrollpunkter möjliggör återhämtning av både status och strömpositioner så att exekvering kan återupptas med felfri semantik.
Flink är mycket explicit med att sparpunkter är “en konsekvent bild av exekveringsstatusen för ett strömmande jobb, skapad via Flinks kontrollpunktsmekanism”, används för att stoppa/återuppta, klonar eller uppdatera jobb. Sparpunkter lever på stabil lagring (t.ex. HDFS, S3).
Den officiella sidan “Kontrollpunkter jämfört med sparpunkter” beskriver skillnaden som backups vs återhämtningsloggar: kontrollpunkter är frekventa, lätta och hanteras av Flink för felåterhämtning; sparpunkter är användarhanterade och används för kontrollerade operationer som uppgraderingar.
Apache Flink-implementeringsalternativ och prissättningsplaner
Gratis/självhanterat Apache Flink-alternativ
Den öppen källkod Flink-körstöd är “gratis” i licensbetydelse, men i produktion betalar du för infrastruktur och operativ insats.
Flink är designat för att integreras med vanliga resurshanterare (t.ex. YARN och Kubernetes) och kan också köras som ett enskilt kluster eller som en biblioteksbibliotek.
Kostnadsdrivare för självhanterad Apache Flink
Beräknings- och minneskostnader drivs av JobManager och TaskManagers, och av din parallellitet/slotlayout. Flinks konfigurationsdokumentation pekar explicit ut jobmanager.memory.process.size, taskmanager.memory.process.size, taskmanager.numberOfTaskSlots och parallelism.default som kärnhandtag för distribuerade installationer.
Lokal disk är en vanlig dold kostnad för statusbevarande jobb. Flink noterar att io.tmp.dirs lagrar lokal data inklusive RocksDB-filer, spillade mellanresultat och cachade JAR-filer; om denna data raderas kan det tvinga fram “en tungviktig återhämtningsoperation”, så den bör finnas på lagring som inte periodiskt rensas.
Kostnaden för hållbar objekt/fil-lagring drivs av kontrollpunkt/sparpunktskataloger. I Flink 2.x-konfiguration konfigureras kontrollpunkter och sparpunkter via execution.checkpointing.dir och execution.checkpointing.savepoint-dir och accepterar URI:er som s3://… eller hdfs://….
Hanterade Apache Flink-planer och typiska faktureringsmodeller
Hanterade tjänster minskar operativa kostnader men lägger till plattformsavgifter och begränsningar. Detaljerna är leverantörsspecifika.
Amazon Managed Service for Apache Flink fakturerar per KPU (1 vCPU + 4 GB minne per KPU) och debiterar per varaktighet och antal KPU:er i ensekundsintervall. AWS tar också en extra avgift för “orchestrering” KPU per applikation och separata lagrings/backup-avgifter.
Confluent Cloud for Apache Flink är användningsbaserad och serverlös: du skapar en beräkningspool och debiteras för CFU:er som förbrukas per minut medan uttalanden körs. Faktureringssidan inkluderar ett exempel på CFU-pris på $0,21 per CFU-timme (regionberoende) och betonar att du kan begränsa utgifterna via beräkningspoolmaximala värden.
Aiven och Alibaba Cloud är anmärkningsvärda hanterade Flink-leverantörer på marknaden, men deras publika priser och faktureringsdetaljer varierar beroende på plan/region och kan kräva kalkylatorer eller kontakt med försäljning; behandla exakta kostnader som ospecificerade om du inte citerar en region+plan från deras aktuella dokumentation.
Ververica erbjuder både självhanterade och hanterade implementeringsalternativ kring Flink; publika sidor betonar implementeringsval och positionering av hanterad tjänst, medan exakt prissättning oftast hanteras via “kontakt/prissättningsdetaljer”-flöden (så specifika siffror är ofta ospecificerade offentligt).
Implementeringstabell för Apache Flink i produktion
| Implementeringsalternativ | Bästa för | Operativ komplexitet | Nyckelnytta | Nyckelrisker / avvägningar |
|---|---|---|---|---|
| Enskilt kluster (VM:er/bare metal) | Små team, fast kapacitet | Medel–Hög | Full kontroll; enklast mental modell | HA, autoskalning, uppgraderingar är DIY (mer arbete) |
| Kubernetes med Flink Kubernetes Operator | De flesta moderna plattformsteam | Medel | Deklarativa deployment; livscykelhantering via kontrollslöpa; operator stödjer Application/Session/Job-implementeringar | Kräver Kubernetes + operatörsexpertis |
| Native Kubernetes (utan operator) | K8s-team som vill ha direkt integration | Medel–Hög | Direkt resursintegration; dynamisk TaskManager-allokering/deallokering beskrivs i Flink-on-K8s-dokumentationen | Mer skräddarsydd automation än operator |
| YARN | Hadoop-centrerade plattformar | Medel | Integreras med YARN-resursbehandling | Hadoop-stackkomplexitet |
| AWS Managed Service for Apache Flink | AWS-native datastacks | Låg–Medel | Hanterad orkestrering + skalningsalternativ; förutsägbar faktureringsenhet (KPU) | Plattformskoppling; extra per-app overhead KPU + lagringsavgifter |
| Confluent Cloud for Apache Flink | Kafka-första företag, SQL-första strömsapplikationer | Låg | Serverlös användningsfakturering; CFU-minutbokföring; beräkningspolar för att begränsa utgifter | CFU-kostnader + Kafka-nätverkskostnader; tjänstspecifika API:er |
| Ververica hanterade erbjudanden | Enterprise som behöver Flink-expertoperation | Låg–Medel | “Flink-expert” hanterad tjänstpositionering | Prissättning ofta inte transparent (ospecificerad) |
Hanterade leverantörer och kostnadstabell
Priser ändras beroende på region och tid; om du behöver exakta siffror för din region, behandla detta som en utgångspunkt och verifiera mot leverantörens aktuella prissättningssidor (ospecificerade regioner är ospecificerade).
| Leverantör | “Plan”-form | Faktureringsenhet | Exempel på beräkningspris | Anmärkningsvärda tilläggsdrivare |
|---|---|---|---|---|
| Amazon Managed Service for Apache Flink | Hanterad körstöd | KPU (1 vCPU + 4 GB) | Exempel visat: $0,11 per KPU-timme (US East N. Virginia) | +1 orkestrerings-KPU per app; körande lagring; valbara hållbara backups |
| Confluent Cloud for Apache Flink | Serverlös SQL/behandling | CFU-minut/CFU-timme | Exempel visat: $0,21 per CFU-timme (varierar per region) | Kafka-nätverkskostnader gäller fortfarande; beräkningspoolmaximala värden för att begränsa utgifter |
| Ververica (hanterad) | Hanterad “Unified Streaming Data Platform” | Ospecificerad (publika sidor) | Ospecificerad | Plattformsfunktioner/SLA; prissättning vanligtvis via försäljning (ospecificerad) |
| Aiven for Apache Flink | Hanterad tjänst | Timbaserad fakturering (plattformsomfattande) | Ospecificerad utan plan/region | Plantyp + molnregion + tillägg (ospecificerad) |
| Alibaba Cloud Realtime Compute for Apache Flink | Hanterad/serverlös | Hybridfakturering (betal-per-användning + abonnemangsblandning) | Ospecificerad utan region/arbetsområdesdetaljer | CU-baserade begränsningar och arbetsområdesmodell (detaljer varierar; ospecificerade här) |
Apache Flink jämfört med konkurrenter
Flink befinner sig i en travlig ekosystem. Det “bästa” valet beror på latens, statusbevarande, operativa preferenser och skrivningsmodell.
Konkurrenssjälvjämförelsetabell: Flink vs Spark vs Kafka Streams vs Beam och nya alternativ
| Verktyg | Vad det är | Strömmande exekveringsmodell | Status & exakt-en gång-historia | Var det skinerar | Typiska smärtpunkter |
|---|---|---|---|---|---|
| Apache Flink | Distribuerad strömbehandlingsmotor för statusbevarande beräkningar | Kontinuerlig strömning + händelsetid via vattenmärken | Kontrollpunktsbaserad felhantering; sparpunkter för kontrollerade uppgraderingar | Låglatens statusbevarande rörledningar; komplex händelsetidslogik | Att operera status, kontrollpunkter och uppgraderingar kräver disciplin |
| Apache Spark Structured Streaming | Sparks strömmotor byggd kring DataFrames/Datasets | Standard mikrobatch-modell (med en kontinuerlig läge diskuterat separat) | Stark för analytiska rörledningar; status finns men ofta högre latens | Enhetliga batch+ströms-API:er; Spark-ekosystem | Mikrobatch-latens och “strömning som inkrementella batch” mental modell |
| Kafka Streams | Bibliotek för att bygga strömbehandlingsapplikationer på Kafka | En händelse i taget-behandling | Stödjer exakt-en gång-händelsesemantik (EOS) | Enkla Kafka-native applikationer; inbäddad i JVM-tjänst | Endast JVM; mindre flexibel för stora distribuerade beräkningsmönster |
| Apache Beam | Enhetlig programmeringsmodell + SDK:er; exekveras via körare (Flink, Spark, Dataflow, etc.) | Beror på köraren; Beam-rörledningar översätts till körarjobb | Semantik beror på körarens förmågematris (körarspecifik) | Portabilitet, flerspråkiga rörledningar; undvika motorlåsning | Operativ inställning slutar ändå bli körarspecifik |
| Materialize | “Live data-lager” / strömmande SQL-databas; uppdaterar resultat inkrementellt när data anländer | Kontinuerlig inkrementell vy-underhåll | Starka konsistensanspråk i produktdokumentation (detaljer är produktspecifika) | Servering av färska härledda vyar till applikationer/AI-agenter | Annan operativ modell än Flink-jobb; inte en generell operatör-API-körstöd |
| RisingWave | Strömmande databas där strömbehandling uttrycks som materialiserade vyar | Kontinuerlig materialiserad vy-underhåll | SQL-första; motorspecifik semantik | SQL-centrerade strömsapplikationer utan att bygga Flink-jobb | Mindre flexibel för godtyckliga kodtunga rörledningar |
En användbar tumregel: om du vill ha en körstöd för komplexa statusbevarande strömjobb med djup kontroll över händelsetid, operatörlogik och deployment, är Flink en primär kandidat. Om du vill ha SQL-första inkrementella vyar för servering, kan strömmande databaser vara alternativ. Om du vill ha ett bibliotek inbäddat i en tjänst, är Kafka Streams konkurrent. Om du vill ha en portabel rörledningsdefinition över motorer, är Beam lockande.
För moln-native händelsestyrda arkitekturer som använder AWS, Bygg händelsestyrda mikrotjänster med AWS Kinesis täcker Kinesis Data Streams-mönster för realtidsbehandling och tjänsteavkoppling.
Hur man använder Apache Flink i skräddarsydda system
Detta avsnitt är intentionellt praktiskt: konfiguration, deployment och hur dina Go/Python-tjänster typiskt interagerar med Flink.
Rekommenderad arkitekturmönster: Go-tjänster + Kafka + Flink + serveringsskikt

Flink är ofta den “statusbevarande mitten” som omvandlar högvolyms händelser till hållbara signaler (räknare, sessioner, avvikelser, berikade poster). Kontrollpunkter och statusbakgrunder är det som gör denna mitten pålitlig i produktion.
Enskilt konfigurationsexempel för Apache Flink 2.x
Viktig versionsanteckning: från och med Flink 2.0 är det stödda konfigurationsfilen conf/config.yaml; den tidigare flink-conf.yaml är “inte längre stödd”.
En minimal (illustrativ) conf/config.yaml för ett litet självhanterat kluster:
# conf/config.yaml (Flink 2.x-stil)
rest:
address: flink-jobmanager.example.internal
port: 8081
jobmanager:
rpc:
address: flink-jobmanager.example.internal
port: 6123
memory:
process:
size: 2048m
taskmanager:
memory:
process:
size: 4096m
numberOfTaskSlots: 2
parallelism:
default: 2
# Kontrollpunktsstandardinställningar (jobb kan fortfarande åsidosätta i kod)
state:
backend:
type: rocksdb
execution:
checkpointing:
dir: s3://my-bucket/flink/checkpoints
savepoint-dir: s3://my-bucket/flink/savepoints
interval: 60 s
# Undvik tmp-kataloger som rensas (RocksDB-filer, cachade JAR:er, etc.)
io:
tmp:
dirs: ["/var/lib/flink/tmp"]
Varför dessa nycklar: Flinks konfigurationsreferens dokumenterar explicit rest.* och jobmanager.rpc.* upptäcktdetaljer, processminnesnycklar, slot/parallellitetsnycklar och standardkontrollpunktsinställningar inklusive state.backend.type, execution.checkpointing.dir, execution.checkpointing.savepoint-dir och execution.checkpointing.interval.
Valet av io.tmp.dirs är operativt viktigt eftersom Flink använder det för lokala RocksDB-filer och cachade artefakter; att radera det kan orsaka tungviktig återhämtning.
Legacy-enskilt konfigurationsexempel för Flink 1.x
Om du är på Flink 1.x (fortfarande vanligt i vissa hanterade miljöer), kommer du att se flink-conf.yaml i vilt. Detta är legacy för Flink 2.x-användare.
# conf/flink-conf.yaml (legacy 1.x-stil; EJ stödd i Flink 2.x)
jobmanager.rpc.address: flink-jobmanager
rest.port: 8081
taskmanager.numberOfTaskSlots: 2
parallelism.default: 2
# Legacy kontrollpunktsnycklar skiljer sig beroende på version; behandla som illustrativt.
state.backend.type: rocksdb
state.checkpoints.dir: s3://my-bucket/flink/checkpoints
state.savepoints.dir: s3://my-bucket/flink/savepoints
Om du migrerar tillhandahåller Flink ett migreringsscript (bin/migrate-config-file.sh) för att konvertera flink-conf.yaml till config.yaml.
Kubernetes/Helm-implementering med Flink Kubernetes Operator
Flink Kubernetes Operator fungerar som en kontrollplan för Flink-applikations livscykelhantering och installeras med Helm.
Från officiella operator Helm-dokumentation kan du installera antingen från källträdets diagram eller från Apache-hostade diagramrepositorium:
# installera från bundit diagram i källträdet
helm install flink-kubernetes-operator helm/flink-kubernetes-operator
# installera från Apache nedladdningar Helm-repositorium (ersätt <OPERATOR-VERSION>)
helm repo add flink-operator-repo https://downloads.apache.org/flink/flink-kubernetes-operator-<OPERATOR-VERSION>/
helm install flink-kubernetes-operator flink-operator-repo/flink-kubernetes-operator
Dessa exakta kommandon visas i operatörens Helm-installationsdokumentation.
Exempel på FlinkDeployment CR (illustrativ)
Detta är ett förenklat exempel för att visa integrationspunkter du vanligtvis skräddarsyr (bild, resurser, kontrollpunktsplatser, loggning/mätvärden). Operatören återförsöker detta önskade tillstånd via dess kontrollslöpa.
apiVersion: flink.apache.org/v1beta1
kind: FlinkDeployment
metadata:
name: realtime-sessions
namespace: flink
spec:
image: my-registry.example.com/flink/realtime-sessions:2026-03-06
flinkVersion: v2_2
serviceAccount: flink
flinkConfiguration:
taskmanager.numberOfTaskSlots: "2"
state.backend.type: "rocksdb"
execution.checkpointing.dir: "s3://my-bucket/flink/checkpoints/realtime-sessions"
execution.checkpointing.savepoint-dir: "s3://my-bucket/flink/savepoints/realtime-sessions"
execution.checkpointing.interval: "60 s"
rest.port: "8081"
jobManager:
resource:
cpu: 1
memory: "2048m"
taskManager:
resource:
cpu: 2
memory: "4096m"
job:
jarURI: local:///opt/flink/usrlib/realtime-sessions.jar
parallelism: 4
upgradeMode: savepoint
state: running
Mönstret upgradeMode: savepoint är vanligt när du vill ha säkra statusbevarande uppgraderingar; sparpunkter är designade för stopp/återuppta/fork/uppdatera-arbetsflöden och pekar på stabila lagringsplatser.
PyFlink-utveckling: realistiskt Kafka-strömjobb med kontrollpunkter och RocksDB-status
PyFlink är Python-API:et för Apache Flink och är explicit marknadsfört för skalbara batch/ström arbetsbelastningar inklusive ML-rörledningar och ETL.
Beroendepackning för PyFlink Kafka-jobb
När du använder JVM-anslutningar (Kafka, JDBC, etc.) från PyFlink måste du se till att relevanta JAR-filer är tillgängliga för jobbet. Flinks Python “Beroendehantering”-dokumentation visar tre standardmekanismer:
Sätt pipeline.jars (Table API), anropa add_jars() (DataStream API), eller CLI --jarfile vid inskickningstillfället.
PyFlink Kafka-jobbexempel (DataStream API + händelsetid + status + kontrollpunktering)
Detta exempel läser JSON-händelser från Kafka, tilldelar händelsetidstidsstämplar (med begränsad oordningsgrad), underhåller en per-användare rullande räkning i nycklad status och skriver en berikad händelse till ett utdataämne.
Anteckningar:
- KafkaSource byggs via
KafkaSource.builder()och kräver bootstrap-servrar, ämnen och en deserialiserare. - Konfiguration för exakt-en gång-Kafka-sänka i PyFlink kräver att leveransgaranti och ett transaktions-ID-prefix är inställt.
- Kontrollpunktsstandardinställningar kan konfigureras i Flink-konfiguration (
execution.checkpointing.*) och/eller i kod; konfigurationsnycklarna dokumenteras i Flinks konfigurationsreferens.
import json
from typing import Any
from pyflink.common import Duration, Types
from pyflink.common.serialization import SimpleStringSchema
from pyflink.common.watermark_strategy import WatermarkStrategy, TimestampAssigner
from pyflink.common.configuration import Configuration
from pyflink.datastream import StreamExecutionEnvironment
from pyflink.datastream.functions import KeyedProcessFunction, RuntimeContext
from pyflink.datastream.state import ValueStateDescriptor
from pyflink.datastream.connectors import DeliveryGuarantee
from pyflink.datastream.connectors.kafka import (
KafkaSource,
KafkaOffsetsInitializer,
KafkaSink,
KafkaRecordSerializationSchema,
)
class EventTimeFromJson(TimestampAssigner):
"""
Extrahera event_time_ms från JSON-payloaden.
Förväntar: {"user_id":"u1","event_time_ms":1710000000000,"event":"click",...}
"""
def extract_timestamp(self, value: str, record_timestamp: int) -> int:
try:
obj = json.loads(value)
return int(obj["event_time_ms"])
except Exception:
# fallback: använd registreringsstämpel (inläsning) om felaktigt format
return record_timestamp
class RollingCount(KeyedProcessFunction):
def open(self, runtime_context: RuntimeContext):
desc = ValueStateDescriptor("rolling_count", Types.LONG())
self.count_state = runtime_context.get_state(desc)
def process_element(self, value: str, ctx: 'KeyedProcessFunction.Context'):
obj = json.loads(value)
current = self.count_state.value()
if current is None:
current = 0
current += 1
self.count_state.update(current)
# sänd ut berikad händelse
obj["rolling_count"] = current
obj["event_time_ms"] = int(obj.get("event_time_ms", 0))
yield json.dumps(obj)
def build_env() -> StreamExecutionEnvironment:
# Kluster/jobbstandardinställningar (kan också sättas i config.yaml)
cfg = Configuration()
cfg.set_string("state.backend.type", "rocksdb")
cfg.set_string("execution.checkpointing.dir", "s3://my-bucket/flink/checkpoints/realtime-sessions")
cfg.set_string("execution.checkpointing.interval", "60 s")
env = StreamExecutionEnvironment.get_execution_environment(cfg)
# I PyFlink måste connector-JAR:er vara tillgängliga; använd env.add_jars(...) om nödvändigt.
# env.add_jars("file:///opt/flink/lib/flink-connector-kafka-<VERSION>.jar")
# Aktivera kontrollpunktering explicit också (jobb kan åsidosätta standardinställningar)
env.enable_checkpointing(60_000)
env.set_parallelism(4)
return env
def main():
env = build_env()
source = (
KafkaSource.builder()
.set_bootstrap_servers("kafka:9092")
.set_topics("events.raw")
.set_group_id("realtime-sessions-v1")
.set_value_only_deserializer(SimpleStringSchema())
.set_starting_offsets(KafkaOffsetsInitializer.earliest())
.build()
)
watermark_strategy = (
WatermarkStrategy.for_bounded_out_of_orderness(Duration.of_seconds(10))
.with_timestamp_assigner(EventTimeFromJson())
)
stream = (
env.from_source(source, watermark_strategy=watermark_strategy, source_name="kafka-events-raw")
.key_by(lambda s: json.loads(s)["user_id"])
.process(RollingCount(), output_type=Types.STRING())
)
record_serializer = (
KafkaRecordSerializationSchema.builder()
.set_topic("events.enriched")
.set_value_serialization_schema(SimpleStringSchema())
.build()
)
sink = (
KafkaSink.builder()
.set_bootstrap_servers("kafka:9092")
.set_record_serializer(record_serializer)
.set_delivery_guarantee(DeliveryGuarantee.EXACTLY_ONCE)
.set_transactional_id_prefix("realtime-sessions-txn")
.build()
)
stream.sink_to(sink)
env.execute("realtime-sessions-pyflink")
if __name__ == "__main__":
main()
API-anropen ovan stämmer överens med PyFlinks KafkaSource-byggaranvändningsmönster och krävda fält.
För leveransgarantier säger PyFlinks KafkaSinkBuilder-dokumentation explicit att för DeliveryGuarantee.EXACTLY_ONCE måste du sätta transaktions-ID-prefixet.
För tidsstämpling/vattenmärkning förklarar Flinks vattenmärkesdokumentation tidsstämplingstilldelning och vattenmärkesgenerering som mekanismen att bearbeta händelsetid, och PyFlink tillhandahåller ett WatermarkStrategy-API som speglar denna modell.
Go-integration: Kafka-producer/konsument + Flink REST-jobbinskickning
Go har inte ett inbyggt Flink-jobbskriv-API som Java/Python, så Go-system integrerar vanligtvis med Flink genom:
- Kafka (eller andra mäklare) som inmatning/utmatning.
- Flinks REST-API för operativa åtgärder (uppladdning av JAR:er, start av jobb, förfrågan om jobbtillstånd, utlösande av sparpunkter, omskalning).
För Kafka-inställning och lokal utvecklingsmönster, se Apache Kafka Quickstart - Installera Kafka 4.2 med CLI och lokala exempel.
Go Kafka-producer/konsumentexempel (kafka-go)
package main
import (
"context"
"log"
"time"
"github.com/segmentio/kafka-go"
)
func main() {
ctx := context.Background()
// Producer: skriv råa händelser
writer := &kafka.Writer{
Addr: kafka.TCP("kafka:9092"),
Topic: "events.raw",
RequiredAcks: kafka.RequireAll,
}
defer writer.Close()
err := writer.WriteMessages(ctx, kafka.Message{
Key: []byte("user:u1"),
Value: []byte(`{"user_id":"u1","event_time_ms":1710000000000,"event":"click"}`),
Time: time.Now(),
})
if err != nil {
log.Fatal(err)
}
// Konsument: läs berikade händelser
reader := kafka.NewReader(kafka.ReaderConfig{
Brokers: []string{"kafka:9092"},
Topic: "events.enriched",
GroupID: "go-debug-consumer",
MinBytes: 1e3,
MaxBytes: 10e6,
})
defer reader.Close()
msg, err := reader.ReadMessage(ctx)
if err != nil {
log.Fatal(err)
}
log.Printf("enriched key=%s value=%s\n", string(msg.Key), string(msg.Value))
}
Detta är “plumbing”-kod, men det är den vanligaste praktiska integrationsytan: Kafka-ämnen är gränssnittet mellan Flink och skräddarsydda tjänster.
Flink REST-API: ladda upp och kör jobb från Go
Flinks REST-API är en del av JobManager-webbservern och lyssnar på port 8081 som standard (konfigurerbart via rest.port).
Det officiella OpenAPI-specket för dispatchern inkluderar /jars/upload och anger explicit:
- JAR-uppladdning måste skickas som multi-part-data
- se till att
Content-Type-rubriken är inställd påapplication/x-java-archive - tillhandahåller ett curl-exempel som använder
-F jarfile=@path/to/flink-job.jar
Ett praktiskt Go-snutt för att ladda upp en JAR:
package flink
import (
"bytes"
"context"
"fmt"
"io"
"mime/multipart"
"net/http"
"os"
)
func UploadJar(ctx context.Context, flinkBaseURL, jarPath string) (*http.Response, error) {
f, err := os.Open(jarPath)
if err != nil {
return nil, err
}
defer f.Close()
var body bytes.Buffer
w := multipart.NewWriter(&body)
part, err := w.CreateFormFile("jarfile", "job.jar")
if err != nil {
return nil, err
}
if _, err := io.Copy(part, f); err != nil {
return nil, err
}
if err := w.Close(); err != nil {
return nil, err
}
req, err := http.NewRequestWithContext(ctx, http.MethodPost, flinkBaseURL+"/jars/upload", &body)
if err != nil {
return nil, err
}
// Viktigt: multipart-gräns
req.Header.Set("Content-Type", w.FormDataContentType())
// Vissa klienter sätter också "Expect:" liknande curl-exemplet i specifikationen.
req.Header.Set("Expect", "")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
if resp.StatusCode >= 300 {
return resp, fmt.Errorf("upload failed: %s", resp.Status)
}
return resp, nil
}
Denna kod styrs av REST-API:s OpenAPI-beskrivning för /jars/upload inklusive dess multi-part-krav och curl-referens.
För att köra en tidigare uppladdad JAR, exponerar Flink /jars/{jarid}/run och stödjer att skicka programargument via frågeparametrar (och/eller JSON-kropp).
Operativt värdefulla ändamål du sannolikt automatiserar:
/jobsoch/jobs/{jobid}för att lista och inspektera jobbtillstånd/jobs/{jobid}/savepointsför att utlösa sparpunkter (asynkron utlösare + polling)/jobs/{jobid}/rescalingför att utlösa omskalning
Kodsammanjämförelsetabell: PyFlink vs Go i ett Flink-baserat plattform
| Åtgärd | PyFlink (Python-jobb) | Go (tjänster kring Flink) |
|---|---|---|
| Skrivning av Flink-logik | Native skrivning via DataStream/Table-API:er; stödjer status + tidtagare | Inget native Flink-API; implementera logik i Flink (Java/Python) och integrera externt |
| Anslutningar/beroenden | Måste leverera connector-JAR:er via pipeline.jars, add_jars eller --jarfile |
Ej tillämpligt (du kör inte inuti Flink), men du hanterar Kafka/DB-klienter |
| Inläsning/utmatning | KafkaSource/KafkaSink-byggar i PyFlink | Kafka-producer/konsumentbibliotek; standardmikrotjänstmönster |
| Ops-automatisering | Kan anropa Flink REST-ändamål också | Äger ofta automation: ladda upp JAR, deploya, om skala, utlösa sparpunkt via REST |
DevOps-guide: övervakning, skalning, backups och CI/CD för Apache Flink
Övervakning av Apache Flink i Kubernetes och på VM:er
Flink stödjer export av mätvärden genom att konfigurera mätvärdesrapportörer i Flink-konfigurationsfilen; dessa rapportörer instansieras på JobManager och TaskManagers.
För Prometheus exponerar Flink Prometheus-format mätvärden när det är konfigurerat med metrics.reporter.prom.factory.class: org.apache.flink.metrics.prometheus.PrometheusReporterFactory i en stödd Flink-versionmiljö.
Du kombinerar vanligtvis detta med Kubernetes ServiceMonitors (Prometheus Operator) eller med din hanterade övervakningsstack.
Skaling: parallellitet, slotar och operatör-baserad autoskalning
Flinks schemaläggningsmodell definierar exekveringsresurser via uppgiftsslotar, och varje slot kan köra en rörledningskedja av parallella uppgifter.
För manuell skalning tillhandahåller REST-API:et en omskalningändamål för ett jobb (/jobs/{jobid}/rescaling) som en asynkron operation.
Om du är på Kubernetes med Flink Kubernetes Operator, annonserar operatörsprojektet en “Flink Job Autoscaler” som en del av dess funktionsuppsättning, vilket är värt att utvärdera om dina arbetsbelastningar varierar avsevärt.
Backups och säkra uppgraderingar: kontrollpunkter och sparpunkter
Kontrollpunkter är för automatiserad återhämtning och hanteras av Flink; sparpunkter är för användarstyrd livscykeloperationer (stopp/återuppta/fork/uppdatera).
Från ett SRE-perspektiv:
- Använd kontrollpunkter för “håll rörledningen igång genom fel”.
- Använd sparpunkter för “deploya en ny version utan att förlora status”.
Flinks REST-API stödjer också asynkron utlösning av sparpunkter, vilket är användbart för GitOps-stil “deploya → utlösa sparpunkt → uppgradera”-arbetsflöden.
CI/CD: GitOps + Helm + REST-jobbinskickning
För Kubernetes:
- Håll operatörsinstallationen och dina FlinkDeployment CR:er i Git, deploya via Argo CD/Flux och versionera behållarbilder per build. Operatörens Helm-dokumentation diskuterar explicit “Att arbeta med Argo CD”.
För enskilda/sessionkluster:
- Använd Flinks REST-API JAR-uppladdning och körändamål för omuterbara artefaktdeployment.
Notera också en subtil men värdefull säkerhets/ops-switch: web.submit.enable styr uppladdningar via Web UI, men dokumentationen noterar att även när det är inaktiverat, sessionkluster fortfarande accepterar jobbinskickningar via REST-förfrågan; detta är relevant när man förstärker UI-ytor samtidigt som man behåller CI/CD-automatisering.
LLM/AI-integrationsmönster med Apache Flink för realtidsrörledningar
LLM-system är ofta bara lika bra som sin realtidskontext. Flink passar in i LLM/AI-stackar som komponenten som producerar “alltid färska” funktioner, inbäddningar och beteendeaggregeringar.
Realtidsinbäddningsrörledning med Flink
Ett vanligt mönster är:
- inläsa användaråtgärder/händelser,
- aggregera sessioner och preferenser,
- producera inbäddningsgenereringsuppgifter,
- skriv inbäddningar till en vektorlagring och/eller funktionslagring.
PyFlinks beroendehanteringdokumentation pekar explicit ut “maskininlärningsförutsägelser” och laddning av ML-modeller inuti Python-UDF:s (för fjärrklusterexekvering), vilket direkt motsvarar “onlineinferens inuti Flink-operatörer”-metoder.
Onlineuppdateringar av funktionslagring för rekommendation och rangordning
Flinks nycklade status och kontrollpunktsmodell är byggd för att underhålla operatörstatus över händelser och återhämta den pålitligt. Det är en naturlig matchning för kontinuerlig funktionsberäkning (rullande hastigheter, räkningar, tidsdämpade mätvärden) som downstream-rekommendationer behöver.
Praktiska latens/konsistensavvägningar för AI-rörledningar
Om din arkitektur kräver exakt-en gång-semantik från början till slut (t.ex. undvika duplicerade funktionsuppdateringar eller duplicerade faktureringshändelser), kommer du att strukturera sänkor och källor kring kontrollpunktering och transaktionsgarantier.
I specifikt Kafka-baserade stackar:
- Flinks Kafka-connector kan leverera exakt-en gång-garantier när kontrollpunktering är aktiverat och leveransgaranti-alternativ är konfigurerade.
- Kafka Streams stödjer också exakt-en gång-semantik (EOS), vilket är relevant om din “AI-funktionsrörledning” är liten nog att leva inuti applikationskod istället för ett Flink-kluster.
Arkitekturvy för “Flink som realtids AI-kontextbyggare”

Den här diagrammet är förankrat i Flinks kärnprimitiver: händelsetidsbehandling (vattenmärken), statusbakgrunder (state.backend.type och systemhanterad lokal status) och kontrollpunkts/sparpunktsmekanismer för felhantering och operationer.