Here is a clean, professional, GitHub-ready README.md based on the complete article you shared.
This repository contains a complete, working example of a real-time data pipeline built using:
- Apache Kafka – Real-time message ingestion
- Apache Flink – Stream processing engine
- PostgreSQL – Persistent storage for processed results
This setup demonstrates how data flows from producers → Kafka → Flink → Kafka → PostgreSQL, forming an end-to-end real-time data engineering workflow.
Producer → Kafka (input_topic)
→ Flink Stream Processor
→ Kafka (output_topic)
→ PostgreSQL Database → Analytics / Reporting
- Apache Kafka (via Docker Compose)
- Apache Flink (via Docker or local setup)
- PostgreSQL (via Docker Compose)
- Java + Maven for Flink job
- Python for Kafka → PostgreSQL consumer
Make sure you have installed:
- Docker & Docker Compose
- Java 8+
- Maven
- Python 3 (optional if using Python consumer)
Create a docker-compose.yml file:
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
kafka:
image: confluentinc/cp-kafka:latest
ports:
- "9092:9092"
environment:
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
KAFKA_CREATE_TOPICS: "input_topic:1:1,output_topic:1:1"
postgres:
image: postgres:latest
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: streaming_db
ports:
- "5432:5432"Start services:
docker-compose up -dVerify containers:
docker psdocker exec -it <kafka-container-id> kafka-topics --create \
--topic input_topic --bootstrap-server localhost:9092
docker exec -it <kafka-container-id> kafka-topics --create \
--topic output_topic --bootstrap-server localhost:9092Start JobManager:
docker run -it --rm -p 8081:8081 apache/flink:1.20 jobmanagerStart TaskManager:
docker run -it --rm apache/flink:1.20 taskmanagerAccess Flink Dashboard:
mvn archetype:generate \
-DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-quickstart-java \
-DarchetypeVersion=1.16.0 \
-DgroupId=com.example \
-DartifactId=flink-streaming-jobpublic class StreamingJob {
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "localhost:9092");
properties.setProperty("group.id", "flink-group");
FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<>(
"input_topic",
new SimpleStringSchema(),
properties
);
FlinkKafkaProducer<String> producer = new FlinkKafkaProducer<>(
"output_topic",
new SimpleStringSchema(),
properties
);
env.addSource(consumer)
.map(value -> "Processed: " + value)
.addSink(producer);
env.execute("Flink Kafka Streaming Job");
}
}mvn clean packageJAR output:
target/flink-streaming-job-1.0-SNAPSHOT.jar
- Go to http://localhost:8081
- Click Upload JAR
- Select the built JAR
- Run the job
CREATE TABLE processed_data (
id SERIAL PRIMARY KEY,
value TEXT
);from kafka import KafkaConsumer
import psycopg2
consumer = KafkaConsumer(
'output_topic',
bootstrap_servers='localhost:9092',
auto_offset_reset='earliest',
group_id='postgres-group'
)
conn = psycopg2.connect(
database="streaming_db",
user="user",
password="password",
host="localhost",
port="5432"
)
cursor = conn.cursor()
for message in consumer:
data = message.value.decode('utf-8')
cursor.execute("INSERT INTO processed_data (value) VALUES (%s)", (data,))
conn.commit()
cursor.close()
conn.close()Run the consumer:
python consumer.py- Add a Schema Registry for Kafka
- Deploy to AWS/MSK + Flink on ECS/EKS
- Integrate Grafana for real-time dashboards
- Use Flink windowing/aggregation joins
- Add machine learning inference inside Flink
You now have a fully functional real-time streaming pipeline using:
✔ Kafka for ingestion ✔ Flink for processing ✔ PostgreSQL for storage
This project is a great starting point for real-time analytics, event-driven systems, log processing, and modern data engineering platforms.
If this project helped you, please ⭐ the repo to support future work!