Speaker: Sean, PMC member and committer on Apache Pinot, and co-founder of StarTree, the company wrapping Pinot as a SaaS solution (1:12:17).

What Pinot is for: real-time OLAP

  • Analytical, not transactional: queries scan large amounts of data and typically touch every row — a very different query pattern from transactional databases (1:12:40).
  • Pinot is pitched as the fastest real-time OLAP database, optimized for high throughput, extremely low latency and high query concurrency (1:18:22).
  • Users span retail, banking, food, and logistics (1:18:22).

Use cases

Use caseDetail
LinkedIn "Who viewed my profile"Computed over months of viewing history and served directly from Pinot with fresh data (1:13:44)
Uber EatsRestaurant owners see revenue, delivery-radius traffic, ordering patterns, supply/demand — Uber is very sensitive to data freshness, so ingestion is kept extremely tight (1:14:29, 1:14:57)
Business metrics & anomaly detectionAnalyze performance, debug what went wrong, root-cause issues (1:15:28)
Internal dashboardsData visualization powered by the analytical database (1:15:28)

Serving targets: on the order of 10,000 queries per second with p99 latency under 100 ms — low enough to query the database live while a user's browser page loads (1:14:11, 1:14:29).

Why real time

  • Aggregate data: value grows with volume — aggregation, ML, drilling into patterns (1:16:06).
  • Individual events: value decays with time. Fraud detection is the canonical case — you want the bank to catch a swiped card immediately, not in a day or two (1:16:43).
  • Industry trend: pushing more real-time data into analytics, and exposing analytics to end users — "user-facing analytics", where user data becomes the product feature (1:17:13).
  • User-facing means the QPS ceiling moves from internal-dashboard scale to hundreds of thousands or millions of queries per second (1:17:52).

Architecture

flowchart LR
    K["Kafka / streaming source"] --> RT["Real-time server<br/>(ingest + index)"]
    B["Batch sources"] --> MIN["Minion<br/>(Spark-like workers:<br/>indexing, pre-aggregation)"]
    MIN --> OFF["Offline server<br/>(long-lived data)"]
    RT --> SEG["Segment store<br/>(S3 / deep store)"]
    OFF --> SEG
    CTRL["Controller<br/>cluster + data management, REST API"] -.-> RT
    CTRL -.-> OFF
    Q["Query"] --> BRK["Pinot broker"]
    BRK --> RT
    BRK --> OFF
  • Split into a real-time server and an offline server, both backed by a segment store (deep store) — typically cloud storage like S3 (1:18:55).
  • The controller handles cluster and data management and exposes the REST management API (1:19:22).
  • Real-time data arrives from Kafka or similar, is written and indexed on the real-time server, and is persisted to the deep store (1:19:22).
  • Batch/offline data is ingested and computed through Minion — Spark-like workers that build indexes and pre-aggregates (1:20:03).
  • The Pinot broker handles all incoming queries (1:20:29).

Segments and indexing philosophy

  • A table is split into chunks called Pinot data segments — groups of columns, plus a lot of indexes to speed up queries (1:20:43).
  • Engineering philosophy: "work smart," not just scan fast. Traditional analytical engines optimize raw scan speed; Pinot invests in indexing to minimize how much data is scanned at all, and in pre-aggregation so frequent queries aren't recomputed (1:21:21).
  • Index types: inverted, sorted, range, and geospatial — the latter avoids computing latitude/longitude per query, so a polygon query already knows which points fall inside (1:22:24).

The star-tree index — the headline feature

  • The trade-off it addresses (1:22:24, 1:23:18):
    • Full materialized view / key-value pre-aggregate: O(1) lookup, but you must store every combination.
    • Raw table: no extra storage, but computing the aggregate scans the entire table → high latency.
  • The star-tree index makes this a tunable trade-off rather than an either/or: you choose a point on the sliding latency-vs-storage curve (1:23:18, 1:24:10).
  • The measured result: LinkedIn's "who viewed my profile", previously a materialized view on a key-value store, needed ~1,000 machines to serve 1,000 QPS. With Pinot it serves 5,000 QPS on ~75 machines (1:24:10, 1:24:39).

Pluggable architecture

  • Designed to be pluggable and extensible for contributors, via multiple SPIs (1:24:39):
    • Pinot Segment SPI — plug in your own data structure or storage format.
    • Pinot Query SPI — plug in your own query engine implementation (1:25:12).
  • Recent work: a multi-stage query engine supporting more join types (1:25:40).
  • For joins, Pinot applies heuristics to co-locate data so work happens locally instead of via cross-node exchange (1:26:02).

Closing note

  • Pinot was built internally at LinkedIn for user-facing analytics. LinkedIn also produced Kafka (which became Confluent); Pinot is the other famous system to come out of it (1:26:17).