Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Impala

Apache Impala is the SQL engine across Kudu (hot) and Iceberg (warm). Applications reach it through PostgreSQL and impala_fdw.

Role in the Stack

Impala runs in HMS-free mode, eliminating the dependency on the Hive Metastore. DDL operations route through SignalsDdlExecutor to create tables directly in Kudu or via the Polaris REST catalog for Iceberg. Table metadata is loaded from Kudu master (not HMS) at query time.

See Query Engine & Catalog Stack for the full architecture.

Services

ServicePortPurpose
statestore24000Cluster membership, metadata broadcast
catalogd26000Metadata management, DDL execution
impalad21050 (HS2), 21001 (beeswax)Query execution, client connections

Web UIs: statestore :25010, catalogd :25020, impalad :25000.

Connecting

Product default (direction): impala_fdw from PostgreSQL — FDW-only / no-JDBC for apps and agents. HS2 remains the engine wire protocol behind the FDW and for cluster bring-up.

# Interim / ops: direct HS2 (not the long-term app contract)
jdbc:hive2://localhost:21050/default;auth=noSasl

# Prefer: Postgres + CREATE SERVER / FOREIGN TABLE via impala_fdw (see that page)
# impala-shell is broken with Python 3.12 (PY_SSIZE_T_CLEAN)

HMS-Free DDL

-- Databases
CREATE DATABASE sample_db;
DROP DATABASE sample_db;

-- Kudu tables
CREATE TABLE sample_db.events (
  id INT, name STRING, ts BIGINT,
  PRIMARY KEY(id)
) STORED AS KUDU
TBLPROPERTIES('kudu.master_addresses'='127.0.0.1:7051');

-- Iceberg tables (via Polaris — near-term)
CREATE TABLE sample_db.archive (
  id INT, name STRING
) STORED AS ICEBERG
TBLPROPERTIES('iceberg.catalog'='polaris');

Verified Operations

The following have been tested end-to-end in HMS-free mode:

  • CREATE/DROP DATABASE and TABLE
  • INSERT INTO (single and multi-row)
  • SELECT with WHERE, ORDER BY
  • Multi-table JOINs (3-way)
  • GROUP BY with COUNT, SUM, CAST
  • Subqueries with HAVING
  • Data types: INT, STRING, DOUBLE, BOOLEAN, BIGINT

Build

Prefer host tasks so Maven/Ranger isolation stays under .devenv/:

devenv tasks run impala:bootstrap   # toolchain (long first time)
devenv tasks run impala:build       # or scripts/impala-build-isolated.sh

Produces impalad, catalogd, statestored, admissiond under be/build/latest/service/.

Storage default: Kudu-only / no-HDFS

Future (and product) default: Impala is a SQL front end over Kudu (and later non-HDFS object/block stores). HDFS is not a storage tier we run or design for. There is no NameNode/DataNode/YARN in the signals service graph. Catalog is HMS-free (PostgreSQL registry). See Query Engine.

Longer-term object/block storage for the platform is moving toward rustfs and Ceph — not “more Hadoop.” Iceberg warm tier (when present) sits on object storage via modern catalogs (e.g. Polaris), not HDFS.

Build reality today (upstream Impala debt): the tree is still HDFS-first. CMake does find_package(HDFS REQUIRED) (libhdfs), packaging expects libhadoop.so, and the FE still compiles against Hadoop client jars. Bootstrap therefore materializes a Hadoop client/native tarball under toolchain/ even though we never run a Hadoop cluster for Kudu-only tables.

LayerStill wants HadoopProduct default
BE linklibhdfsShould not; link tax until no-HDFS default lands
Package checklibhadoop.soDistro packaging leftover
FE Mavenhadoop-hdfs / client APIsGate/remove for Kudu-only profile
Runtime servicesHDFS/YARNNone

Treat any Hadoop tarball as a temporary link-time SDK, not a product component. Do not document “running Hadoop” as part of devenv services.

Fork direction (rch/devenv): Kudu-only / no-HDFS is the intended default build and runtime profile — not an optional niche. Stub or drop HDFS BE I/O; fail closed on hdfs://; stop requiring libhdfs/libhadoop.so for daemon builds. Same class of interim debt as Ranger JDK 11/Nashorn.