Apache Druid vs Apache Pinot

Both are Apache-2.0 real-time OLAP databases for fast queries on streaming data. Druid tends to fit internal dashboards and operational ad-hoc analysis, while Pinot fits high-concurrency, user-facing analytics that need upserts and star-tree indexes.

On this page

Apache Druid vs Apache Pinot: when each one fits best

Choose Apache Druid when the main consumers are internal teams: operations dashboards, analysts running ad-hoc questions against fresh events, and engineers who want a built-in web console with a data loader and query workbench. Druid reads streaming data directly from Apache Kafka and Amazon Kinesis through supervisors, and it loads batch data through native batch (index_parallel) tasks or SQL-based INSERT and REPLACE statements, so one SQL-first workflow can cover both paths. Its README positions it for UIs, operational ad-hoc queries and high concurrency, and its Master, Query and Data server split is easy to reason about when you want to size each role separately. Confirm the concurrency you actually need with a load test against your own query shapes before assuming any engine's headline numbers apply to you.

Choose Apache Pinot when the query surface is a user-facing product that many end users hit at once. Pinot's design leans toward that case: real-time tables support upserts during ingestion, so records that change after arrival can be kept current, and star-tree indexes can precompute aggregations for repeated dashboard-style queries. Its multi-stage query engine lets the broker plan a query across several sets of servers, which matters when you need fact and dimension joins at serving time. The Pinot README describes LinkedIn and Uber origins and a Helm chart for Kubernetes, but you should test the upsert and join patterns you plan to use, because their cost depends on your data model and segment layout.

The decision turns on four things. First, the concurrency profile: a small internal audience and a large external audience call for different capacity planning and different tolerance for latency spikes. Second, update semantics: if events must be corrected or overwritten after ingestion, check how each engine handles that before you commit to a schema. Third, team skills: both engines run on the JVM, but Pinot's README states that its services require JDK 25 or later, so confirm your team's Java and upgrade capacity. Finally, list the external dependencies each cluster needs. Druid requires deep storage, a metadata store such as PostgreSQL, MySQL or Derby, and ZooKeeper, while Pinot uses Apache Helix with ZooKeeper and a deep store for segments. Map those services to your existing operations before you choose.

Which platform fits which scenario

This table maps common workloads to the platform that usually fits better and gives the reason for each choice. Read it as a starting point: where both platforms could work, the last column names what to test before committing. The main takeaway is that the decision usually turns on query shape, record mutability and the Java skills your team already has.

ScenarioBetter fitReason and what to test
Internal BI-style dashboards over event dataDruidDruid ships a built-in web console with a data loader and query workbench, which suits analysts exploring data directly. Test whether your team's SQL and console workflow matches how dashboards are built.
Customer-facing analytics in a product UIPinotPinot's README cites LinkedIn's user-facing use at scale and lists upserts and multitenancy. Test p99 latency for your exact queries under production concurrency before choosing.
High-concurrency query APIsEither, test firstBoth are built for high concurrency and fast queries on streaming data. Benchmark your own query mix, concurrency and segment layout, since published figures come from different workloads.
Mutable records that need upsertsPinotPinot lists upserts during real-time ingestion as a built-in feature. Druid's ingestion model is append-oriented, so confirm how it handles updates to existing rows for your data before choosing it.
Batch-heavy lakehouse loads from object storageEither, test firstPinot's offline tables load CSV, Avro or Parquet, and Druid uses native batch and SQL INSERT or REPLACE. Test load throughput and the operational steps for your file layout.
Small team with limited Java operations experienceDruid, test firstPinot services require JDK 25 or later, and its cluster combines Helix and ZooKeeper. Druid also depends on ZooKeeper and a metadata store, so confirm your team can run either, and compare the number of moving parts.
Streaming from Kafka with time-ordered event analysisEither, test firstBoth read Kafka directly, and Druid also supports Kinesis while Pinot also supports Pulsar. Check which connectors your sources need and how each handles your schema changes.

How Druid and Pinot are built and what that means for operations

Druid and Pinot both split work across role-based server types, but they lean on different external systems to hold cluster state. Those choices shape what you back up, how you upgrade, and how a failed node or lost dependency affects queries and ingestion.

Druid master and query servers

Druid separates Master servers, the Coordinator and Overlord, from Query servers, the Broker and Router. The Coordinator manages segment placement on Data servers, while the Overlord manages ingestion tasks. The Broker routes queries and merges partial results, and the Router sits in front of it as the entry point. Check which of these roles you will run on separate nodes, how many of each you need for your query concurrency, and how a Coordinator or Overlord outage affects new loads versus existing queries. Ask the vendor or your own tests to confirm failover behavior for your deployment size.

Druid data servers and segments

Historical servers hold immutable segments loaded from deep storage, and Middle Managers or Indexers run the tasks that build new segments from streams and batch files. Because segments are written to deep storage, a lost Historical can be rebuilt from that copy rather than from the original source. The operational question is capacity: you need enough Historical disk and memory for the segments you keep, and you should confirm how long a rebalance takes after you add or remove nodes in your environment before you size the cluster.

Druid's three external dependencies

Druid cannot run on its own. It needs deep storage such as S3, HDFS or local disk for segments, a metadata store typically PostgreSQL, MySQL or Derby, and ZooKeeper for discovery, coordination and leader election. Each one becomes a system you must back up, monitor and upgrade on its own schedule. Losing the metadata store is the most disruptive case, because it holds the segment and task state the cluster depends on, so your backup plan should cover it as carefully as the segment store.

Pinot controllers and minions

Pinot's controllers manage cluster state and handle node failures, while minions run background tasks such as segment generation and maintenance. Helix sits on top of ZooKeeper and holds the cluster state with strong consistency, so the controller and ZooKeeper form the coordination core you must keep healthy. Check how many controllers you will run for availability, where minion tasks will execute so they do not starve query servers, and how your team will monitor ZooKeeper quorum, since a quorum loss stops state changes across the cluster.

Pinot brokers, servers and deep store

Brokers route queries and servers host segments and process them. Batch-built segments are pushed to a deep store, and servers download them from there, so the deep store is the recovery source for segments much as it is in Druid. Ask how your team will replicate segments, restore a server from the deep store, and test that restore path before go-live. Also confirm the deep store backend you plan to use, since its availability and throughput directly limit how quickly you can recover or rebalance.

Upgrades and Java runtime

Pinot services require JDK 25 or later to build and run, while Java and JDBC clients continue to target Java 11 bytecode. Druid's upgrade path depends on its own release line and its metadata store schema. For both, plan a rolling upgrade order across roles, test client compatibility, and confirm the JDK and database versions in a staging copy. Recent releases shown on the project pages are a starting point, so check the release notes for each version you plan to run before you commit to a schedule.

Feature comparison: ingestion, SQL, joins, indexing and deployment

This table compares how Apache Druid and Apache Pinot ingest data, expose SQL, handle joins, index segments, isolate tenants and deploy on Kubernetes. Read each row as a question to answer for your workload, and treat any cell that depends on version as something to confirm against the release you plan to run.

CapabilityApache DruidApache Pinot
Stream sourcesReads Apache Kafka and Amazon Kinesis directly through supervisorsReal-time tables ingest from Apache Kafka, Apache Pulsar and AWS Kinesis
Batch sources and formatsNative batch (index_parallel) tasks and SQL-based INSERT and REPLACE statements; confirm the file formats your version supportsOffline tables load batch files such as CSV, Avro or Parquet from HDFS, S3, ADLS and Google Cloud Storage
Mixed batch and streaming in one tableConfirm the approach for your version with the ingestion docsBatch and streaming sources can be combined into a single table for querying
Upserts during ingestionConfirm current upsert behavior for your version before relying on itSupported during real-time ingestion, a listed built-in feature
Index typesConfirm the index set for your version; segments are columnar and compressed by designPluggable timestamp, inverted, star-tree, Bloom filter, range, text, JSON and geospatial indexes
SQL and native query interfacesDruid SQL and native JSON queries over HTTP and JDBCSQL through a query editor and REST API; confirm the dialect and multi-stage features you need
Join supportConfirm join types and limits for your version with the query documentationFact and dimension joins are listed; the multi-stage engine runs queries across several server sets
MultitenancyConfirm tenant isolation options for your version and cluster layoutBuilt-in multitenancy is a listed feature
Web consoleBuilt-in web console with a data loader and query workbenchQuery editor in the platform; confirm its scope for your version
Kubernetes deploymentCommunity druid-operator, referenced from the READMEHelm chart listed in the README
Java runtimeConfirm the JDK version for your release in the docsServices require JDK 25 or later; Java and JDBC clients target Java 11 bytecode

Licensing and what each project charges for

Apache Druid and Apache Pinot are both licensed under the Apache License 2.0, a permissive license that allows commercial use, modification and internal or customer-facing deployment without a license fee. The license governs the code, so your legal review can focus on attribution and notice obligations rather than on feature gating. Both are Apache Software Foundation projects, which means governance sits with a foundation rather than a single company.

  • Druid: licensed under the Apache License 2.0 per the apache/druid repository README and license metadata.
  • Pinot: licensed under the Apache License 2.0 per the apache/pinot README.
  • No paid edition in the supplied facts: neither project lists a commercial edition with locked features, so there is no edition tier to compare on license grounds.
  • Redistribution: if you ship either engine inside a product, confirm attribution and notice requirements with your counsel.
  • Foundation governance: both sit under the Apache Software Foundation, which affects how you assess project continuity.

Confirm the current license text and any NOTICE file contents in each release archive before you ship either one in a product.

Why Pinot's JDK 25 requirement and Druid's dependencies change staffing

The staffing question starts with the runtime. The Pinot README states that Pinot services require JDK 25 or later to build and run, while Java and JDBC clients continue to target Java 11 bytecode. That split matters for ownership: your application teams can keep their client code on the Java 11 bytecode target, but the platform team must run controllers, brokers, servers and minions on a JDK 25 build. Before committing, confirm with the Pinot project which JDK builds your chosen release line supports, and confirm that your image baseline, hardening standard and vulnerability scanner accept JDK 25 for the Java services. If your organization has no JVM operations practice, budget for one.

Druid's staffing profile is different because its weight sits outside the Druid processes. A Druid cluster depends on three external systems: deep storage such as S3, HDFS or local disk for segments, a metadata store typically PostgreSQL, MySQL or Derby, and ZooKeeper for service discovery, coordination and leader election. Someone on your team must own the database backing the metadata store, the object storage access policies for segments, and a ZooKeeper ensemble, in addition to the Druid Master, Query and Data servers. A practical check: list every system the Druid cluster touches and name a person who can restore each one from backup. Ask whether the Druid release you choose is tested against the metadata store and ZooKeeper versions you already run.

Pinot concentrates coordination in a different place. Its controllers manage cluster state through Apache Helix with Apache ZooKeeper, and batch-built segments move through a deep store from which servers download them. Pinot therefore also needs ZooKeeper and deep storage skills, but fewer separate relational dependencies than a typical Druid deployment. Upgrades follow the same logic in both products: the team that owns the cluster must sequence component upgrades, test the JDK or dependency change in a staging cluster, and document a rollback path. Assign upgrade ownership to a named platform engineer, and make that person the approver for any change to the JDK, metadata store or ZooKeeper version.

What drives the running cost of each cluster

No prices are supplied for either platform, so the cost comparison comes down to which components each cluster needs, who runs them, and how often they change. Both Druid and Pinot are self-hosted Apache-2.0 projects, so license fees are not the cost driver; infrastructure, skills, upgrades and support contracts are. Use the cards below to build the scope you send to vendors and integrators.

Infrastructure footprint per cluster

Druid runs Master, Query and Data server roles, while Pinot runs controllers, brokers, servers and minions. Each role is a separate deployment to size, monitor and patch, so the number of nodes you must keep running at idle is often the largest recurring line. Ask for the node count and instance types each role needs at your ingest rate and query concurrency, and whether the proposal assumes separate hosts for each role or co-located roles for a smaller team.

Deep store and storage growth

Druid keeps segments in deep storage such as S3, HDFS or local disk, while Pinot pushes batch-built segments to a deep store that servers download. Object storage charges, egress for segment downloads during rebalancing, and retention policy all recur monthly. Ask each vendor to model storage growth at your retention period and to state whether replication and tiering are included in the scope.

Metadata store and ZooKeeper operations

Druid depends on a metadata store, typically PostgreSQL, MySQL or Derby, and on ZooKeeper, while Pinot uses Helix with ZooKeeper as its state store. Each external system needs backups, patching, failover testing and its own monitoring. Confirm whether the quote covers managed or self-run instances of these dependencies and who owns recovery when ZooKeeper loses quorum.

Skills and on-call load

Operating either cluster well requires people who understand segment lifecycle, ingestion lag, query routing and JVM tuning. Pinot's README states that its services require JDK 25 or later, which narrows the pool of engineers and images your platform team must support. Ask who will be on call for ingestion failures and query latency incidents, and whether the proposal includes runbooks and a handover.

Third-party support and retainers

Both projects are community-maintained Apache projects, so production support comes from your own team, a commercial distributor, or an implementation partner under contract. DeployOpen offers ongoing support, upgrades and continuous testing as retainers, and most engagements are fixed-scope with deliverables agreed in writing. Ask whether support hours, response expectations and upgrade work are priced separately from the initial build.

Upgrade effort and staffing over time

Druid and Pinot both ship releases on their own cadence, and each upgrade touches several roles and dependencies. Druid 38.0.0 was published on October 1, 2026, and Pinot 1.5.1 on June 5, 2026, which shows how often each line moves. Budget for a recurring upgrade cycle and ask the vendor how many upgrade windows per year the retainer assumes, and whether staffing estimates cover a second engineer for coverage.

Moving from Druid to Pinot or back: what transfers and what is rebuilt

This sequence shows which parts of a Druid or Pinot deployment carry over to the other engine and which must be rebuilt from source data. Teams finish with a tested, parallel-run cutover plan rather than an assumption that stored data can be moved as is.

  1. Inventory ingestion specs and supervisors

    Start by listing every ingestion path in the current system: Kafka or Kinesis supervisors, native batch (index_parallel) tasks, and any SQL-based INSERT or REPLACE jobs in Druid, or the real-time and offline table configurations in Pinot. Record the source topics, input formats, partitioning, timestamp columns and retention for each. The engineer who owns the pipelines should sign off on the list. The step is done when every source feeding the datasource or table has a written owner and a documented load path.

  2. Rebuild table and datasource schemas

    Translate each Druid datasource schema into a Pinot schema and table configuration, or the reverse. Map dimensions, metrics, the primary time column and the granularity settings to the target's equivalent concepts, and note where the models differ, such as Druid's time-partitioned segments versus Pinot's segment-based tables with a time column. Have a data architect review the mapping against the query catalog. The step is done when every source field has a target column with a stated type and a reviewer's approval.

  3. Re-model upserts and rollups

    Decide how deduplication and pre-aggregation will work in the target. Druid typically relies on rollup at ingestion and on replacing data by time interval, while Pinot offers upserts during real-time ingestion, which require a primary key and an appropriate stream partitioning setup. Confirm the key choice and the handling of late or duplicate events with the data owners. The step is done when a test dataset produces the same aggregates in both systems within an agreed tolerance.

  4. Re-create indexes and queries

    Rebuild the index configuration for the target engine. In Pinot, this means choosing among inverted, star-tree, Bloom filter, range and other indexes for the columns the dashboards filter and aggregate on. In Druid, it means reviewing the dimension and bitmap choices that suit the workload. Then port each query from Druid SQL or native queries to the target SQL dialect and compare results and latency on production-sized samples. The step is done when every priority query returns matching results and meets the latency target set by the consuming team.

  5. Load history and run both systems in parallel

    Because stored segments generally do not transfer directly between the two engines, reload historical data from the source of record, such as the original Kafka retention window, object storage files or the warehouse. Feed the same live streams into both clusters for a period agreed by the team. Compare row counts, aggregates and freshness on a schedule. The step is done when the two systems show agreed differences only in documented, explained cases.

  6. Cut over consumers and retire the old cluster

    Move dashboards, APIs and embedded analytics to the new endpoint in stages, starting with internal dashboards and then user-facing workloads, with a rollback path kept open. Confirm that access controls, JDBC or REST client configurations and alerting work against the new system. Keep the old cluster read-only until the team agrees it is no longer needed, then decommission it and archive its configuration. The step is done when all consumers point to the new system and the archived configuration has been reviewed.

Where Druid and Pinot implementation projects usually run long

Most of the schedule risk in a Druid or Pinot project sits in the same few places: sizing the cluster, designing the schema and time column, wiring up Kafka or Kinesis ingestion, tuning segments and indexes, securing access, and load testing concurrency. Each one has a decision that is hard to reverse once data is flowing, so the work is front-loaded even when the cluster itself comes up quickly. For Druid, the schema work centers on the __time column and rollup choices in the ingestion spec, since those determine segment granularity and what queries can answer later. For Pinot, it centers on the table config, the time column, and whether a table needs upserts, which changes how primary keys and comparison columns must be modeled from the first record.

Sizing and segment tuning are where teams most often underestimate effort. Druid splits work across Coordinator and Overlord, Broker and Router, and Historical and Middle Manager or Indexer processes, so sizing means matching each role to ingest rate, retention and query concurrency separately. Pinot's controllers, brokers, servers and minions have the same problem. Index choices such as Pinot's star-tree or Bloom filter indexes need to be validated against real query patterns, not assumed. Load testing should run at the concurrency the product will actually reach, with the query mix that dashboards or user-facing features will send, and it should cover ingestion lag during the same window. Ask your vendor or the project documentation to confirm how each engine behaves at your planned peak before committing to a cluster size.

The three most common slips are schema changes after launch, underestimated concurrency, and operating the external dependencies. A new dimension or a changed time grain can force reingestion or a table rebuild, so agree on a schema change process before go-live. Druid depends on deep storage such as S3, HDFS or local disk, a metadata store typically PostgreSQL, MySQL or Derby, and ZooKeeper, and Pinot relies on Apache Helix with ZooKeeper plus a deep store for segments. Backup, restore, and ZooKeeper quorum failure drills are often scheduled late and then compressed. Plan them as part of the core build, and confirm the recovery procedure for each engine with its current documentation and your own storage team.

Questions teams ask before choosing or hiring help

Which is easier to run in-house, Apache Druid or Apache Pinot?

Neither is small to operate, so the answer depends on which moving parts your team already knows. Druid asks you to run Master servers (Coordinator and Overlord), Query servers (Broker and Router) and Data servers (Historical and Middle Manager or Indexer), and it depends on three outside systems: deep storage such as S3, HDFS or local disk, a metadata store typically PostgreSQL, MySQL or Derby, and ZooKeeper. Pinot runs controllers, brokers, servers and minions, with Apache Helix and ZooKeeper holding cluster state and batch segments pushed to a deep store. Teams already fluent in ZooKeeper and a relational metadata database often find Druid's dependency list familiar. Teams that want upserts and a Helm chart for Kubernetes should check Pinot's operating model closely. Run a load test on your own data before deciding.

What drives the cost and effort of running either engine?

Cost has two parts: infrastructure and people. Both Druid and Pinot are Apache License 2.0 projects, so there is no license fee for the software itself. The recurring costs are the cluster nodes, deep storage, the metadata database and ZooKeeper (Druid), or the controllers, brokers, servers and ZooKeeper (Pinot), plus the engineering time to upgrade, monitor and tune them. Effort rises with ingestion volume, the number of tables or datasources, query concurrency, and how often your schemas change. When you request a quote from any implementation partner, ask for the scope in writing, the components in the environment, who handles upgrades, and what monitoring and backup work is included. Ask whether those costs are one-time or recurring.

Can a small team operate Druid or Pinot without dedicated specialists?

A small team can operate either one, but the realistic test is whether it can handle failures, upgrades and capacity changes without a single person becoming the only expert. Druid's separation of master, query and data roles gives clear failure domains, while its three external dependencies add systems to watch. Pinot's split across controllers, brokers, servers and minions, plus a JDK 25 requirement for services, adds a runtime upgrade to plan for. Before committing, ask a partner or your own engineers to rehearse a node loss, a segment rebuild and a version upgrade in a non-production cluster. Keep a runbook for each.

How long does a pilot of Druid or Pinot take?

The pilot length depends on the data sources, the number of query patterns you need to prove, and how much of the cluster you build yourself. Start with one real-time stream (Kafka in both cases, or Kinesis for Druid or Pulsar for Pinot) and one batch load, then measure ingestion lag, query latency and recovery after a node restart. Ask any partner for a written scope with defined deliverables and a timeline agreed before work starts, since most DeployOpen engagements are fixed-scope. Do not accept a duration that is not tied to that written scope.

Should I use upserts in Apache Druid, or is Pinot the better choice for them?

Pinot lists upserts during real-time ingestion as a built-in feature in its README, so it is the more direct fit when records change after they arrive. Druid's documentation should be checked for how it handles updates to existing rows, because the answer shapes your ingestion design. If your workload is mostly append-only events, Druid's stream supervisors reading from Kafka or Kinesis may be all you need. Confirm the update behavior, its limits and its operational cost in the Druid ingestion documentation before you finalize the data model.

How are identity and access handled in Druid and Pinot?

Confirm this in each project's current documentation before you design access, because the answer depends on the version and on what you add around the cluster. Druid provides HTTP and JDBC APIs and a built-in web console with a data loader and query workbench, so you should verify how it authenticates users and restricts access to the console and APIs. Pinot exposes a SQL interface through a query editor and REST API and offers built-in multitenancy, so verify its authentication options and how tenants are isolated. In either case, plan for a gateway or reverse proxy in front of the APIs and console, and record the decisions in your access design.

When does it make sense to bring in outside help for Druid or Pinot?

Outside help makes most sense when the deployment has to meet a fixed deadline, when the team lacks experience with ZooKeeper, Kafka or Kubernetes operations, or when the cluster must pass a compliance review. DeployOpen plans, implements, integrates, hardens, backs up, upgrades and documents self-hosted open-source platforms inside your own infrastructure, and runs fixed-scope engagements with scope, deliverables and timelines agreed in writing. It also offers ongoing support and upgrades as retainers. DeployOpen prepares systems and evidence for compliance assessments but does not issue audit reports or certifications. Ask for a written scope before any work begins.

Which should I choose for internal dashboards versus user-facing analytics?

Choose on the query pattern and audience. Druid's README describes workflows where fast queries and ingest matter, such as powering UIs, operational ad-hoc queries and high concurrency, so it suits both internal exploration and product UIs. Pinot's README reports its LinkedIn deployment powers 50+ user-facing products, which makes it a strong candidate when the analytics is served to end users at high concurrency. For internal dashboards with modest concurrency, either engine can work, and the decision usually turns on upserts, team skills and the dependencies you already operate. Load-test with your own concurrency profile before choosing.

How DeployOpen helps choose, implement or migrate between them

DeployOpen does not favor Apache Druid or Apache Pinot. It plans, implements, hardens, backs up and supports self-hosted open-source platforms inside the client's own infrastructure, whether that is a cloud account, a data center or an air-gapped network. The work starts from a written scope that sets the deliverables and timelines before anything is built. For this decision, a neutral evaluation means testing both candidates against your own workload: your Kafka or Kinesis topics, your event volumes, the dashboards your analysts already use, and the query shapes your product team needs. Ask for the evaluation criteria to be written down before the test starts, so the result reflects your requirements rather than the strengths of either engine.

A proof-of-concept scope usually answers the questions that vendor comparisons leave open. For Druid, that means confirming how supervisors handle your stream, how segments are sized and stored in deep storage, and how the metadata store and ZooKeeper behave under your failure tests. For Pinot, it means checking the upsert configuration if you need current-state records, deciding whether star-tree indexes justify their build cost, and validating the broker and multi-stage query path for your joins. Agree in writing on the data sample, the query set, the failure scenarios and the measures that count as a pass. The output should be a short decision record that names the platform, the open risks and the operating effort your team would take on. The exact effort depends on your environment, so confirm it during scoping instead of assuming it.

If you choose one platform, implementation is only the first phase. Optional retainers cover ongoing support, upgrades and continuous testing after go-live, which matters because both engines have several moving parts to keep current. Ask any provider, including DeployOpen, to state in the scope which upgrades are included, how Druid or Pinot version changes will be tested against your queries, and who owns the runbooks for coordination and storage failures. If you later need to move from one engine to the other, the migration scope should cover re-ingesting history, rebuilding dashboards and query logic, and running both systems in parallel until results match. Those tasks are the real cost of switching, so price them into the decision now.

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.