The future that 2016 promised did arrive, but not in the form anyone was selling at the time. Collecting and analysing very large datasets became routine and cheap. The technology that was synonymous with "big data" back then, an on-premises Hadoop cluster, mostly did not survive as the way to do it. Its place has been taken by three things: object storage as the place data lives, open table formats such as Apache Iceberg and Delta Lake that make files behave like database tables, and elastic SQL engines and cloud warehouses that are rented by the second instead of owned.
If you are maintaining a Hadoop-era platform or reading older material and wondering what still applies, this page maps the 2016 stack to what replaced each part and why.
What the 2016 stack looked like
A typical big-data platform in 2016 was a cluster of identical servers, each with many disks, running a distribution from Cloudera, Hortonworks or MapR:
HDFS stored files, replicated three times across the machines.
YARN scheduled jobs onto those same machines.
MapReduce, and increasingly Spark, did the processing.
Hive put a SQL layer and a table catalogue (the metastore) on top of the files.
HBase provided key-based lookups, Sqoop copied data in from relational databases, Flume collected logs, Oozie scheduled workflows, Pig offered a scripting language, and ZooKeeper coordinated all of it.
Kafka was becoming the standard way to move event streams.
The founding idea was data locality: disks were slow and networks slower, so you shipped the code to the machine that held the data.
What happened to it
2016 component
Status now
What does the job today
HDFS
Still maintained; few new deployments
Object storage: Amazon S3, Azure Data Lake Storage, Google Cloud Storage, or S3-compatible stores on premises
Change data capture (Debezium), managed connectors, Spark JDBC
Oozie
Retired to the Apache Attic in 2025
Apache Airflow, Dagster and similar orchestrators
Pig, Flume
Rarely chosen for new work
Spark and SQL; Kafka Connect and log shippers
Kafka
Thriving; ZooKeeper dependency removed in Kafka 4.0
Kafka and Kafka-compatible services
Spark
Thriving
Spark
The vendors consolidated at the same time. Cloudera and Hortonworks merged in a deal that closed in January 2019. MapR's assets were bought by Hewlett Packard Enterprise later that year. Cloudera was taken private in 2021 and now positions its platform around hybrid cloud deployment and Iceberg tables.
Hadoop is not gone: the Apache project still publishes releases, and many large organisations run clusters that work and are paid for. It is simply no longer where new platforms start.
Why the architecture changed
Three shifts undid the assumptions Hadoop was built on.
Storage and compute came apart. In a Hadoop cluster, adding storage meant adding servers, CPUs included, and the cluster ran day and night to keep the data available. Fast networks made data locality unnecessary, so data could sit in cheap object storage while compute clusters were started for a job and shut down afterwards. You pay for storage by the gigabyte and for compute only while queries run. Object stores also became easier to build on: Amazon S3 has given strong read-after-write consistency since December 2020, removing a whole class of workarounds.
Columnar files plus table formats replaced "a directory of files". A Hive table was a folder; a query listed the folder and read what was there. That gave no safe concurrent writes, no way to update or delete a row without rewriting partitions, and slow planning on large tables. Open table formats keep data in Parquet files and add a transaction log of metadata that records exactly which files make up each version of the table. The result is ACID commits, row-level UPDATE, DELETE and MERGE, schema changes without rewriting data, and the ability to query the table as it was at an earlier time.
SQL won. Writing MapReduce jobs in Java turned out to be a bottleneck, not a feature. Cloud warehouses (Snowflake, Google BigQuery, Amazon Redshift) showed that analysts would rather write SQL against a service that needs no cluster administration, and the open-source engines followed.
The lakehouse
A data lake was cheap, flexible file storage with weak guarantees. A data warehouse was a managed SQL database with strong guarantees and a proprietary storage format. The lakehouse is the name for combining them: warehouse behaviour (transactions, schemas, fast SQL) on top of open files in object storage that several engines can read.
Creating and changing an Iceberg table from Spark SQL looks like ordinary database work:
CREATE TABLE lake.web.page_views (
view_id bigint,
user_id bigint,
url string,
viewed_at timestamp
)
USING iceberg
PARTITIONED BY (days(viewed_at));
INSERT INTO lake.web.page_views VALUES
(1, 1001, '/pricing', TIMESTAMP'2026-10-01 09:15:00'),
(2, 1002, '/docs', TIMESTAMP'2026-10-01 09:16:30');
DELETEFROM lake.web.page_views WHERE user_id =1002;
SELECT snapshot_id, committed_at, operation
FROM lake.web.page_views.snapshots
ORDERBY committed_at;
The DELETE is a real row-level delete, which matters for privacy regulations that require erasing one person's data. The last query lists the table's snapshots, one for the insert and one for the delete. Take the snapshot_id of the insert and you can read the table as it was before the delete:
SELECTcount(*) FROM lake.web.page_views VERSION ASOF4348509562937412345;
Replace the number with a snapshot_id from your own output; TIMESTAMP AS OF '2026-10-08 12:00:00' works the same way with a point in time. Here lake is whatever name you gave the Iceberg catalogue in your Spark configuration, and row-level DELETE needs the Iceberg SQL extensions enabled in that session. days(viewed_at) is hidden partitioning: queries filter on viewed_at directly and the engine prunes files, with no separate partition column to remember.
The same files can then be read by another engine. With the catalogue attached, Trino, Snowflake, BigQuery, Athena and DuckDB can all query Iceberg tables. That interoperability is why Iceberg has become the format the large vendors converge on, including Databricks, which created Delta Lake and bought the company founded by Iceberg's creators in 2024.
Not all data is big
The other correction since 2016 is about size. Hardware grew faster than most datasets. A single cloud server can have hundreds of gigabytes of memory, and columnar engines such as DuckDB and ClickHouse process billions of rows on one machine. A great deal of work that was pushed onto clusters a decade ago now fits comfortably on one node.
A query over Parquet files in object storage, from a laptop, with DuckDB:
INSTALL httpfs;
LOAD httpfs;
SELECT date_trunc('day', viewed_at) ASday, count(*) AS views
FROM read_parquet('s3://example-bucket/page_views/*.parquet')
GROUPBYdayORDERBYday;
Replace the bucket path with your own. For a private bucket, give DuckDB credentials first with a CREATE SECRET statement of type s3.
Before designing a distributed system, measure the data. If the tables you actually query are tens of gigabytes, a single PostgreSQL server, a small warehouse or DuckDB will be simpler, cheaper and faster than a cluster.
If you still run Hadoop
A migration usually goes in this order:
Inventory by usage, not by size. Much of what sits in HDFS is never read. Find the tables and jobs that are actually used.
Move storage first. Copy data to object storage (hadoop distcp writes to S3-compatible stores through the s3a:// connector) and point existing Hive tables at the new location.
Convert table formats. Iceberg provides procedures to register or migrate existing Parquet and ORC Hive tables without rewriting the data files.
Move processing. Spark jobs carry over with configuration changes. Hive SQL needs testing on the new engine; dialect differences are small but real. Pig scripts and MapReduce jobs have to be rewritten.
Replace the periphery. Oozie workflows become Airflow DAGs. Sqoop imports become CDC pipelines or scheduled extracts.
Rebuild security deliberately. Kerberos and Ranger policies do not translate automatically to cloud IAM and catalogue permissions.
Common mistakes in the new stack
Small files. Streaming or frequent small inserts create thousands of tiny Parquet files and slow every query. Schedule compaction; every table format provides it.
Never expiring snapshots. Time travel keeps old data files. Without snapshot expiry, storage grows indefinitely, and "deleted" personal data is still physically present.
Forgetting that elastic means unbounded. A warehouse that scales automatically will also bill automatically. Set quotas and query timeouts on day one.
Treating object storage like a file system. Listing is slow and renames are copies. Let the table format track files; do not build logic on directory listings.
Over-partitioning. Partitioning by a high-cardinality column produces the small-files problem by design. Partition by day or month at most, and let the per-file column statistics do the rest.
Select-then-insert breaks under concurrency. Use a unique constraint plus one atomic statement: ON CONFLICT, ON DUPLICATE KEY UPDATE, or UPDLOCK/SERIALIZABLE in SQL Server.
The N+1 query problem: each query takes 1 ms, but there are 301 of them. How to spot it, fix it with eager loading and avoid the cartesian-explosion overcorrection.