Deployment guide

Apache Pinot

Overview

Apache Pinot is an open-source, real-time distributed OLAP datastore built for low-latency, high-concurrency analytics over streaming and batch data at scale. It serves sub-second queries through a columnar store, pluggable indexes and a distributed query engine. It also ships a web console hosted by the Pinot Controller.

This image gives you Apache Pinot 1.4.0 on OpenJDK 17 as a single-VM quickstart topology on Azure. It generates a unique console login on the first boot of every VM and is backed by 24/7 SecureAnyCloud support.

What you get:

  • Apache Pinot 1.4.0 running on OpenJDK 17, installed at /opt/pinot
  • A complete single-VM cluster: the bundled Apache ZooKeeper, the Pinot Controller (web console), the Pinot Broker and the Pinot Server, each as its own systemd service and started in dependency order
  • The Pinot Controller console, which has no native authentication, served behind an nginx reverse proxy with HTTP basic auth on port 80
  • A per-VM console password for user admin, generated at first boot and stored in a root-only file
  • A dedicated Azure data disk at /var/lib/pinot that holds ZooKeeper data, the Controller segment store and Server segment storage. It is separate from the OS disk and re-provisioned with every VM.
  • pinot-zookeeper, pinot-controller, pinot-broker, pinot-server and nginx as systemd units, enabled and active
  • 24/7 SecureAnyCloud support

Prerequisites

You need an active Azure subscription, an SSH key pair, and a VNet and subnet in the target region.

Standard_B4ms (4 vCPU / 16 GiB RAM) is the recommended minimum. Pinot runs several JVM services on one VM and is memory-hungry. Scale up for heavier ingestion and query loads.

For the NSG, allow 22/tcp inbound from your management network and 80/tcp from the networks that need the Pinot console. For public exposure, front the proxy with TLS (see Enabling a trusted certificate).

Step 1 - Deploy from the Azure Marketplace

Sign in to the Azure Portal, choose Create a resource, and search the Marketplace for Apache Pinot by SecureAnyCloud. Select Create.

On Basics, pick your subscription, resource group, region and size (Standard_B4ms or larger). Under Administrator account, choose SSH public key and paste your key. Under Inbound port rules, allow SSH (22) and HTTP (80).

Review the dedicated data disk on the Disks tab. Then choose Review + create and Create.

Step 2 - Deploy from the Azure CLI

Accept the Marketplace terms once, then create the VM and open port 80:

# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:apache-pinot-ubuntu-24-04:default:latest
az vm create \
  --resource-group <your-rg> \
  --name pinot \
  --image sac1647283583153:apache-pinot-ubuntu-24-04:default:latest \
  --size Standard_B4ms \
  --admin-username azureuser \
  --ssh-key-values ~/.ssh/id_ed25519.pub \
  --vnet-name <your-vnet> --subnet <your-subnet> \
  --public-ip-sku Standard
az vm open-port --resource-group <your-rg> --name pinot --port 80 --priority 1010

Step 3 - Connect to your VM

Connect over SSH with the public IP address of the VM:

ssh azureuser@<vm-public-ip>

Step 4 - Confirm the services are running

Pinot runs several JVM services and takes one to three minutes to start fully on first boot. Once it is up, all five systemd units report active, and the unauthenticated nginx health endpoint answers 200. Check both:

systemctl is-active pinot-zookeeper.service pinot-controller.service pinot-broker.service pinot-server.service nginx.service curl -s -o /dev/null -w 'nginx health: %{http_code}\n' http://127.0.0.1/health

All services report active, and GET /health returns 200.

Step 5 - Retrieve your console login

The console username is admin. The first boot of your VM generates a unique password and writes it to a root-only file. Read it with:

sudo cat /root/pinot-credentials.txt

The username is admin. The password is the PINOT_ADMIN_PASSWORD value, and PINOT_URL is the address to open in your browser.

Step 6 - Sign in to the Pinot Controller console

Browse to http://<vm-public-ip>/. When the browser prompts for HTTP basic authentication, sign in with admin and the password from Step 5. You land on the Pinot Controller console, where you can browse tables, run Pinot SQL queries, inspect the cluster topology and manage tenants and segments.

The console has no native authentication, so nginx enforces it. A request with no credentials and a request with the wrong password are both rejected with 401. You can confirm this from the shell. The per-VM password is read from the credentials file and used inline. The no-credentials and wrong-password probes return 401, and the correct password returns 200:

echo "no credentials -> $(curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1/)"
echo "wrong password -> $(curl -s -o /dev/null -w '%{http_code}' -u 'admin:wrong' http://127.0.0.1/)"

The first command prints 401, and the second command also prints 401.

Step 7 - Query the Pinot cluster and health APIs

Pinot exposes a REST API through the same authenticated proxy. Read the Controller health and the live cluster instances. Where the example shows <PINOT_ADMIN_PASSWORD>, substitute the admin password from Step 5:

curl -s -u "admin:<PINOT_ADMIN_PASSWORD>" http://127.0.0.1/health
curl -s -u "admin:<PINOT_ADMIN_PASSWORD>" http://127.0.0.1/instances

The health endpoint reports that the Controller is healthy, and instances lists the registered Controller, Broker and Server instances in the cluster.

Step 8 - Load the quickstart data and run a query

Pinot ships quickstart datasets that you can load to explore the console end to end. In the Query view of the console, select a table and run a Pinot SQL statement such as SELECT * FROM baseballStats LIMIT 10. Then choose Run Query to see the rows returned.

You can also create your own schema and table, then ingest batch or streaming data through the Controller APIs.

Step 9 - Confirm persistence on the data disk

All of Pinot's persistent state lives on the dedicated Azure data disk at /var/lib/pinot. Your ZooKeeper metadata, Controller segment store and Server segments therefore survive reboots and ride into any image you capture. Check the mount and its contents:

findmnt /var/lib/pinot ls /var/lib/pinot

findmnt shows /var/lib/pinot mounted from the data disk, and the directory holds the zookeeper, controller and server subdirectories.

Enabling a trusted certificate

The image serves the console over plain HTTP behind nginx basic auth. For production, terminate TLS at the nginx proxy with a real domain that points at the VM's public IP. Install certbot and request a certificate, replacing the domain with your own. Certbot configures nginx to serve HTTPS on port 443:

sudo apt-get update && sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.example.com

After certbot completes, the Pinot console is reachable at https://your-domain.example.com/ with a browser-trusted certificate. The basic-auth prompt is unchanged.

Backup and maintenance

Your Pinot ZooKeeper metadata, Controller segment store and Server segments live on the data disk at /var/lib/pinot. Snapshot that disk to back up your cluster state and ingested data. The Pinot binaries and single-VM configuration are at /opt/pinot/current.

Keep the OS patched with sudo apt update && sudo apt upgrade. The image already applies all available Ubuntu security updates at build time.

The cluster restarts cleanly in dependency order with sudo systemctl restart pinot-zookeeper pinot-controller pinot-broker pinot-server. Allow one to three minutes for the cluster to come back up.

To change the console password, regenerate the nginx basic-auth entry with sudo htpasswd -B /etc/nginx/pinot.htpasswd admin and reload nginx.

Support

This image is backed by 24/7 SecureAnyCloud support. Contact us by email or chat for help with schemas, table configs, ingestion jobs, Pinot SQL, scaling out to a clustered deployment and TLS.

All product and company names are trademarks or registered trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.

Deploy on Azure

Launch Apache Pinot on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.

View this image

Need Help?

Our support team is available 24/7.

sales@secureanycloud.com

Deploy on Azure