Skip to content

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

5 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Here is a clean, professional, GitHub-ready README.md based on the complete article you shared.


Real-Time Data Pipeline with Apache Kafka, Apache Flink & PostgreSQL

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.


🚀 Architecture Overview

Producer → Kafka (input_topic)
        → Flink Stream Processor
        → Kafka (output_topic)
        → PostgreSQL Database → Analytics / Reporting

📦 Tech Stack

  • 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

✅ Prerequisites

Make sure you have installed:

  • Docker & Docker Compose
  • Java 8+
  • Maven
  • Python 3 (optional if using Python consumer)

1️⃣ Setup Kafka + PostgreSQL (Docker Compose)

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 -d

Verify containers:

docker ps

Create Kafka topics (optional if not auto-created)

docker 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:9092

2️⃣ Run Apache Flink

Run Flink with Docker

Start JobManager:

docker run -it --rm -p 8081:8081 apache/flink:1.20 jobmanager

Start TaskManager:

docker run -it --rm apache/flink:1.20 taskmanager

Access Flink Dashboard:

➡️ http://localhost:8081


3️⃣ Build & Deploy Flink Streaming Job

Create Maven project:

mvn archetype:generate \
  -DarchetypeGroupId=org.apache.flink \
  -DarchetypeArtifactId=flink-quickstart-java \
  -DarchetypeVersion=1.16.0 \
  -DgroupId=com.example \
  -DartifactId=flink-streaming-job

Update StreamingJob.java:

public 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");
    }
}

Package the JAR:

mvn clean package

JAR output:

target/flink-streaming-job-1.0-SNAPSHOT.jar

Deploy to Flink Dashboard

  1. Go to http://localhost:8081
  2. Click Upload JAR
  3. Select the built JAR
  4. Run the job

4️⃣ Store Processed Data in PostgreSQL

Create a table:

CREATE TABLE processed_data (
    id SERIAL PRIMARY KEY,
    value TEXT
);

Python Kafka → Postgres Consumer

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

📊 Future Enhancements

  • 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

🏁 Conclusion

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.


⭐ Star This Repository

If this project helped you, please ⭐ the repo to support future work!


About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages