Flink est la référence pour le stream processing à faible latence. En entretien Senior, on évalue la compréhension de l event time, du stateful processing et des garanties de livraison.
Dans quel cas choisissez-vous Flink plutôt que Spark Streaming ?
| Spark Streaming | Apache Flink | |
|---|---|---|
| Modèle | Micro-batch (100ms minimum) | True streaming (event by event) |
| Latence | 100ms - 1s | 1-10ms |
| State management | Limité | Très riche (RocksDB) |
| Exactement-une-fois | Possible mais complexe | Natif |
| Idéal pour | Équipes Spark, batch + streaming unified | Latence sub-seconde, état complexe, fraude temps réel |
Quelle est la différence entre event time et processing time dans Flink ?
from pyflink.datastream import StreamExecutionEnvironment
from pyflink.common.time import Time
from pyflink.datastream.window import TumblingEventTimeWindows
env = StreamExecutionEnvironment.get_execution_environment()
# Processing time : l heure système quand l event est traité
# Simple mais incohérent si les events arrivent en retard
stream.window(TumblingProcessingTimeWindows.of(Time.minutes(5)))
# Event time : l heure DANS l event (quand il s est passé)
# Cohérent, mais nécessite des watermarks pour les retardataires
stream \
.assign_timestamps_and_watermarks(
WatermarkStrategy
.for_bounded_out_of_orderness(Duration.of_seconds(10))
.with_timestamp_assigner(MyTimestampAssigner())
) \
.window(TumblingEventTimeWindows.of(Time.minutes(5)))Qu est-ce que le stateful processing dans Flink ? Donnez un exemple concret.
from pyflink.datastream import KeyedProcessFunction
from pyflink.datastream.state import ValueStateDescriptor
# Détecter les sessions utilisateur avec état
class SessionDetector(KeyedProcessFunction):
def open(self, runtime_context):
# État persistant par clé (user_id)
self.last_event_time = runtime_context.get_state(
ValueStateDescriptor('last_event', Types.LONG())
)
self.session_start = runtime_context.get_state(
ValueStateDescriptor('session_start', Types.LONG())
)
def process_element(self, event, ctx):
current_time = event.timestamp
last_time = self.last_event_time.value()
if last_time is None or (current_time - last_time) > 30 * 60 * 1000:
# Nouvelle session (> 30 minutes d inactivité)
self.session_start.update(current_time)
self.last_event_time.update(current_time)
yield eventComment Flink garantit-il exactly-once en cas de panne ?
Comment écrivez-vous un job Flink avec SQL plutôt que l API Java/Python ?
from pyflink.table import EnvironmentSettings, TableEnvironment
env_settings = EnvironmentSettings.in_streaming_mode()
tbl_env = TableEnvironment.create(env_settings)
# Définir la source Kafka
tbl_env.execute_sql("""
CREATE TABLE orders (
order_id STRING,
user_id STRING,
amount DOUBLE,
event_time TIMESTAMP(3),
WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND
) WITH (
'connector' = 'kafka',
'topic' = 'orders',
'properties.bootstrap.servers' = 'kafka:9092',
'format' = 'json'
)
""")
# Agrégation sur une fenêtre temporelle
tbl_env.execute_sql("""
SELECT
TUMBLE_START(event_time, INTERVAL '5' MINUTE) AS window_start,
user_id,
SUM(amount) AS total_amount
FROM orders
GROUP BY TUMBLE(event_time, INTERVAL '5' MINUTE), user_id
""")Dans quels contextes d entreprise voit-on Flink déployé ?
| Niveau | Maitrise | Signal GO | NO-GO |
|---|---|---|---|
| Confirmé | Event time vs processing time, watermarks, Flink SQL | Explique la différence event/processing time, a écrit du Flink SQL | Ne sait pas la différence entre Flink et Spark Streaming |
| Senior | Stateful processing, checkpointing, exactly-once | A implémenté du stateful processing, comprend le checkpointing | Ne sait pas ce qu est le stateful processing |
Premier entretien gratuit. Rapport GO/NO-GO sous 48h.