# apache/flink-training architecture

> Architecture diagram of the GitHub repository apache/flink-training, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/apache/flink-training
- Repository: https://github.com/apache/flink-training

## Overview

Apache Flink Training Exercises is a Java/Scala learning repository: learners run streaming jobs over simulated taxi ride and fare events, with exercises and reference solutions covering cleansing, long-ride alerts, hourly tips, and stateful ride/fare enrichment. Shared event schemas and generators supply the jobs; results are emitted by the exercise sinks. The graph emphasizes Java solutions where source evidence is available and retains the documented exercise capabilities. Some implementation details, especially hourly-tips and Scala wiring, are based on the SOURCE INDEX and tree rather than inspected excerpts.

Main entry points: [`rides-and-fares/src/solution/java/org/apache/flink/training/solutions/ridesandfares/RidesAndFaresSolution.java`](https://github.com/apache/flink-training/blob/master/rides-and-fares/src/solution/java/org/apache/flink/training/solutions/ridesandfares/RidesAndFaresSolution.java) (Ride-fare solution), [`common/src/main/java/org/apache/flink/training/exercises/common/sources/TaxiRideGenerator.java`](https://github.com/apache/flink-training/blob/master/common/src/main/java/org/apache/flink/training/exercises/common/sources/TaxiRideGenerator.java) (Ride generator), [`common/src/main/java/org/apache/flink/training/exercises/common/utils/MissingSolutionException.java`](https://github.com/apache/flink-training/blob/master/common/src/main/java/org/apache/flink/training/exercises/common/utils/MissingSolutionException.java) (Solution guard), [`common/src/main/java/org/apache/flink/training/exercises/common/datatypes/TaxiRide.java`](https://github.com/apache/flink-training/blob/master/common/src/main/java/org/apache/flink/training/exercises/common/datatypes/TaxiRide.java) (Ride events)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_shared["Shared data"]
  node_ridegen["Ride generator"]
  node_faregen["Fare generator"]
  node_ride["Ride events<br/>[TaxiRide.java]"]
  node_fare["Fare events<br/>[TaxiFare.java]"]
  node_generator["Data generation<br/>[DataGenerator.java]"]
  node_geo["Geo utilities<br/>[GeoUtils.java]"]
  node_missing["Solution guard"]
  node_ridefare["Enriched pair<br/>[RideAndFare.java]"]
end

subgraph group_cleanse["Ride cleansing"]
  node_cleanse["Cleansing solution"]
  node_cleansingexercise["Cleansing exercise"]
end

subgraph group_alerts["Ride alerts"]
  node_longride["Long-ride solution"]
  node_longexercise["Long-ride exercise"]
end

subgraph group_analytics["Fare analytics"]
  node_hourly["Hourly-tips solution"]
  node_hourlyexercise["Hourly-tips exercise"]
  node_enrichment["Ride-fare solution"]
  node_enrichexercise["Ride-fare exercise"]
end

node_learner(("Learner"))
node_output(("Printed results"))

node_learner -->|"runs"| node_cleansingexercise
node_learner -->|"runs"| node_longexercise
node_learner -->|"runs"| node_hourlyexercise
node_learner -->|"runs"| node_enrichexercise
node_ridegen -->|"emits"| node_ride
node_faregen -->|"emits"| node_fare
node_ride -->|"constructs via"| node_generator
node_fare -->|"constructs via"| node_generator
node_ride -->|"uses"| node_geo
node_cleansingexercise -->|"guards solution"| node_missing
node_longexercise -->|"guards solution"| node_missing
node_hourlyexercise -->|"guards solution"| node_missing
node_enrichexercise -->|"guards solution"| node_missing
node_cleanse -->|"reads stream"| node_ridegen
node_cleanse -->|"emits results"| node_output
node_longride -->|"reads stream"| node_ridegen
node_longride -->|"emits alerts"| node_output
node_hourly -->|"reads stream"| node_faregen
node_hourly -.->|"emits summaries"| node_output
node_enrichment -->|"reads rides"| node_ridegen
node_enrichment -->|"reads fares"| node_faregen
node_enrichment -->|"produces pairs"| node_ridefare
node_enrichment -->|"emits results"| node_output

click node_ridegen "https://github.com/apache/flink-training/blob/master/common/src/main/java/org/apache/flink/training/exercises/common/sources/TaxiRideGenerator.java"
click node_faregen "https://github.com/apache/flink-training/blob/master/common/src/main/java/org/apache/flink/training/exercises/common/sources/TaxiFareGenerator.java"
click node_ride "https://github.com/apache/flink-training/blob/master/common/src/main/java/org/apache/flink/training/exercises/common/datatypes/TaxiRide.java"
click node_fare "https://github.com/apache/flink-training/blob/master/common/src/main/java/org/apache/flink/training/exercises/common/datatypes/TaxiFare.java"
click node_generator "https://github.com/apache/flink-training/blob/master/common/src/main/java/org/apache/flink/training/exercises/common/utils/DataGenerator.java"
click node_geo "https://github.com/apache/flink-training/blob/master/common/src/main/java/org/apache/flink/training/exercises/common/utils/GeoUtils.java"
click node_missing "https://github.com/apache/flink-training/blob/master/common/src/main/java/org/apache/flink/training/exercises/common/utils/MissingSolutionException.java"
click node_ridefare "https://github.com/apache/flink-training/blob/master/common/src/main/java/org/apache/flink/training/exercises/common/datatypes/RideAndFare.java"
click node_cleanse "https://github.com/apache/flink-training/blob/master/ride-cleansing/src/solution/java/org/apache/flink/training/solutions/ridecleansing/RideCleansingSolution.java"
click node_cleansingexercise "https://github.com/apache/flink-training/blob/master/ride-cleansing/src/main/java/org/apache/flink/training/exercises/ridecleansing/RideCleansingExercise.java"
click node_longride "https://github.com/apache/flink-training/blob/master/long-ride-alerts/src/solution/java/org/apache/flink/training/solutions/longrides/LongRidesSolution.java"
click node_longexercise "https://github.com/apache/flink-training/blob/master/long-ride-alerts/src/main/java/org/apache/flink/training/exercises/longrides/LongRidesExercise.java"
click node_hourly "https://github.com/apache/flink-training/blob/master/hourly-tips/src/solution/java/org/apache/flink/training/solutions/hourlytips/HourlyTipsSolution.java"
click node_hourlyexercise "https://github.com/apache/flink-training/blob/master/hourly-tips/src/main/java/org/apache/flink/training/exercises/hourlytips/HourlyTipsExercise.java"
click node_enrichment "https://github.com/apache/flink-training/blob/master/rides-and-fares/src/solution/java/org/apache/flink/training/solutions/ridesandfares/RidesAndFaresSolution.java"
click node_enrichexercise "https://github.com/apache/flink-training/blob/master/rides-and-fares/src/main/java/org/apache/flink/training/exercises/ridesandfares/RidesAndFaresExercise.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_ridegen,node_faregen,node_ride,node_fare,node_generator,node_geo,node_missing,node_ridefare toneBlue
class node_cleanse,node_cleansingexercise toneAmber
class node_longride,node_longexercise toneMint
class node_hourly,node_hourlyexercise,node_enrichment,node_enrichexercise toneRose
class node_learner,node_output toneIndigo
```

## Components

### Shared data

- [Ride generator](https://github.com/apache/flink-training/blob/master/common/src/main/java/org/apache/flink/training/exercises/common/sources/TaxiRideGenerator.java): `common/src/main/java/org/apache/flink/training/exercises/common/sources/TaxiRideGenerator.java`
- [Fare generator](https://github.com/apache/flink-training/blob/master/common/src/main/java/org/apache/flink/training/exercises/common/sources/TaxiFareGenerator.java): `common/src/main/java/org/apache/flink/training/exercises/common/sources/TaxiFareGenerator.java`
- [Ride events](https://github.com/apache/flink-training/blob/master/common/src/main/java/org/apache/flink/training/exercises/common/datatypes/TaxiRide.java): `common/src/main/java/org/apache/flink/training/exercises/common/datatypes/TaxiRide.java`
- [Fare events](https://github.com/apache/flink-training/blob/master/common/src/main/java/org/apache/flink/training/exercises/common/datatypes/TaxiFare.java): `common/src/main/java/org/apache/flink/training/exercises/common/datatypes/TaxiFare.java`
- [Data generation](https://github.com/apache/flink-training/blob/master/common/src/main/java/org/apache/flink/training/exercises/common/utils/DataGenerator.java): `common/src/main/java/org/apache/flink/training/exercises/common/utils/DataGenerator.java`
- [Geo utilities](https://github.com/apache/flink-training/blob/master/common/src/main/java/org/apache/flink/training/exercises/common/utils/GeoUtils.java): `common/src/main/java/org/apache/flink/training/exercises/common/utils/GeoUtils.java`
- [Solution guard](https://github.com/apache/flink-training/blob/master/common/src/main/java/org/apache/flink/training/exercises/common/utils/MissingSolutionException.java): `common/src/main/java/org/apache/flink/training/exercises/common/utils/MissingSolutionException.java`
- [Enriched pair](https://github.com/apache/flink-training/blob/master/common/src/main/java/org/apache/flink/training/exercises/common/datatypes/RideAndFare.java): `common/src/main/java/org/apache/flink/training/exercises/common/datatypes/RideAndFare.java`

### Ride cleansing

- [Cleansing solution](https://github.com/apache/flink-training/blob/master/ride-cleansing/src/solution/java/org/apache/flink/training/solutions/ridecleansing/RideCleansingSolution.java): `ride-cleansing/src/solution/java/org/apache/flink/training/solutions/ridecleansing/RideCleansingSolution.java`
- [Cleansing exercise](https://github.com/apache/flink-training/blob/master/ride-cleansing/src/main/java/org/apache/flink/training/exercises/ridecleansing/RideCleansingExercise.java): `ride-cleansing/src/main/java/org/apache/flink/training/exercises/ridecleansing/RideCleansingExercise.java`

### Ride alerts

- [Long-ride solution](https://github.com/apache/flink-training/blob/master/long-ride-alerts/src/solution/java/org/apache/flink/training/solutions/longrides/LongRidesSolution.java): `long-ride-alerts/src/solution/java/org/apache/flink/training/solutions/longrides/LongRidesSolution.java`
- [Long-ride exercise](https://github.com/apache/flink-training/blob/master/long-ride-alerts/src/main/java/org/apache/flink/training/exercises/longrides/LongRidesExercise.java): `long-ride-alerts/src/main/java/org/apache/flink/training/exercises/longrides/LongRidesExercise.java`

### Fare analytics

- [Hourly-tips solution](https://github.com/apache/flink-training/blob/master/hourly-tips/src/solution/java/org/apache/flink/training/solutions/hourlytips/HourlyTipsSolution.java): `hourly-tips/src/solution/java/org/apache/flink/training/solutions/hourlytips/HourlyTipsSolution.java`
- [Hourly-tips exercise](https://github.com/apache/flink-training/blob/master/hourly-tips/src/main/java/org/apache/flink/training/exercises/hourlytips/HourlyTipsExercise.java): `hourly-tips/src/main/java/org/apache/flink/training/exercises/hourlytips/HourlyTipsExercise.java`
- [Ride-fare solution](https://github.com/apache/flink-training/blob/master/rides-and-fares/src/solution/java/org/apache/flink/training/solutions/ridesandfares/RidesAndFaresSolution.java): `rides-and-fares/src/solution/java/org/apache/flink/training/solutions/ridesandfares/RidesAndFaresSolution.java`
- [Ride-fare exercise](https://github.com/apache/flink-training/blob/master/rides-and-fares/src/main/java/org/apache/flink/training/exercises/ridesandfares/RidesAndFaresExercise.java): `rides-and-fares/src/main/java/org/apache/flink/training/exercises/ridesandfares/RidesAndFaresExercise.java`

### Other components

- **Learner**
- **Printed results**

## Connections

- Learner → Cleansing exercise: runs (evidence: `README.md`)
- Learner → Long-ride exercise: runs (evidence: `README.md`)
- Learner → Hourly-tips exercise: runs (evidence: `README.md`)
- Learner → Ride-fare exercise: runs (evidence: `README.md`)
- Ride generator → Ride events: emits (evidence: `common/src/main/java/org/apache/flink/training/exercises/common/sources/TaxiRideGenerator.java`)
- Fare generator → Fare events: emits (evidence: `common/src/main/java/org/apache/flink/training/exercises/common/sources/TaxiFareGenerator.java`)
- Ride events → Data generation: constructs via (evidence: `common/src/main/java/org/apache/flink/training/exercises/common/datatypes/TaxiRide.java`)
- Fare events → Data generation: constructs via (evidence: `common/src/main/java/org/apache/flink/training/exercises/common/datatypes/TaxiFare.java`)
- Ride events → Geo utilities: uses (evidence: `common/src/main/java/org/apache/flink/training/exercises/common/datatypes/TaxiRide.java`)
- Cleansing exercise → Solution guard: guards solution (evidence: `ride-cleansing/src/main/java/org/apache/flink/training/exercises/ridecleansing/RideCleansingExercise.java`)
- Long-ride exercise → Solution guard: guards solution (evidence: `long-ride-alerts/src/main/java/org/apache/flink/training/exercises/longrides/LongRidesExercise.java`)
- Hourly-tips exercise → Solution guard: guards solution (evidence: `hourly-tips/src/main/java/org/apache/flink/training/exercises/hourlytips/HourlyTipsExercise.java`)
- Ride-fare exercise → Solution guard: guards solution (evidence: `rides-and-fares/src/main/java/org/apache/flink/training/exercises/ridesandfares/RidesAndFaresExercise.java`)
- Cleansing solution → Ride generator: reads stream (evidence: `ride-cleansing/src/solution/java/org/apache/flink/training/solutions/ridecleansing/RideCleansingSolution.java`)
- Cleansing solution → Printed results: emits results (evidence: `ride-cleansing/src/solution/java/org/apache/flink/training/solutions/ridecleansing/RideCleansingSolution.java`)
- Long-ride solution → Ride generator: reads stream (evidence: `long-ride-alerts/src/solution/java/org/apache/flink/training/solutions/longrides/LongRidesSolution.java`)
- Long-ride solution → Printed results: emits alerts (evidence: `long-ride-alerts/src/solution/java/org/apache/flink/training/solutions/longrides/LongRidesSolution.java`)
- Hourly-tips solution → Fare generator: reads stream (evidence: `hourly-tips/src/solution/java/org/apache/flink/training/solutions/hourlytips/HourlyTipsSolution.java`)
- Hourly-tips solution → Printed results: emits summaries
- Ride-fare solution → Ride generator: reads rides (evidence: `rides-and-fares/src/solution/java/org/apache/flink/training/solutions/ridesandfares/RidesAndFaresSolution.java`)
- Ride-fare solution → Fare generator: reads fares (evidence: `rides-and-fares/src/solution/java/org/apache/flink/training/solutions/ridesandfares/RidesAndFaresSolution.java`)
- Ride-fare solution → Enriched pair: produces pairs (evidence: `rides-and-fares/src/solution/java/org/apache/flink/training/solutions/ridesandfares/RidesAndFaresSolution.java`)
- Ride-fare solution → Printed results: emits results (evidence: `rides-and-fares/src/solution/java/org/apache/flink/training/solutions/ridesandfares/RidesAndFaresSolution.java`)
