Skip to content

Add StarRocks Parquet entries (single, partitioned) and Doris Parquet single variant - #1461

Merged
alexey-milovidov merged 14 commits into
mainfrom
parquet-variants-starrocks-doris
Aug 19, 2026
Merged

Add StarRocks Parquet entries (single, partitioned) and Doris Parquet single variant#1461
alexey-milovidov merged 14 commits into
mainfrom
parquet-variants-starrocks-doris

Conversation

@alexey-milovidov

Copy link
Copy Markdown
Member

Adds three parquet-in-place entries:

starrocks-parquet / starrocks-parquet-partitioned

Same local 1 FE + 1 BE cluster as the starrocks entry, but querying the parquet files in place through a view over the FILES() table function (file:// protocol) instead of loading them into StarRocks storage. Two data-format quirks required fixups in the view:

  • The files store EventTime as raw INT64 epoch seconds and EventDate as raw INT32 epoch days (no parquet logical types), so the view converts them to DATETIME/DATE. Without this, predicates like EventDate >= '2013-07-14' silently match zero rows.
  • The partitioned files (unlike the single hits.parquet) lack the String annotation on their BYTE_ARRAY columns, so those infer as VARBINARY and string queries fail with Error statistic type : varbinary; the view casts them back to VARCHAR — the equivalent of duckdb-parquet's binary_as_string=True.

Validated locally on an arm64 box with StarRocks 4.0.2: all 43 queries pass on both variants, spot-checked results (including exact COUNT(DISTINCT) and the minute-truncation query) are identical to clickhouse-local over the same files, and the view survives the stop/start cold cycle the harness performs before every query.

doris-parquet-single

Sibling of doris-parquet (which reads the 100 partitioned files) over the single hits.parquet, again via the local() TVF. One improvement over the sibling: load moves the file the harness already downloaded into the BE dir instead of downloading a second 14 GB copy. Not validated locally (Doris ships no arm64 tarball) — the PR benchmark run will cover it.

🤖 Generated with Claude Code

… single

Three new parquet-in-place entries:

- starrocks-parquet / starrocks-parquet-partitioned: same local 1 FE +
  1 BE cluster as the starrocks entry, but querying the parquet files
  in place through a view over the FILES() table function (file://
  protocol) instead of loading them into StarRocks storage. The files
  store EventTime/EventDate as raw epoch ints (no parquet logical
  types), so the view converts them to DATETIME/DATE — otherwise date
  predicates silently match nothing; the partitioned files additionally
  lack the String annotation on BYTE_ARRAY columns, so those are cast
  back to VARCHAR (the duckdb-parquet binary_as_string equivalent).
  Validated locally on arm64: all 43 queries pass on both variants,
  with spot-checked results identical to clickhouse-local over the
  same files, and the view survives the stop/start cold cycle.

- doris-parquet-single: sibling of doris-parquet (which reads the 100
  partitioned files) over the single hits.parquet. Unlike the sibling,
  load moves the file the harness already downloaded into the BE dir
  instead of downloading a second 14 GB copy.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@alexey-milovidov
alexey-milovidov deployed to benchmark-approval August 18, 2026 19:11 — with GitHub Actions Active
@github-actions

Copy link
Copy Markdown
Contributor

The run of doris-parquet-single on c6a.4xlarge did not produce results.

Logs:

The first PR benchmark run failed at view creation with
"Can not build local(): No available backend": the start script waited
for a non-empty SHOW BACKENDS column by position, which passes as soon
as the backend row exists, so ./load ran create.sql against a
still-initializing BE.

Wait for Alive=true instead, locating the column by header name (the
position shifts between Doris versions), fail loudly if the BE never
comes up, and make ./check require an alive BE too so the harness'
check loop gates the load and every per-query cold restart.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@alexey-milovidov
alexey-milovidov deployed to benchmark-approval August 18, 2026 21:51 — with GitHub Actions Active
@alexey-milovidov

Copy link
Copy Markdown
Member Author

The first doris-parquet-single run failed at view creation with Can not build local(): No available backend. Root cause: the Doris start script (inherited from doris-parquet) waits for a non-empty SHOW BACKENDS column by position, which passes as soon as the backend row exists — so ./load ran create.sql against a still-initializing BE. The doris-parquet sibling masks this race by re-downloading the whole dataset inside ./load (~2.5 extra minutes), which this entry deliberately doesn't do.

Fixed in 697d7a5: ./start now waits for Alive=true (column located by header name, since positions shift between Doris versions) and fails loudly on timeout, and ./check also requires an alive BE, so the harness' check loop gates the load and every per-query cold restart. The sibling doris-parquet carries the same latent race — worth porting the fix there if this run confirms it (left out of this PR to avoid re-benchmarking an unchanged entry).

🤖 Generated with Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

Results for starrocks-parquet are ready for: c6a.4xlarge.
Results for starrocks-parquet-partitioned are ready for: c6a.4xlarge.
The result files are committed as 88f59f2.
The run of doris-parquet-single on c6a.4xlarge did not produce results.

Logs:

The Alive-gated retry showed the real failure: the 3.0.5 BE never
becomes alive on the current Ubuntu 24.04 benchmark image ("FE is up
but no BE is alive" for the full 15-minute wait). The doris entry
already moved to 4.1.0-rc01; use the same tarball and be.conf cache
settings here. Also make ./check print SHOW BACKENDS status and the
tail of be.out when no BE is alive — the harness surfaces the last
failing ./check stderr on timeout, so a BE startup crash becomes
self-diagnosing in the benchmark log instead of invisible.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@alexey-milovidov
alexey-milovidov deployed to benchmark-approval August 18, 2026 22:19 — with GitHub Actions Active
@github-actions

Copy link
Copy Markdown
Contributor

Results for starrocks-parquet are ready for: c6a.4xlarge.
Results for starrocks-parquet-partitioned are ready for: c6a.4xlarge.
The result files are committed as 3329a1e.

Logs:

@github-actions

Copy link
Copy Markdown
Contributor

Results for starrocks-parquet are ready for: c6a.4xlarge.
Results for starrocks-parquet-partitioned are ready for: c6a.4xlarge.
The result files are committed as d96620c.
The run of doris-parquet-single on c6a.4xlarge did not produce results.

Logs:

…nostics

The 4.1.0 run showed the BE registers but never turns Alive — and on
4.x even `SELECT 1` fails with "No backend available as scan node", so
the previous ./check aborted before printing its diagnostics, and the
start script's FE wait (polling SELECT 1) burned its full timeout
before ADD BACKEND ran.

- Pin priority_networks = 127.0.0.1/32 in both fe.conf and be.conf so
  the FE's saved BE address (ADD BACKEND '127.0.0.1:9050') matches the
  address the BE reports in heartbeats; without it the BE self-detects
  the instance's private IP and can stay Alive=false forever (the
  starrocks entry needs the same single-node pin).
- Wait for the FE with SHOW FRONTENDS (FE-only metadata) instead of
  SELECT 1.
- ./check now dumps SHOW BACKENDS state, whether the doris_be process
  is running, and the tail of be.out on every failure path, so the
  next failing benchmark log is self-diagnosing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

The run of doris-parquet-single on c6a.4xlarge did not produce results.

Logs:

The last run's diagnostics showed the BE process is not running and the
FE heartbeat gets Connection refused, but the be.out tail printed
nothing — because `2>/dev/null >&2` points stdout at the already-nulled
stderr. Use `>&2 2>/dev/null`. Also capture start_fe/start_be output to
files (the harness silences ./start, and a launcher that refuses to
start writes only to its own stderr and never creates be.out), and dump
the BE log dir listing, be.INFO tail, and dmesg oom/segfault lines.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

The run of doris-parquet-single on c6a.4xlarge did not produce results.

Logs:

The captured start_be.sh output finally showed the root cause of every
failed run: "Disable swap memory before starting be". cloud-init adds a
16 GB swapfile to every benchmark instance since f236e7b (2026-05-09),
and Doris's BE launcher hard-refuses to run while swap is active — this
is also why the doris and doris-parquet entries have produced no results
since that date. Turn swap off in ./install; parquet-in-place reads the
file from disk and doesn't need the swap headroom the swapfile exists
for.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@alexey-milovidov

Copy link
Copy Markdown
Member Author

Root cause of the doris-parquet-single failures found, and it affects every Doris entry in the repo: cloud-init adds a 16 GB swapfile to all benchmark instances since f236e7b (2026-05-09), and Doris's start_be.sh hard-refuses to launch while swap is active (Disable swap memory before starting be). The launcher's message is invisible in the benchmark logs — it only surfaced after routing start_be.sh output into ./check's failure diagnostics. This is why neither doris nor doris-parquet has produced results since 2026-05-10.

Fixed here for doris-parquet-single with swapoff -a in ./install (d93118b) — parquet-in-place doesn't need the swap headroom the swapfile exists for. The doris and doris-parquet entries need the same one-liner (plus ideally the Alive-gated ./check/./start from this PR) in a follow-up.

🤖 Generated with Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

The run of doris-parquet-single on c6a.4xlarge did not produce results.

Logs:

@github-actions

Copy link
Copy Markdown
Contributor

Results for doris-parquet-single are ready for: c6a.4xlarge.
The result files are committed as b394147.

Logs:

@alexey-milovidov alexey-milovidov added the machine:all PR benchmark on every machine type label Aug 19, 2026
@alexey-milovidov
alexey-milovidov deployed to benchmark-approval August 19, 2026 17:10 — with GitHub Actions Active
@github-actions

Copy link
Copy Markdown
Contributor

The run of doris-parquet-single on c8g.metal-48xl did not produce results.

Logs:

@github-actions

Copy link
Copy Markdown
Contributor

The run of doris-parquet-single on c6a.4xlarge did not produce results.
The run of doris-parquet-single on c8g.4xlarge did not produce results.
The run of starrocks-parquet on c8g.4xlarge did not produce results.
The run of starrocks-parquet on c8g.metal-48xl did not produce results.
The run of starrocks-parquet-partitioned on c8g.4xlarge did not produce results.
The run of starrocks-parquet-partitioned on c8g.metal-48xl did not produce results.
The run of starrocks-parquet-partitioned on t3a.small did not produce results.

Logs:

…arrocks-parquet-partitioned (c6a.4xlarge, c6a.metal, c7a.metal-48xl)
@github-actions

Copy link
Copy Markdown
Contributor

Results for doris-parquet-single are ready for: c7a.metal-48xl.
Results for starrocks-parquet are ready for: c6a.4xlarge, c6a.metal, c7a.metal-48xl.
Results for starrocks-parquet-partitioned are ready for: c6a.4xlarge, c6a.metal, c7a.metal-48xl.
The result files are committed as 5e962b3.
The run of doris-parquet-single on c6a.large did not produce results.
The run of doris-parquet-single on t3a.small did not produce results.
The run of starrocks-parquet on c8g.4xlarge did not produce results.
The run of starrocks-parquet-partitioned on c8g.metal-48xl did not produce results.

Logs:

…arrocks-parquet-partitioned (c6a.2xlarge, c6a.large, c6a.metal, c6a.xlarge, c8g.4xlarge, c8g.metal-48xl)
@github-actions

Copy link
Copy Markdown
Contributor

Results for doris-parquet-single are ready for: c6a.2xlarge, c6a.metal.
Results for starrocks-parquet are ready for: c6a.2xlarge, c6a.large, c6a.xlarge, c8g.metal-48xl.
Results for starrocks-parquet-partitioned are ready for: c6a.2xlarge, c6a.large, c6a.xlarge, c8g.4xlarge.
The result files are committed as cf47f95.
The run of doris-parquet-single on c6a.xlarge did not produce results.

Logs:

@github-actions

Copy link
Copy Markdown
Contributor

Results for starrocks-parquet are ready for: c8g.4xlarge, c8g.metal-48xl.
Results for starrocks-parquet-partitioned are ready for: c8g.4xlarge, c8g.metal-48xl.
The result files are committed as 023b851.

Logs:

@github-actions

Copy link
Copy Markdown
Contributor

Results for starrocks-parquet are ready for: t3a.small.
The result files are committed as aac1500.

Logs:

@alexey-milovidov alexey-milovidov self-assigned this Aug 19, 2026
@alexey-milovidov
alexey-milovidov merged commit a0cfdad into main Aug 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

machine:all PR benchmark on every machine type

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant