IT PAPER DEEP-READ · PAPER 19
Chang, Dean, Ghemawat et al. · Google · OSDI 2006
In 2006 Google published Bigtable — the "one giant table" it used internally to store enormous amounts of data. Google Earth's satellite imagery, every web page's historical snapshots, billions of users' personalized data — all of it lived in tables like this, spread across thousands of machines. It's the third of Google's "big three" after GFS (Paper 17) and MapReduce (Paper 18), and the direct ancestor of an entire class of open-source "wide-column" databases like HBase and Cassandra.
The databases we know (the tidy tables-plus-SQL kind behind banks and online stores) are fast and pleasant at a few million or tens of millions of rows. But what Google needed to store was another order of magnitude: one row per web page across the whole web means tens of billions of rows; every time a page is re-crawled you keep another dated version; different pages have different fields, messy and mostly empty. Data this large, this sparse, and forever growing simply doesn't fit — and is far too expensive to force — into a traditional database. Google needed a store built specifically for "absurdly large and loosely shaped" data.
Picture a spreadsheet, but with all three of its limits removed: rows can number in the tens of billions, columns can be added anytime, anywhere, and each cell can hold several timestamped historical versions at once. Crucially it's "sparse" — the vast majority of cells are empty, and empty cells take up no space at all, so you're free to add columns and leave blanks without a care. The table has one more discipline: all rows are kept sorted by name (the row key). So if you just name your rows well (say, write URLs backwards so pages from the same site sit together), related data naturally lands in adjacent positions, and scanning a stretch of it is very fast.
The table is too big for one machine, so it's sliced horizontally into segments by row, each segment (Google calls it a tablet) handed to one machine; because rows are sorted, every slice is a contiguous range. The real cleverness is in how it reads and writes fast without fearing crashes: new data first gets a line in a "running ledger" (kept on the reliable GFS, so it survives a machine burning down), then is dropped into a small "notebook" in memory; when the notebook fills, it's tidied and frozen into a read-only file on disk, and a fresh notebook takes over. To read, you look at the in-memory notebook and the stack of read-only disk files "together" — newer overrides older. This "log first, tidy up in batches, never edit old books" style makes writes fast and lets a crashed machine recover by replaying the ledger. The system also periodically merges a stack of old files into one so reads don't slow down over time.
Bigtable powered Google Analytics, Google Earth, personalized search, the web index, and a raft of other products; by the time of the paper, Google was running hundreds of Bigtable clusters on tens of thousands of machines. The open-source world cloned it into HBase, and fused its data model with Amazon Dynamo's ideas into Cassandra, making "wide-column NoSQL" a major database category. Its engine idea — "write to memory + a log first, then tidy into read-only files" — grew into LevelDB and RocksDB, the foundation of countless databases today. The honest cost: it only guarantees that changes to a single row are all-or-nothing; complex transactions spanning many rows, and SQL-style multi-table joins, it simply won't do — and it's precisely by cutting those that it bought near-infinite horizontal scale.
Bigtable is Google's "one sparse table that grows to petabytes": rows sorted by name and numbering in the billions, columns added at will, cells holding timestamped multiple versions, empty cells free. It slices the table by row across thousands of machines and reads/writes with a "log + write memory, freeze full notebooks into read-only files, merge old files periodically" engine. It drops general transactions and SQL for near-infinite scale — the founding work of wide-column NoSQL.
Want to see what the data model looks like, how three-level addressing locates a single row among thousands of machines, and the memtable + SSTable read/write and compaction mechanics? → Switch to the deep read
Bigtable is a distributed storage system for structured data from Google. It organizes data as a sparse, sorted, multidimensional table — every cell located by a (row key, column, timestamp) triple, its value an uninterpreted string of bytes. The table spans thousands of machines and grows to petabytes: it slices the table into tablets by row-key range across many machines, reads and writes with an LSM-tree-style engine (an in-memory memtable + a stack of read-only SSTables on GFS + periodic compaction), stores files on GFS, and uses Chubby for coordination and leader election. It deliberately gives up the general transactions and SQL of relational databases in exchange for near-infinite horizontal scale. It is the third of Google's "big three," and the direct source of wide-column NoSQL (HBase, Cassandra).
The authors are Fay Chang, Jeffrey Dean, Sanjay Ghemawat, Mike Burrows, and other Google engineers; the paper appeared at OSDI 2006. It is the capstone of Google's "big three" distributed-systems papers, standing on the first two: its data files and logs live on GFS (Paper 17), much of its bulk data prep is done with MapReduce (Paper 18), and coordination and leader election go to Chubby (Burrows, Chubby's author, is on this byline too). Its influence outward is deep: the open-source world cloned it into HBase, and Facebook fused its data model with Dynamo's decentralized distribution into Cassandra; its single-node engine was later distilled by Dean and Ghemawat into the open-source LevelDB, which grew into Facebook's RocksDB, now a storage foundation under countless databases. Google itself kept evolving on top of it — Percolator (adding transactions), Spanner (global consistency) — and exposed it publicly as Cloud Bigtable.
By the mid-2000s Google was full of use cases that both needed to store enormous data and had unusual demands on shape and access: one row per each of billions of web pages, keeping a timestamped version per crawl; Google Earth's terabytes of satellite and map tiles; personalized-search preferences for hundreds of millions of users; assorted intermediate data from crawlers and analysis. What they shared —
Relational databases are built for "medium scale + complex queries"; forcing them onto this "huge scale + simple queries + loose, multi-version" load is both expensive and hard to scale. So Google decided not to be general, but to solve only this class of its own problems: build a store that scales out to thousands of machines, targets sparse multi-version data, and keeps only the barest necessary semantics — trading generality for extreme scale and simplicity.
Bigtable's most elegant move is its data model. The paper defines it in one line: a sparse, distributed, persistent multidimensional sorted map. This map's "key" is a triple; what the "lock" opens to is a string of bytes:
(row key, column, timestamp) → value (uninterpreted bytes)
Its four dimensions, unpacked:
maps.google.com/index.html becomes com.google.maps/index.html), so all pages of one site fall into a contiguous range.family:qualifier, e.g. anchor:cnnsi.com. The column family is the basic unit of access control, and of disk/memory accounting; families should be few (a few hundred at most) and rarely change, while the columns (qualifiers) within a family can be unbounded and added at any time. This satisfies "controllable structure" and "infinitely extensible fields" at once.contents: family holds timestamped versions of the body, the anchor: family has one column per linking source site. Cells are sparse and multi-version; the key is (row, column, timestamp).The table is sorted by row key, so it can be sliced by row-key range into tablets (about 100–200 MB each); the tablet is the basic unit of distribution and load balancing — one tablet server handles a set of tablets, and more machines just means more slices, spread wider. There are three kinds of role: one lightweight master (assigns tablets, monitors servers coming and going, balances load, garbage-collects GFS files, handles table/family creation), many tablet servers (that actually serve reads/writes), and a client library linked into each application.
The hard part: tens of billions of rows slice into a vast number of tablets — how does a client quickly find "which server owns a given row"? Bigtable borrows from the B+ tree with three-level addressing:
Following "Chubby → root tablet → METADATA → user tablet" in three hops locates any row; the paper computes that this structure suffices to address 2³⁴ tablets. Clients also cache the locations they've looked up, so the vast majority of requests never touch the master — precisely why the master stays lightly loaded and never a bottleneck. Who owns a tablet is settled with Chubby locks: each tablet server creates and exclusively holds a lock on a uniquely named file in a Chubby "servers" directory; lock held means alive, lock lost means stop serving. The master watches that directory to discover new servers, and decides whether a server is truly dead or merely partitioned by whether it can grab that server's lock — then safely reassigns its tablets.
This is the most beautiful engineering in the paper, and the most-copied trick since. A tablet's persistent state lives on GFS and consists of three things:
So the read/write path becomes:
Since everything only appends to memory and log and never edits disk in place, memory eventually fills, so three kinds of compaction clean up:
This "write by append, old files read-only, background merges" is exactly the LSM-tree (log-structured merge tree) idea: trade "sequential writes + batch tidying" for very high write throughput and simple fault tolerance. Why this design is both fast and robust — writes never do random in-place disk edits (the most expensive operation on a distributed file system), only sequential appends; SSTables, once written, are immutable, so reading them needs no locking and concurrency is naturally safe, and after a crash recovery is clean: just reload SSTables from GFS and replay the log.
The skeleton above isn't fast enough alone; the paper maxes out performance with a set of pragmatic optimizations:
On a cluster scaling tablet servers from 1 to 500, the paper measured random reads, random writes, sequential reads/writes, and scans with 1000-byte values. The takeaways:
What these numbers convey isn't "it's the fastest database," but rather — under this kind of huge scale and simple load, a restricted but horizontally scalable design can fuse thousands of cheap machines into a near-infinite storage layer.
Bigtable's contribution, like MapReduce's, lies mainly in abstraction and engineering trade-offs, not in any algorithm. It proved one thing: give up the generality of relational databases (general transactions, SQL, joins) and keep only the barest necessary semantics — read/write by row key, range scan, multi-version — and you buy near-infinite horizontal scale. The "wide-column" data model it pioneered — sorted row keys, families + unbounded qualifiers, sparse and multi-version — became a paradigm for a whole class of databases: open-source HBase is nearly a direct clone, Facebook's Cassandra grafted its data model onto Dynamo's decentralized distribution, plus Hypertable, Accumulo, and others. With GFS and MapReduce it forms Google's "big three," together defining what "big-data infrastructure" looks like. Deeper still is the set of ideas it popularized: turn logical locality into physical locality via sorted row keys, the LSM-style "sequential writes + read-only files + background merge" storage engine, trade immutable data for lock-free concurrency, and outsource coordination/leader-election to a small, reliable lock service like Chubby — all inherited by countless later systems. Its single-node engine was further distilled by Dean and Ghemawat into LevelDB, which evolved into RocksDB, now a common foundation under everything from MySQL storage engines to assorted NoSQL stores.
① In one line: Google's distributed structured-data store, organizing data as a "sparse, sorted, multidimensional table" that spans thousands of machines and grows to petabytes, storing files on GFS and coordinating via Chubby.
② Data model: (row key, column, timestamp) → byte value. Rows in lexicographic order, single-row read/write atomic; columns in families (the access-control unit) + unbounded qualifiers; each cell multi-version; sparse (empty cells free).
③ Row key is locality: encode related data into adjacent row keys (e.g. reversed URLs), and it sits together physically for fast range scans.
④ Slicing and roles: sliced by row-key range into tablets (~100–200 MB), served by many tablet servers, assigned/scheduled by a lightweight master, with clients connecting directly.
⑤ Three-level addressing: Chubby → root tablet → METADATA → user tablet, B+-tree-shaped; clients cache locations, so the master stays light and never a bottleneck.
⑥ Engine (LSM): write = append commit log (GFS) + insert into in-memory memtable; read = merge memtable with read-only SSTables; a full memtable is minor-compacted into an SSTable, with merging/major compaction bounding count and clearing deletes.
⑦ Why fast and robust: writes are all sequential appends, no random in-place disk edits; SSTables are immutable → lock-free reads, recovery by replaying the log.
⑧ Tuning: locality groups, ~10:1 compression, Bloom filters to skip seeks, two-level caching, one log per server, and near-free tablet splits via immutability.
⑨ Scale: at publication, 388 internal clusters on ~24,500 tablet servers, backing Google Earth, Analytics, personalized search; a single table up to hundreds of TB.
⑩ Impact and limits: the source of wide-column NoSQL (HBase, Cassandra) and LevelDB/RocksDB; but single-row transactions only, no SQL/secondary indexes, later filled in by Percolator and Spanner.