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

Query Engine & Catalog Stack

Transparent hierarchical storage in Percy’s sense: Kudu for hot mutable rows, Impala for SQL, cooler data as Iceberg files on RustFS. PostgreSQL is the application front door; impala_fdw carries one Kerberos principal through to Impala and Kudu.

Table metadata lives in a PostgreSQL catalog registry (KuduMetaProvider, SignalsDdlExecutor) and is loaded from the Kudu master. Impala talks to Kudu (STORED AS KUDU) and to Iceberg via the Polaris REST catalog. Applications use Postgres foreign tables: kudu_scan for closed hot-tier shapes, impala_sql for Iceberg and UNION ALL views of hot ∪ warm. The cluster path from DCGM into that union, and the agent-exchange join back to those samples, is the appendix diagram.

Stack

HMS-Free Mode

When -Dsignals.hms_free_mode=true is set, the catalog server bypasses HMS entirely:

OperationStandard PathHMS-Free Path
CREATE TABLE (Kudu)HMS → KuduKuduCatalogOpExecutor → Kudu + PG registry
CREATE TABLE (Iceberg)HMS → PolarisIcebergCatalogOpExecutor → Polaris — PENDING (see below)
DROP TABLEHMS → storageSignalsDdlExecutor → storage + PG registry
Load metadataHMS getTable()TableLoader.loadHmsFree() → Kudu master
CREATE/DROP DATABASEHMSKuduMetaProvider → PG registry

Iceberg DDL/DML through Impala is PENDING — in-fork, gradual, with purpose. The Phase-2 IcebergRESTCatalog.createTable() path exists but its created metadata cannot yet be loaded back by the MultiMetaProvider (2026-08-30 phantom-table incident, #SL.00000027.SCHEMA2), and upstream’s REST-catalog support marks tables ACCESSTYPE_READ (“read-only … not supported yet”, IMPALA-13586) so DML is gated at analysis. Doctrine: this fork will implement the Transparent Hierarchical Storage write path over Kudu and Iceberg through our own efforts. Until then the bridges are signals.ops.iceberg_register (PyIceberg → Polaris) for tier1 DDL and out-of-band settle (HDF5 + IcebergHdf5Register) for tier1 writes — bridges, not the architecture.

Modified Components

Eight Java files implement HMS-free mode in the Impala fork (rch/asf-impala on the rch/devenv line):

FileRole
SignalsDdlExecutorRoutes DDL to Kudu or Iceberg without HMS
KuduMetaProviderPostgreSQL-backed catalog registry (databases + tables)
CatalogOpExecutorHMS-free DDL block before standard switch statement
TableLoaderloadHmsFree() constructs metadata from Kudu master
KuduTableHandles null msClient in load()
FrontendSkips MetaStoreClientPool when HMS-free
JniCatalogZero-size pool in HMS-free mode
CatalogServiceCatalogSeeds default database without HMS

Catalog Registry Schema

The PostgreSQL signals_catalog database stores table registrations:

-- config/impala/catalog_schema.sql
CREATE TABLE catalog_databases (
    db_name TEXT PRIMARY KEY,
    comment TEXT,
    location TEXT,
    created_at TIMESTAMPTZ DEFAULT now()
);

CREATE TABLE catalog_tables (
    db_name TEXT NOT NULL,
    table_name TEXT NOT NULL,
    kudu_table_name TEXT,
    created_at TIMESTAMPTZ DEFAULT now(),
    PRIMARY KEY (db_name, table_name)
);

Current Status

Working (validated end-to-end):

  • CREATE/DROP DATABASE
  • CREATE/DROP TABLE (Kudu, STORED AS KUDU)
  • INSERT INTO (single and multi-row)
  • SELECT with WHERE, ORDER BY, JOINs, GROUP BY, HAVING, subqueries
  • Multiple data types: INT, STRING, DOUBLE, BOOLEAN, BIGINT

Near-term:

  • Iceberg tables via Polaris REST catalog
  • Atlas integration for metadata visibility and tagging

Running the Stack

All services start via devenv or manual scripts:

Statestore  → port 24000  (pure C++, no JVM)
Catalogd    → port 26000  (JVM, HMS-free mode)
Impalad     → port 21050  (JVM, HS2 protocol)
Kudu Master → port 7051
Kudu TServer→ port 7050
PostgreSQL  → port 5455   (signals_catalog DB)

Connect via JDBC:

jdbc:hive2://localhost:21050/default;auth=noSasl