Understanding Apache Flink - A Journey from Core Concepts to Materialised Views
Understanding Apache Flink

Apache Flink, an open-source stream processing framework, is revolutionising the way we handle vast amounts of streaming data. It's designed to process continuous data streams, providing a robust platform for scalable, stateful computations across distributed systems. Originally incubated at the Berlin University as part of the Stratosphere project, Flink was adopted by the Apache Software Foundation in 2014. 

At its core, Flink excels in processing unbounded data streams. It combines the power of stateful computation with a simple, yet effective, data flow model. This enables robust, scalable processing that adapts to the ever-growing demands of big data applications.

 Flink's data flow model is centred around the stream-first approach. Data streams and transformations form the backbone of this model, ensuring a seamless data processing lifecycle, from ingestion to output.

Flink vs Spark: A Comparison

While both Flink and Spark are solid in handling big data, they differ fundamentally in their approach. Both platforms offer SQL abstraction, stateful and stateless computations, and robust clustering capabilities. However, their approaches to stream and batch processing highlight the unique strengths of each framework. Flink has a stream-first nature while Spark is mostly batch-oriented. This distinction is crucial when choosing the right tool for specific data processing needs.


Flink APIs: 

Flink provides a rich set of APIs, including SQL, Table, and DataStream. Each API caters to different levels of abstraction and complexity, offering flexibility to developers.

SQL API: Flink's SQL API allows users to manipulate data streams using standard SQL, which is familiar to most developers. It simplifies complex stream processing tasks, making them more accessible and understandable. It is easy to use (especially for those familiar with SQL) and simplifies stream processing but falls short on flexibility for complex, custom operations.

Table API: This API provides a more abstract way of handling data streams compared to the SQL API. It offers a balanced mix of simplicity and control, allowing for custom operations on data streams while maintaining a level of abstraction.

DataStream API: The DataStream API is the most low-level and powerful among Flink APIs, offering detailed control over stream processing. It's suited for complex operations that require fine-grained control over data streams.

Flink - Eagerly Materialising Views

Flink introduces an innovative approach to materialising views. Unlike traditional databases, it supports the concept of eagerly materialising views, addressing the limitations of regular and materialised views in relational databases. Materialising views is crucial for businesses that need quick access to processed, aggregated, or joined data from large databases. It accelerates data retrieval, which is essential for real-time analytics and decision-making.

Regular views in databases are essentially saved SQL queries. They don't store data but fetch it in real-time upon query execution. Materialised views, however, store data like a cache, making data retrieval faster. Instead of refreshing the entire materialised view, which can be resource-intensive, Flink supports incremental updates. This means only the changed portions of data are updated, enhancing efficiency. The change-log stream in Flink keeps track of these incremental changes.

Flink SQL

Apache Flink's SQL interface aims to harness the power of stream processing using familiar SQL syntax. This integration allows for efficient, real-time data processing, combining the ease of SQL with the robustness of stream processing. Flink SQL provides a unified platform for both batch and stream processing, ensuring consistency and reducing the complexity typically associated with stream processing.

A key concept in Flink SQL is the stream-table duality, which bridges the gap between dynamic streams and static tables. This duality allows tables to be treated as dynamic streams of data and vice versa, enabling seamless transitions and operations between the two. This approach simplifies the processing of streaming data, making it more accessible and intuitive for developers familiar with traditional database operations.

Creating Tables in Flink SQL involves defining the structure and source of data. These tables can be connected to various external systems like Kafka, databases, or file systems. Flink SQL allows for the creation of both real-time dynamic tables and static batch tables, providing flexibility in handling different data sources and formats.

Dynamic tables in Flink SQL are continually updated as new data arrives. This feature is particularly useful in scenarios like monitoring dashboards, real-time analytics, and event-driven applications. For example, a dynamic table can be used to aggregate user activities in real-time, providing up-to-date insights into user behaviour or system performance.

Considerations for Flink SQL

Flink SQL adheres to ANSI SQL standards, ensuring compatibility and ease of integration with existing SQL knowledge and tools. However, when working with specific SQL dialects like MSSQL, some adjustments might be necessary to align with Flink's SQL syntax and capabilities.

The Table API in Flink provides a rich catalogue of functions and the ability to define custom User-Defined Functions (UDFs). These UDFs extend the capabilities of Flink SQL, allowing for custom processing logic and advanced analytics. This feature is particularly useful for scenarios that require specific processing not covered by standard SQL functions.

State Management in Flink

In Apache Flink, state management is a pivotal aspect that enhances its stream processing capabilities. This section delves into the nuances of state management within Flink, exploring various facets that make it a robust choice for handling complex data streams.

Flink categorises its SQL operators into distinct families based on their state handling characteristics. These include stateless operators, which process each record independently, and stateful operators that maintain context across data records. Understanding these families is crucial for optimising query performance and resource management in Flink applications.

The distinction between stateless and stateful operations in Flink is foundational. Stateless operations, like filters or mappings, do not require memory of previous data, making them straightforward but limited in scope. On the other hand, stateful operations, such as window aggregations or joins, keep track of data over time, enabling more sophisticated processing at the cost of increased complexity and resource utilisation.

Flink's Table API introduces the concept of State Time-to-Live (TTL), a feature that automatically purges state data after a specified duration. This capability is particularly beneficial in managing state size and ensuring that the state does not grow indefinitely, thus optimising memory usage and maintaining system performance.

Flink offers various state backends to cater to different application requirements. The HashMap state backend, primarily residing in memory, offers speed but is limited by memory capacity. Conversely, RocksDB, a disk-based state backend, provides scalability and larger state size handling at the expense of lower access speed. The choice between these backends depends on the specific requirements and trade-offs in terms of performance and scalability for a given application.

Fault Tolerance and Checkpointing in Flink

Flink's fault tolerance mechanism is grounded in its checkpointing system, which periodically captures the state of each operator. In case of a failure, Flink can recover the entire data stream processing pipeline to a consistent state using these checkpoints. This system is both efficient and scalable, causing minimal impact on performance. It allows Flink to guarantee exactly-once processing semantics, ensuring that no data is lost or processed twice in case of failures.

Flink Fraud Detection Application

Flink's ability to process large volumes of data in real-time makes it ideal for identifying fraudulent activities as they occur. The application typically involves analysing patterns and anomalies in streaming data, such as transaction records. By utilising Flink's stateful processing, complex event processing, and time-windowing capabilities, the application can effectively detect and flag fraudulent transactions with high accuracy and low latency.

Anatomy of Flink

Understanding Flink’s architecture, including its stream graph, job manager, and task manager, is vital for effectively deploying and managing Flink applications. The Stream Graph is a critical component, representing the topology of a Flink application. It visualises the flow of data through various operations, providing insights into the application’s structure and behaviour. The Job Manager and Task Manager are central to Flink's architecture. The Job Manager orchestrates the distribution of tasks and manages resource allocation, while the Task Manager executes these tasks, processing the data streams. This division of responsibilities is key to Flink's efficiency and scalability.


Apache Flink and its SQL capabilities provide powerful tools for integrating and manipulating data streams, especially in scenarios involving legacy systems and complex data integration challenges. The flexibility to handle state, scalability, and the ease of using SQL on data streams makes Flink a valuable asset in modern data processing and analytics frameworks.

You can watch Vitor's and Erik's talk from the Functional Scala Conference 2023 in the video.