VecRuntime vs Gluten + Velox vs DataFusion Comet on TPC-DS 3 TB, AWS Graviton4

VecRuntime runs Spark SQL's filters, projections, aggregates, sorts and joins on Arrow-layout batches with the Java Vector API -- on the JVM, no native code -- and moves batches between executors over its own Arrow Flight shuffle. awslabs data-on-eks publishes TPC-DS 3 TB results for two native engines, Gluten + Velox and DataFusion Comet, on twelve Graviton4 nodes. This page runs VecRuntime on the same generated data, the same instance type and count and the same executor layout, and sets its times against theirs.

VecRuntime, 300 partitions
1,069 s
103 queries · 2.10x Gluten · 2.31x Comet
Gluten + Velox 1.6.0 / Comet 0.16.0
2,240 / 2,467 s
data-on-eks's published runs

Summary

EngineCompletion time (s)vs Glutenvs CometPer-query geomean vs Gluten / CometFaster than Gluten / Comet on
VecRuntime (300 partitions)1,069.12.10x2.31x1.74x / 1.71x92 / 94
Gluten + Velox 1.6.02,239.9
DataFusion Comet 0.16.02,467.5

Where each engine is ahead

VecRuntime (300) vs GlutenQueries
2x+ faster31
1.25-2x faster53
up to 1.25x faster8
up to 1.25x slower6
1.25x+ slower5
VecRuntime (300) vs CometQueries
2x+ faster38
1.25-2x faster34
up to 1.25x faster22
up to 1.25x slower5
1.25x+ slower4

Largest leads

QueryVecRuntime (s)Gluten (s)Comet (s)vs Glutenvs Comet
q7211.8193.532.516.33x2.74x
q9511.8106.769.29.04x5.87x
q8810.576.558.27.29x5.55x
q221.910.18.45.43x4.49x
q27.227.829.93.84x4.13x
q921.782.055.33.77x2.54x
q304.214.28.83.39x2.11x
q602.36.97.23.05x3.20x
q452.26.46.32.96x2.88x
q23b38.6113.7242.62.95x6.29x

Where VecRuntime is behind

Queries where Gluten or Comet is faster than VecRuntime at 300 partitions, by the gap to the faster of the two (seconds).

QueryVecRuntime 300GlutenCometGap
q8714.611.212.5+3.4
q3814.311.112.5+3.1
q9911.08.013.5+3.0
q16.14.73.7+2.5
q583.02.31.8+1.2
q7847.546.467.6+1.1
q831.71.51.2+0.6
q9713.413.117.4+0.3
q39b3.12.86.7+0.3
q612.53.32.2+0.3
q410.70.60.5+0.2
q211.41.41.2+0.2
q732.12.62.1+0.0

Benchmark infrastructure

Methodology. The dataset was generated with data-on-eks's own generator image and arguments, and VecRuntime ran on the node type, node count and executor layout of their benchmark (23 executors x 5 cores, 58 GB each), at 300 shuffle partitions with AQE coalescing against their 200, and on S3A's classic input stream. The run had the cluster to itself; each query ran once after the plan was compiled, and its time is the wall-clock of its execution as the runner measures it.

Test environment

ComponentConfiguration
DatasetTPC-DS scale factor 3000 (3 TB), Parquet on Amazon S3, generated with the data-on-eks generator image and arguments unchanged (103 query variants)
ClusterAmazon EKS; 12 x r8gd.12xlarge (48 vCPU AWS Graviton4, 384 GB, local NVMe as RAID0 for shuffle and spill), the data-on-eks benchmark's instance type and count
Executors23 executors x 5 cores x 58 GB each, as data-on-eks (Gluten / Comet: 20 GB heap + 6 GB overhead + 32 GB off-heap); VecRuntime: 35 GB heap + 23 GB overhead; driver 5 cores x 24 GB
StorageAmazon S3 through Hadoop 3.4.3 S3A with the classic input stream (fs.s3a.input.stream.type=classic, the Analytics Accelerator off, #835)

Versions

ComponentVersion
VecRuntimemain at af9d367 (2026-10-18): the native Parquet reader on S3A's classic input stream (#835); arm64 image
Spark (VecRuntime)4.1.3, Scala 2.13, Amazon Corretto 25.0.4.1
Gluten + Velox (data-on-eks)1.6.0 on Spark 3.5.8, Scala 2.12, JDK 17
DataFusion Comet (data-on-eks)0.16.0 on Spark 3.5.8, Scala 2.12, JDK 17

VecRuntime configuration

spark.plugins=io.vecruntime.spark.VectorPlugin
spark.shuffle.manager=org.apache.spark.sql.vecruntime.shuffle.VectorShuffleManager
spark.sql.shuffle.partitions=300   (data-on-eks: 200, Spark's default)
spark.sql.adaptive.enabled=true
spark.sql.adaptive.maxShuffledHashJoinLocalMapThreshold=64MB
spark.vecruntime.exec.strictFloatingPoint=false
spark.hadoop.fs.s3a.connection.maximum=1000, threads.max=256, max.total.tasks=128
spark.hadoop.fs.s3a.input.stream.type=classic   (the Analytics Accelerator off, #835)
Executors: -XX:+UseParallelGC -XX:ParallelGCThreads=5 (data-on-eks runs ParallelGC too); ACCP as the JCA provider
--add-modules=jdk.incubator.vector --enable-native-access=ALL-UNNAMED (driver and executors)

Notes

  • The Gluten and Comet numbers are data-on-eks's published results (the mean of their iterations); they were not re-run here. VecRuntime's are one measured iteration per query.
  • VecRuntime runs at 300 shuffle partitions with AQE coalescing, the setting of its own benchmarks; data-on-eks's Gluten and Comet runs use 200. At 200 partitions on 2026-10-16 (main fac37478, the Analytics Accelerator stream) VecRuntime took 1,118.6 s.
  • VecRuntime reads S3 through S3A's classic input stream, the default of the benchmark launcher since #835.
  • VecRuntime needs the larger overhead (35 GB + 23 GB): at 200 partitions with 44 GB + 14 GB an executor exceeded its container in q93.
  • The engines run on different Spark lines: VecRuntime needs Spark 4.1+ and JDK 25, the data-on-eks Gluten and Comet runs are on Spark 3.5.8 and JDK 17.
  • There is no Apache Spark baseline at 3 TB, so result checksums are not compared against Spark here; every row count and checksum equals the 2026-10-16 run's, and VecRuntime's results match Spark's on the 1 TB runs and in the test suites.
  • The previous versions of this page are kept in benchmarks/results/tpcds-sf3000-doeks-2026-10-16/ (200 partitions) and benchmarks/results/tpcds-sf3000-doeks-2026-10-10/.

Per query

Seconds per query (hover for values; click a legend entry to hide an engine).

All queries

Seconds per query, the fastest engine in bold
QueryVecRuntime 300GlutenCometvs Glutenvs Comet
q16.14.73.70.76x0.59x
q27.227.829.93.84x4.13x
q33.25.04.11.57x1.29x
q432.960.871.81.85x2.18x
q59.911.519.71.15x1.98x
q62.63.94.91.54x1.92x
q75.69.57.31.70x1.31x
q82.23.54.41.63x2.02x
q921.782.055.33.77x2.54x
q103.25.54.11.71x1.27x
q1113.933.333.72.40x2.43x
q121.52.12.41.42x1.58x
q136.411.97.31.88x1.16x
q14a55.576.690.11.38x1.62x
q14b49.571.886.91.45x1.76x
q152.25.16.62.29x2.96x
q169.025.223.72.82x2.64x
q174.84.96.91.01x1.42x
q186.315.310.12.43x1.61x
q192.74.03.31.50x1.23x
q201.33.03.32.40x2.60x
q211.41.41.20.96x0.86x
q221.910.18.45.43x4.49x
q23a36.399.2203.22.73x5.59x
q23b38.6113.7242.62.95x6.29x
q24a42.883.182.81.94x1.93x
q24b41.281.779.61.98x1.93x
q254.95.16.01.05x1.24x
q263.75.75.11.57x1.38x
q274.59.95.62.20x1.24x
q2842.4113.195.22.67x2.25x
q2911.114.226.51.28x2.39x
q304.214.28.83.39x2.11x
q313.710.110.12.69x2.70x
q321.12.51.82.17x1.55x
q332.85.44.11.94x1.46x
q343.14.93.61.58x1.16x
q355.98.010.31.36x1.74x
q363.78.66.02.36x1.66x
q379.612.511.91.30x1.23x
q3814.311.112.50.78x0.88x
q39a3.64.67.21.29x2.02x
q39b3.12.86.70.90x2.16x
q403.56.89.91.95x2.82x
q410.70.60.50.85x0.69x
q421.01.51.31.50x1.28x
q432.74.03.81.45x1.37x
q4424.632.327.81.31x1.13x
q452.26.46.32.96x2.88x
q464.27.76.91.82x1.63x
q4710.118.321.61.81x2.13x
q485.07.85.31.56x1.05x
q498.916.317.71.84x2.00x
q5027.733.2107.51.20x3.88x
q516.48.29.01.27x1.41x
q521.41.91.41.36x1.05x
q533.14.53.61.44x1.15x
q542.93.63.41.23x1.19x
q551.11.61.31.39x1.17x
q561.82.52.01.35x1.07x
q577.615.515.82.05x2.08x
q583.02.31.80.78x0.61x
q595.99.222.71.56x3.87x
q602.36.97.23.05x3.20x
q612.53.32.21.33x0.90x
q624.65.29.41.14x2.06x
q633.14.83.61.54x1.16x
q6435.861.795.21.72x2.66x
q6514.915.517.31.03x1.16x
q665.29.27.51.75x1.44x
q6734.164.850.71.90x1.49x
q682.56.44.32.56x1.71x
q692.34.83.92.10x1.71x
q705.29.011.01.74x2.11x
q712.63.53.01.35x1.15x
q7211.8193.532.516.33x2.74x
q732.12.62.11.22x0.99x
q7411.323.224.72.05x2.18x
q7526.344.745.81.70x1.74x
q7625.261.235.92.43x1.43x
q772.13.42.11.64x1.02x
q7847.546.467.60.98x1.42x
q793.86.04.31.56x1.12x
q809.219.320.72.11x2.26x
q814.010.88.42.74x2.13x
q8210.613.714.41.30x1.37x
q831.71.51.20.86x0.68x
q843.08.08.72.66x2.89x
q856.911.18.01.60x1.16x
q861.84.73.72.61x2.07x
q8714.611.212.50.77x0.86x
q8810.576.558.27.29x5.55x
q893.24.64.01.46x1.27x
q904.89.08.91.88x1.86x
q911.62.11.81.29x1.10x
q921.12.21.61.94x1.40x
q9335.747.7157.11.34x4.40x
q9412.122.022.81.83x1.89x
q9511.8106.769.29.04x5.87x
q9610.013.911.91.39x1.19x
q9713.413.117.40.98x1.29x
q981.74.35.12.50x2.95x
q9911.08.013.50.73x1.23x

Running the benchmark

The cluster runner, the Spark-on-Kubernetes manifests and the image are in the benchmark runner's README; the image builds for arm64 on an arm64 node. run-matrix.sh writes one JSON-lines result file per run; this page is rendered from one of them and data-on-eks's two result CSVs by benchmarks/scripts/render-doeks-page.py. The 1 TB runs against Apache Spark are on the Graviton4 1 TB page.

TPC-DS is a benchmark of the Transaction Processing Performance Council; these results are not audited TPC results and are not comparable to published TPC-DS results. VecRuntime's times are one measured iteration per query; run-to-run variation on the heavy queries is a few percent.