Hudi 129 's equivalent of the Delta log is the timeline in .hoodie/timeline/: every action (commit on COW, deltacommit on MOR, compaction, clean, rollback, replacecommit for clustering) appears as an instant that moves from requested to inflight to completed. Since Hudi 1.0 (December 2024), a completed instant records both its start and its completion time, and old instants move to an LSM-tree history so the timeline stays fast for years of commits.
# The merge-on-read table's timeline and settings: Hudi's log of actions and its table config.
T=/home/dev/v7-l1/ch08/hudi/orders_mer/.hoodie
ls $T/timeline | grep -v history # requested -> inflight -> completed
ls $T/metadata # the metadata table's index partitions
grep -E "^hoodie.(table.(type|version|recordkey.fields|ordering.fields)|record.merge.mode)=" \
$T/hoodie.properties20261002005058114.deltacommit.inflight 20261002005058114.deltacommit.requested 20261002005058114_20261002005101615.deltacommit 20261002005101722.deltacommit.inflight 20261002005101722.deltacommit.requested 20261002005101722_20261002005103626.deltacommit column_stats files hoodie.record.merge.mode=EVENT_TIME_ORDERING hoodie.table.ordering.fields=rev hoodie.table.recordkey.fields=order_id hoodie.table.type=MERGE_ON_READ hoodie.table.version=9
Two delta commits, the load and the upsert, each with its three states. What sets Hudi apart is indexing: an upsert must find the file group that already holds each key, and Hudi keeps indexes for that in its metadata table (.hoodie/metadata, itself a MOR table), here with files and column_stats partitions. A record-level index maps every key to its file group, bloom filters and bucket indexes trade precision for size, and Hudi 1.0 added secondary and expression indexes. Iceberg 129 and Delta locate rows by scanning files that match a predicate; Hudi looks keys up, which pays off for high-volume upserts by key.