โ† Iliya Angelov Radulov โ€” portfolio

Cloud & Open-Source Data Engineering ยท Azure DP-900 Training ยท Recent Project

Azure vs. Open Source: Four Pipelines, One Verdict

Two ETL projects, each built twice โ€” once on Microsoft Azure, as the hands-on vehicle for DP-900 exam prep, and once entirely open-source and local, purely to see what the difference would actually be. It held up both times.

Azure Data Factory Synapse Analytics Azure Functions SeaweedFS Docker Python / Pandas DP-900
4
Pipelines built โ€” 2 projects ร— 2 platforms each
2ร—
The same undocumented ADF trigger bug, hit on two unrelated projects
โ‚ฌ0
Spent on the open-source side โ€” every cent went to the Azure trial credit

Background

Where this started

The brief was DP-900 (Azure Data Fundamentals) exam prep, and the vehicle was Bee Haven โ€” a beekeeping-data medallion pipeline (bronze โ†’ silver โ†’ gold) on Azure Data Lake Storage Gen2, processing hive sensor readings enriched with weather data via Azure Data Factory and Synapse Spark. As an open-source believer, I also built the same architecture on SeaweedFS โ€” a local, Apache-2.0, S3-compatible object store โ€” originally just to compare tooling, before it grew into a genuine parallel implementation worth documenting on its own.

After Bee Haven, I wanted a second, deliberately small project with real live data, to test something specific: would a genuinely simple automation be simple in Azure? A German electricity-price monitor (fetch a free API daily, clean, store, visualize) seemed like the right size to find out โ€” and, again, got built as a pair: once on Azure, once as a local Docker Compose stack.

What follows is the honest record of both pairs โ€” where each one actually finished, not where it was originally planned to.

The Work

The Four Builds

Same architecture, same data, two platforms each โ€” read any of them on their own.

Bee Haven โ€” Azure

ADF โ†’ Synapse Spark medallion pipeline, weather-enriched, full orchestrator run against fresh data. Scheduled trigger built correctly, never confirmed to fire.

โ†’ Read the full build

Bee Haven โ€” SeaweedFS

The same medallion architecture, rebuilt on a local, open-source, S3-compatible store โ€” genuinely round-trips through the S3 API, browsable via WebDAV, its own real bugs found and fixed.

โ†’ Read the full build

Electricity Prices โ€” Azure

Deliberately "simple" side project โ€” ADF + Azure Functions โ€” that still took most of a day and ten distinct roadblocks to get running.

โ†’ Read the full build

Electricity Prices โ€” Local

Docker Compose + Python + Plotly. Its own three real bugs found and fixed, and โ€” unlike the Azure side โ€” the dashboard actually shipped.

โ†’ Read the full build

Across All Four

The Pattern

The same handful of issues, twice, on two unrelated projects.

๐Ÿ”‘

Identity confusion, every time

Bee Haven needed three separate managed identities each granted their own storage role. The electricity Function App hit the same lesson in a new context: the auto-granted role is almost never for the storage account you actually care about.

โฐ

The undocumented trigger bug, twice

The same silent, non-firing ADF schedule trigger โ€” correctly configured, confirmed "Started," never observed to actually fire โ€” independently on two unrelated projects. A well-documented, long-standing community issue, not a config mistake.

๐Ÿงญ

Wizard defaults built for someone else

Flex Consumption silently blocked on trial subscriptions. A user-assigned identity created by default when nothing asked for one. A resource provider that needs manual, one-time registration before anything works.

๐Ÿ›

Open source's real advantage isn't "no bugs"

SeaweedFS lost a whole bucket once too (no volume mount on the first container). The local electricity build had three genuine logic bugs of its own. The difference was minutes to diagnose and fix, not days.

๐Ÿงฉ

Fewer moving parts, fewer failure classes

No cross-service managed-identity handshake, no black-box trigger, no separate compute tier to provision for a 17-row job โ€” just a script talking directly to storage. Most Azure roadblocks above simply have no equivalent locally, because the layer that could fail isn't there.

Not a Clean Sweep

Being honest about how this actually finished

Two wins, two honest shortfalls โ€” not four identical outcomes

Neither open-source build finished exactly as ambitiously planned, and neither Azure build finished with a perfectly clean scorecard either. The electricity project's local build stayed flat: SeaweedFS sits in the Docker Compose file unused, storage went to the plain filesystem instead โ€” no real S3-API parity attempt like Bee Haven's SW build has. The electricity project's Azure build, meanwhile, never got its dashboard: Power BI Desktop is Windows-only, this was all built on a Mac, and after two working core pipelines in one week, that felt like the right place to stop rather than force it. Bee Haven's Azure trigger has the same shape of gap โ€” built correctly, never confirmed firing. This page states all of that plainly rather than smoothing it into a tidier story than what actually happened.

Status

Where things stand

โœ… Working now

  • Bee Haven Azure โ€” full orchestrator run, weather join, fresh-data validation
  • Bee Haven SeaweedFS โ€” genuine parallel build, S3 API + WebDAV, 2 real bugs fixed
  • Electricity Azure โ€” ingestion, cleaning, and dedupe logic all individually proven correct
  • Electricity Local โ€” working dashboard with heatmap + time series, 3 real bugs fixed

Full Write-Ups

All Four Builds, Plus One More Detour

Same instinct โ€” assignment turns into a working local build โ€” showed up a third time, in a different domain entirely.