From b9c55d11611df3b09d1a57e8ff37fc1218d7e2b6 Mon Sep 17 00:00:00 2001 From: Kazuki Kanda <96773362+KazukiKandaKK@users.noreply.github.com> Date: Fri, 2 Oct 2026 13:09:43 +0900 Subject: [PATCH 1/4] Add Apache Kylin 5.0.2-GA ClickBench entry (kylin5/) Adds a kylin5/ entry: Apache Kylin 5.0.2-GA standalone (official Docker image, Spark 3.3.0-kylin-5.2.2, Gluten 1.3.0-kylin-250110). No cube is built; every query is a raw pushdown query against the loaded table. Full load + 43x3 + concurrent-QPS run on c6a.2xlarge against the official 100M-row dataset. 38 of 43 queries completed on all 3 tries; 5 failures are recorded as null (Gluten memory limit on Q9/Q10, Calcite GROUP BY alias resolution on Q19/Q29/Q40). See kylin5/README.md for the full write-up, including the known amd64-only image limitation. The PR description covers additional -m 10G memory testing across smaller instance sizes. --- kylin5/README.md | 117 +++++++++++ kylin5/benchmark.sh | 12 ++ kylin5/check | 8 + kylin5/create.sql | 144 ++++++++++++++ kylin5/data-size | 6 + kylin5/install | 23 +++ kylin5/load | 53 +++++ kylin5/queries.sql | 43 +++++ kylin5/query | 57 ++++++ kylin5/results/20261001/c6a.2xlarge.json | 236 +++++++++++++++++++++++ kylin5/start | 67 +++++++ kylin5/stop | 6 + kylin5/template.json | 12 ++ 13 files changed, 784 insertions(+) create mode 100644 kylin5/README.md create mode 100755 kylin5/benchmark.sh create mode 100755 kylin5/check create mode 100644 kylin5/create.sql create mode 100755 kylin5/data-size create mode 100755 kylin5/install create mode 100755 kylin5/load create mode 100644 kylin5/queries.sql create mode 100755 kylin5/query create mode 100644 kylin5/results/20261001/c6a.2xlarge.json create mode 100755 kylin5/start create mode 100755 kylin5/stop create mode 100644 kylin5/template.json diff --git a/kylin5/README.md b/kylin5/README.md new file mode 100644 index 0000000000..54d9e78148 --- /dev/null +++ b/kylin5/README.md @@ -0,0 +1,117 @@ +# Apache Kylin 5.0.2-GA + +Standalone all-in-one Docker image (`apachekylin/apache-kylin-standalone:5.0.2-GA`), +bundling HDFS, YARN, Zookeeper, Hive, Spark `3.3.0-kylin-5.2.2`, and Gluten +`1.3.0-kylin-250110` (a native ClickHouse-based execution engine Kylin +layers on top of Spark). No cube is built. Every query below is a raw +pushdown query against the loaded `CLICKBENCH.HITS` table, so this does +not measure Kylin's core value proposition (pre-aggregated cubes). + +Kylin 4.x is marked `retired` upstream; `5.0.2-GA` is the Docker Hub +image tag marked "Recommended for users" (no `5.0.3`/`5.0.4` standalone +image exists). The container is not restarted between query tries +(`BENCH_RESTARTABLE=no`), so this is tagged `no-cold`. Load time was +`421.406s`. + +## Memory: `-m 10G`, the vendor default + +Docker Hub's `5.0.2-GA` example specifies `-m 10G`; the quickstart +guide's `-m 8G` example is for the older `5.0-beta` tag, not this one. +Left at the vendor default. Also tested `install`/`start` only (no data +load) on `t3a.small` (2 GiB, fails its own readiness poll from swap +pressure, not an OOM kill) and `c6a.large` (4 GiB, succeeds). +`c6a.xlarge`, `c6a.4xlarge`, `c6a.metal`, and `c7a.metal-48xl` are +untested. + +## Canary config: two keys set, likely no-ops per source + +`./start` sets `kylin.canary.sparder-context-canary-enabled=false` and +`kylin.canary.sqlcontext-enabled=false`, then restarts Kylin once during +initial setup. In 5.0.2's source, `sparder-context-canary-enabled` +matches no config key anywhere; `sqlcontext-enabled` is read by +`KapConfig.getSparkCanaryEnable()`, which already defaults to `false`, +and gates whether `SparkContextCanary` starts (`SparderConfiguration.init()`), +unless an earlier `spark.local=true` check short-circuits that method +first, in which case the gate is never reached at all. Which path +actually runs in this container wasn't checked at runtime, so setting +these two keys to `false` is likely redundant rather than confirmed +inert; they're kept rather than removed. + +## No Parquet rewrite needed + +This build's Spark reads the official `hits.parquet`'s `EventDate` +column (Parquet `INT32`/`UINT_16`) without any rewrite, confirmed by a +separate `SELECT COUNT(*), MIN(EventDate), MAX(EventDate)` returning +`99,997,497` rows and the correct `2013-07-02`..`2013-07-31` range. +`./load` copies the file into HDFS unchanged, so `Data size` equals the +source file's byte length. + +## Query result cache + +Lookup stays on (`kylin.query.cache-enabled` defaults `true`, and this +`query` script doesn't force pushdown). The pushdown success-store path +defaults off (`kylin.query.pushdown.cache-enabled=false`), so no +successful pushdown result is ever cached here. The `ResourceLimitExceededException` +failure-cache path (which bypasses `kylin.query.exception-cache-enabled`) +is never thrown anywhere in 5.0.2's non-test source, so it doesn't +apply to this build's Gluten OOM failures; the ordinary exception cache +(`kylin.query.exception-cache-enabled`) also defaults off. Spark/Gluten's +own internal caching wasn't examined. + +## Load row-count check + +A post-run `COUNT(*) FROM clickbench.hits` returned `99997497` (exact +match), checked after the benchmark, not during it. + +## Known failures (cube-less pushdown, Kylin 5.0.2-GA) + +38 of 43 queries completed on all 3 tries. 5 recorded as `null`: + +- **Q9, Q10**: Gluten aborts with `Memory limit exceeded ... maximum: 1.00 GiB` + on a grouped `COUNT(DISTINCT UserID)` with no `WHERE` filter. Other + `COUNT(DISTINCT)` queries succeed (Q5 unfiltered/ungrouped; + Q11/Q12/Q14/Q23 filtered before grouping); the distinguishing factor + wasn't isolated. +- **Q19, Q29, Q40**: Calcite rejects a `SELECT`-list alias (`m`/`k`/`Src`, + none submitted uppercase or quoted) referenced in `GROUP BY` + (`Column 'M'/'K'/'SRC' not found`), consistent with case-folding + during resolution. This is a validation-time failure before Gluten or Spark + runs. Q19's submitted `extract(minute FROM EventTime) AS m` is + rewritten by Kylin to `MINUTE(EventTime) AS m` before the alias fails, + so the error SQL differs from the submitted SQL. + +`query` treats non-200 HTTP and in-band `isException:true` (HTTP 200) +as failures; `isPartial` isn't inspected. + +## OFFSET + +Q39/41/42/43 contain `OFFSET` and complete; Q40 also contains it but +fails on the alias issue first. Spark itself only gained `OFFSET` +support in 3.4.0 ([SPARK-28330](https://issues.apache.org/jira/browse/SPARK-28330)); +this build's Spark is `3.3.0-kylin-5.2.2`, and how Kylin accepts it +despite that wasn't determined. Completion doesn't confirm the skipped +rows were correct (no independent check against a known-correct offset). + +## Concurrent-QPS + +10 connections, 600s: `0.058` QPS / `0.167` error ratio. Per +`bench_concurrent_qps` (`qps=ok/600`, `error_ratio=err/(ok+err)`, +`%.3f`-rounded), 35/7 is the only pair matching both. All 7 traced by +traceId: 3 match the sequential failures above; 4 are queries that +passed sequentially but failed only under concurrency with +`QueryInterruptChecker: ... Interrupted at the stage of collecting +result`; trigger not isolated. + +## amd64 only + +`5.0.2-GA`'s Docker Hub manifest lists amd64 only; `./install` fails +outright on arm64 hosts (`c8g.4xlarge`, `c8g.metal-48xl`). + +## `./start` idempotency caveat + +`./start` skips the canary-key block whenever the container already +exists, assuming prior setup completed. If an earlier readiness +timeout left the container existing-but-unconfigured, a later `./start` +would skip the block without having applied it. Whether this run hit +that path isn't verifiable from the committed files (the harness +discards `./start`'s stdout). diff --git a/kylin5/benchmark.sh b/kylin5/benchmark.sh new file mode 100755 index 0000000000..82a42a212e --- /dev/null +++ b/kylin5/benchmark.sh @@ -0,0 +1,12 @@ +#!/bin/bash +export BENCH_DOWNLOAD_SCRIPT="download-hits-parquet-single" + +# Full container restart between tries is too slow (bundles SSH, MySQL, +# Zookeeper, Hadoop, Hive, Kylin, Spark, Gluten). Not a durability +# issue: BENCH_DURABLE stays at its default "yes". +export BENCH_RESTARTABLE=no + +# First boot of the full stack; 900s is generous headroom. +export BENCH_CHECK_TIMEOUT=900 + +exec ../lib/benchmark-common.sh diff --git a/kylin5/check b/kylin5/check new file mode 100755 index 0000000000..fc2e36cb33 --- /dev/null +++ b/kylin5/check @@ -0,0 +1,8 @@ +#!/bin/bash +# Same readiness probe ./start uses. +KYLIN_TOKEN=$(printf 'ADMIN:KYLIN' | base64) +REQUEST_AUTH_HEADER_NAME=Authorization +HTTP_AUTH_SCHEME=Basic +curl -sf -m 5 http://localhost:7070/kylin/api/user/authentication \ + -X POST -H "${REQUEST_AUTH_HEADER_NAME}: ${HTTP_AUTH_SCHEME} ${KYLIN_TOKEN}" \ + -H 'Content-Type: application/json' >/dev/null diff --git a/kylin5/create.sql b/kylin5/create.sql new file mode 100644 index 0000000000..f25d2d8062 --- /dev/null +++ b/kylin5/create.sql @@ -0,0 +1,144 @@ +CREATE DATABASE IF NOT EXISTS clickbench; +USE clickbench; + +DROP VIEW IF EXISTS hits; +DROP TABLE IF EXISTS hits_raw; + +CREATE EXTERNAL TABLE hits_raw ( + WatchID bigint, + JavaEnable smallint, + Title string, + GoodEvent smallint, + EventTime bigint, + EventDate int, + CounterID int, + ClientIP int, + RegionID int, + UserID bigint, + CounterClass smallint, + OS smallint, + UserAgent smallint, + URL string, + Referer string, + IsRefresh smallint, + RefererCategoryID smallint, + RefererRegionID int, + URLCategoryID smallint, + URLRegionID int, + ResolutionWidth smallint, + ResolutionHeight smallint, + ResolutionDepth smallint, + FlashMajor smallint, + FlashMinor smallint, + FlashMinor2 string, + NetMajor smallint, + NetMinor smallint, + UserAgentMajor smallint, + UserAgentMinor string, + CookieEnable smallint, + JavascriptEnable smallint, + IsMobile smallint, + MobilePhone smallint, + MobilePhoneModel string, + Params string, + IPNetworkID int, + TraficSourceID smallint, + SearchEngineID smallint, + SearchPhrase string, + AdvEngineID smallint, + IsArtifical smallint, + WindowClientWidth smallint, + WindowClientHeight smallint, + ClientTimeZone smallint, + ClientEventTime bigint, + SilverlightVersion1 smallint, + SilverlightVersion2 smallint, + SilverlightVersion3 int, + SilverlightVersion4 smallint, + PageCharset string, + CodeVersion int, + IsLink smallint, + IsDownload smallint, + IsNotBounce smallint, + FUniqID bigint, + OriginalURL string, + HID int, + IsOldCounter smallint, + IsEvent smallint, + IsParameter smallint, + DontCountHits smallint, + WithHash smallint, + HitColor string, + LocalEventTime bigint, + Age smallint, + Sex smallint, + Income smallint, + Interests smallint, + Robotness smallint, + RemoteIP int, + WindowName int, + OpenerName int, + HistoryLength smallint, + BrowserLanguage string, + BrowserCountry string, + SocialNetwork string, + SocialAction string, + HTTPError smallint, + SendTiming int, + DNSTiming int, + ConnectTiming int, + ResponseStartTiming int, + ResponseEndTiming int, + FetchTiming int, + SocialSourceNetworkID smallint, + SocialSourcePage string, + ParamPrice bigint, + ParamOrderID string, + ParamCurrency string, + ParamCurrencyID smallint, + OpenstatServiceName string, + OpenstatCampaignID string, + OpenstatAdID string, + OpenstatSourceID string, + UTMSource string, + UTMMedium string, + UTMCampaign string, + UTMContent string, + UTMTerm string, + FromTag string, + HasGCLID smallint, + RefererHash bigint, + URLHash bigint, + CLID int +) +STORED AS PARQUET +LOCATION 'hdfs:///clickbench/hits_dir'; + +CREATE VIEW hits AS +SELECT + WatchID, JavaEnable, Title, GoodEvent, + CAST(from_unixtime(EventTime) AS TIMESTAMP) AS EventTime, + date_add(DATE '1970-01-01', EventDate) AS EventDate, + CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, + URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, + URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, + ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, + UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, + IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, + TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, + WindowClientWidth, WindowClientHeight, ClientTimeZone, + CAST(from_unixtime(ClientEventTime) AS TIMESTAMP) AS ClientEventTime, + SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, + SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, + IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, + IsParameter, DontCountHits, WithHash, HitColor, + CAST(from_unixtime(LocalEventTime) AS TIMESTAMP) AS LocalEventTime, + Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, + OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, + SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, + ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, + SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, + ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, + OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, + UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID +FROM hits_raw; diff --git a/kylin5/data-size b/kylin5/data-size new file mode 100755 index 0000000000..18385c388a --- /dev/null +++ b/kylin5/data-size @@ -0,0 +1,6 @@ +#!/bin/bash +set -euo pipefail +# HDFS logical length of the loaded file (hdfs dfs -du -s column 1, +# not disk_space_consumed_with_all_replicas), not the host download. +sudo docker exec kylin5-clickbench hdfs dfs -du -s /clickbench/hits_dir/hits.parquet \ + | awk '{print $1}' diff --git a/kylin5/install b/kylin5/install new file mode 100755 index 0000000000..efe22f973c --- /dev/null +++ b/kylin5/install @@ -0,0 +1,23 @@ +#!/bin/bash +set -e + +# Apache Kylin 5.0.2-GA standalone (bundles Hadoop 3.2.4/HDFS/YARN/ +# Zookeeper/Hive 3.1.3/Spark 3.3.0-kylin-5.2.2 inside one container). +# Docker is required; no external Hadoop cluster. +# Version choice rationale: see README.md. +if ! command -v docker >/dev/null 2>&1; then + sudo apt-get update -y + sudo apt-get install -y docker.io +fi +sudo apt-get install -y curl jq + +# Add a 6GB swapfile if none exists: the container is -m 10G on a +# 16GiB host, and Hive's CREATE TABLE/VIEW in ./load can push RAM. +if [ "$(swapon --show | wc -l)" -eq 0 ] && [ ! -f /swapfile ]; then + sudo fallocate -l 6G /swapfile + sudo chmod 600 /swapfile + sudo mkswap /swapfile + sudo swapon /swapfile +fi + +sudo docker pull apachekylin/apache-kylin-standalone:5.0.2-GA diff --git a/kylin5/load b/kylin5/load new file mode 100755 index 0000000000..1b6f12ddb6 --- /dev/null +++ b/kylin5/load @@ -0,0 +1,53 @@ +#!/bin/bash +set -e + +CONTAINER=kylin5-clickbench + +# --- Dataset: expects hits.parquet already downloaded, no column rewrite needed --- +# Official hits.parquet, unmodified. See README.md ("No Parquet +# rewrite needed"). +if [ ! -f hits.parquet ]; then + echo "hits.parquet not found in cwd; run ../lib/download-hits-parquet-single first" >&2 + exit 1 +fi + +# --- Stage the file into HDFS inside the container ----------------------- +sudo docker cp hits.parquet "$CONTAINER":/tmp/hits.parquet +# Drop the host copy so docker cp and hdfs put do not occupy the disk twice. +rm -f hits.parquet +sync +sudo docker exec "$CONTAINER" bash -c ' + set -e + hdfs dfs -mkdir -p /clickbench/hits_dir + hdfs dfs -put -f /tmp/hits.parquet /clickbench/hits_dir/hits.parquet + rm -f /tmp/hits.parquet +' + +# --- Register the Hive external table + ClickBench-typed view ------------ +sudo docker cp create.sql "$CONTAINER":/tmp/create.sql +sudo docker exec "$CONTAINER" hive -f /tmp/create.sql + +# --- Load the Hive table's metadata into Kylin via REST API -------------- +# Stock standalone credentials, encoded at runtime. +KYLIN_USER=ADMIN +KYLIN_PASS=KYLIN +AUTH_TOKEN=$(printf '%s:%s' "$KYLIN_USER" "$KYLIN_PASS" | base64) +HTTP_AUTH_SCHEME=Basic +REQUEST_AUTH_HEADER_NAME=Authorization +AUTH_HEADER="${REQUEST_AUTH_HEADER_NAME}: ${HTTP_AUTH_SCHEME} ${AUTH_TOKEN}" + +# Create project; ignore already-exists. +curl -sf -X POST http://localhost:7070/kylin/api/projects \ + -H "$AUTH_HEADER" -H 'Content-Type: application/json' \ + -d '{"name":"clickbench","description":"ClickBench hits benchmark"}' \ + >/dev/null 2>&1 || true + +# Load table metadata (project/tables in the body). +load_resp=$(curl -sf -X POST \ + "http://localhost:7070/kylin/api/tables" \ + -H "$AUTH_HEADER" -H 'Content-Type: application/json' \ + -d '{"project":"clickbench","tables":["CLICKBENCH.HITS"],"data_source_type":9}') +echo "table load response: $load_resp" + +rm -f hits.parquet +sync diff --git a/kylin5/queries.sql b/kylin5/queries.sql new file mode 100644 index 0000000000..cea198cefa --- /dev/null +++ b/kylin5/queries.sql @@ -0,0 +1,43 @@ +SELECT COUNT(*) FROM clickbench.hits; +SELECT COUNT(*) FROM clickbench.hits WHERE AdvEngineID <> 0; +SELECT SUM(AdvEngineID), COUNT(*), AVG(ResolutionWidth) FROM clickbench.hits; +SELECT AVG(UserID) FROM clickbench.hits; +SELECT COUNT(DISTINCT UserID) FROM clickbench.hits; +SELECT COUNT(DISTINCT SearchPhrase) FROM clickbench.hits; +SELECT MIN(EventDate), MAX(EventDate) FROM clickbench.hits; +SELECT AdvEngineID, COUNT(*) FROM clickbench.hits WHERE AdvEngineID <> 0 GROUP BY AdvEngineID ORDER BY COUNT(*) DESC; +SELECT RegionID, COUNT(DISTINCT UserID) AS u FROM clickbench.hits GROUP BY RegionID ORDER BY u DESC LIMIT 10; +SELECT RegionID, SUM(AdvEngineID), COUNT(*) AS c, AVG(ResolutionWidth), COUNT(DISTINCT UserID) FROM clickbench.hits GROUP BY RegionID ORDER BY c DESC LIMIT 10; +SELECT MobilePhoneModel, COUNT(DISTINCT UserID) AS u FROM clickbench.hits WHERE MobilePhoneModel <> '' GROUP BY MobilePhoneModel ORDER BY u DESC LIMIT 10; +SELECT MobilePhone, MobilePhoneModel, COUNT(DISTINCT UserID) AS u FROM clickbench.hits WHERE MobilePhoneModel <> '' GROUP BY MobilePhone, MobilePhoneModel ORDER BY u DESC LIMIT 10; +SELECT SearchPhrase, COUNT(*) AS c FROM clickbench.hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY c DESC LIMIT 10; +SELECT SearchPhrase, COUNT(DISTINCT UserID) AS u FROM clickbench.hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY u DESC LIMIT 10; +SELECT SearchEngineID, SearchPhrase, COUNT(*) AS c FROM clickbench.hits WHERE SearchPhrase <> '' GROUP BY SearchEngineID, SearchPhrase ORDER BY c DESC LIMIT 10; +SELECT UserID, COUNT(*) FROM clickbench.hits GROUP BY UserID ORDER BY COUNT(*) DESC LIMIT 10; +SELECT UserID, SearchPhrase, COUNT(*) FROM clickbench.hits GROUP BY UserID, SearchPhrase ORDER BY COUNT(*) DESC LIMIT 10; +SELECT UserID, SearchPhrase, COUNT(*) FROM clickbench.hits GROUP BY UserID, SearchPhrase LIMIT 10; +SELECT UserID, extract(minute FROM EventTime) AS m, SearchPhrase, COUNT(*) FROM clickbench.hits GROUP BY UserID, m, SearchPhrase ORDER BY COUNT(*) DESC LIMIT 10; +SELECT UserID FROM clickbench.hits WHERE UserID = 435090932899640449; +SELECT COUNT(*) FROM clickbench.hits WHERE URL LIKE '%google%'; +SELECT SearchPhrase, MIN(URL), COUNT(*) AS c FROM clickbench.hits WHERE URL LIKE '%google%' AND SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY c DESC LIMIT 10; +SELECT SearchPhrase, MIN(URL), MIN(Title), COUNT(*) AS c, COUNT(DISTINCT UserID) FROM clickbench.hits WHERE Title LIKE '%Google%' AND URL NOT LIKE '%.google.%' AND SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY c DESC LIMIT 10; +SELECT * FROM clickbench.hits WHERE URL LIKE '%google%' ORDER BY EventTime LIMIT 10; +SELECT SearchPhrase FROM clickbench.hits WHERE SearchPhrase <> '' ORDER BY EventTime LIMIT 10; +SELECT SearchPhrase FROM clickbench.hits WHERE SearchPhrase <> '' ORDER BY SearchPhrase LIMIT 10; +SELECT SearchPhrase FROM clickbench.hits WHERE SearchPhrase <> '' ORDER BY EventTime, SearchPhrase LIMIT 10; +SELECT CounterID, AVG(length(URL)) AS l, COUNT(*) AS c FROM clickbench.hits WHERE URL <> '' GROUP BY CounterID HAVING COUNT(*) > 100000 ORDER BY l DESC LIMIT 25; +SELECT REGEXP_REPLACE(Referer, '^https?://(?:www\.)?([^/]+)/.*$', '$1') AS k, AVG(length(Referer)) AS l, COUNT(*) AS c, MIN(Referer) FROM clickbench.hits WHERE Referer <> '' GROUP BY k HAVING COUNT(*) > 100000 ORDER BY l DESC LIMIT 25; +SELECT SUM(ResolutionWidth), SUM(ResolutionWidth + 1), SUM(ResolutionWidth + 2), SUM(ResolutionWidth + 3), SUM(ResolutionWidth + 4), SUM(ResolutionWidth + 5), SUM(ResolutionWidth + 6), SUM(ResolutionWidth + 7), SUM(ResolutionWidth + 8), SUM(ResolutionWidth + 9), SUM(ResolutionWidth + 10), SUM(ResolutionWidth + 11), SUM(ResolutionWidth + 12), SUM(ResolutionWidth + 13), SUM(ResolutionWidth + 14), SUM(ResolutionWidth + 15), SUM(ResolutionWidth + 16), SUM(ResolutionWidth + 17), SUM(ResolutionWidth + 18), SUM(ResolutionWidth + 19), SUM(ResolutionWidth + 20), SUM(ResolutionWidth + 21), SUM(ResolutionWidth + 22), SUM(ResolutionWidth + 23), SUM(ResolutionWidth + 24), SUM(ResolutionWidth + 25), SUM(ResolutionWidth + 26), SUM(ResolutionWidth + 27), SUM(ResolutionWidth + 28), SUM(ResolutionWidth + 29), SUM(ResolutionWidth + 30), SUM(ResolutionWidth + 31), SUM(ResolutionWidth + 32), SUM(ResolutionWidth + 33), SUM(ResolutionWidth + 34), SUM(ResolutionWidth + 35), SUM(ResolutionWidth + 36), SUM(ResolutionWidth + 37), SUM(ResolutionWidth + 38), SUM(ResolutionWidth + 39), SUM(ResolutionWidth + 40), SUM(ResolutionWidth + 41), SUM(ResolutionWidth + 42), SUM(ResolutionWidth + 43), SUM(ResolutionWidth + 44), SUM(ResolutionWidth + 45), SUM(ResolutionWidth + 46), SUM(ResolutionWidth + 47), SUM(ResolutionWidth + 48), SUM(ResolutionWidth + 49), SUM(ResolutionWidth + 50), SUM(ResolutionWidth + 51), SUM(ResolutionWidth + 52), SUM(ResolutionWidth + 53), SUM(ResolutionWidth + 54), SUM(ResolutionWidth + 55), SUM(ResolutionWidth + 56), SUM(ResolutionWidth + 57), SUM(ResolutionWidth + 58), SUM(ResolutionWidth + 59), SUM(ResolutionWidth + 60), SUM(ResolutionWidth + 61), SUM(ResolutionWidth + 62), SUM(ResolutionWidth + 63), SUM(ResolutionWidth + 64), SUM(ResolutionWidth + 65), SUM(ResolutionWidth + 66), SUM(ResolutionWidth + 67), SUM(ResolutionWidth + 68), SUM(ResolutionWidth + 69), SUM(ResolutionWidth + 70), SUM(ResolutionWidth + 71), SUM(ResolutionWidth + 72), SUM(ResolutionWidth + 73), SUM(ResolutionWidth + 74), SUM(ResolutionWidth + 75), SUM(ResolutionWidth + 76), SUM(ResolutionWidth + 77), SUM(ResolutionWidth + 78), SUM(ResolutionWidth + 79), SUM(ResolutionWidth + 80), SUM(ResolutionWidth + 81), SUM(ResolutionWidth + 82), SUM(ResolutionWidth + 83), SUM(ResolutionWidth + 84), SUM(ResolutionWidth + 85), SUM(ResolutionWidth + 86), SUM(ResolutionWidth + 87), SUM(ResolutionWidth + 88), SUM(ResolutionWidth + 89) FROM clickbench.hits; +SELECT SearchEngineID, ClientIP, COUNT(*) AS c, SUM(IsRefresh), AVG(ResolutionWidth) FROM clickbench.hits WHERE SearchPhrase <> '' GROUP BY SearchEngineID, ClientIP ORDER BY c DESC LIMIT 10; +SELECT WatchID, ClientIP, COUNT(*) AS c, SUM(IsRefresh), AVG(ResolutionWidth) FROM clickbench.hits WHERE SearchPhrase <> '' GROUP BY WatchID, ClientIP ORDER BY c DESC LIMIT 10; +SELECT WatchID, ClientIP, COUNT(*) AS c, SUM(IsRefresh), AVG(ResolutionWidth) FROM clickbench.hits GROUP BY WatchID, ClientIP ORDER BY c DESC LIMIT 10; +SELECT URL, COUNT(*) AS c FROM clickbench.hits GROUP BY URL ORDER BY c DESC LIMIT 10; +SELECT 1, URL, COUNT(*) AS c FROM clickbench.hits GROUP BY 1, URL ORDER BY c DESC LIMIT 10; +SELECT ClientIP, ClientIP - 1, ClientIP - 2, ClientIP - 3, COUNT(*) AS c FROM clickbench.hits GROUP BY ClientIP, ClientIP - 1, ClientIP - 2, ClientIP - 3 ORDER BY c DESC LIMIT 10; +SELECT URL, COUNT(*) AS PageViews FROM clickbench.hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND DontCountHits = 0 AND IsRefresh = 0 AND URL <> '' GROUP BY URL ORDER BY PageViews DESC LIMIT 10; +SELECT Title, COUNT(*) AS PageViews FROM clickbench.hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND DontCountHits = 0 AND IsRefresh = 0 AND Title <> '' GROUP BY Title ORDER BY PageViews DESC LIMIT 10; +SELECT URL, COUNT(*) AS PageViews FROM clickbench.hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND IsRefresh = 0 AND IsLink <> 0 AND IsDownload = 0 GROUP BY URL ORDER BY PageViews DESC LIMIT 10 OFFSET 1000; +SELECT TraficSourceID, SearchEngineID, AdvEngineID, CASE WHEN (SearchEngineID = 0 AND AdvEngineID = 0) THEN Referer ELSE '' END AS Src, URL AS Dst, COUNT(*) AS PageViews FROM clickbench.hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND IsRefresh = 0 GROUP BY TraficSourceID, SearchEngineID, AdvEngineID, Src, Dst ORDER BY PageViews DESC LIMIT 10 OFFSET 1000; +SELECT URLHash, EventDate, COUNT(*) AS PageViews FROM clickbench.hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND IsRefresh = 0 AND TraficSourceID IN (-1, 6) AND RefererHash = 3594120000172545465 GROUP BY URLHash, EventDate ORDER BY PageViews DESC LIMIT 10 OFFSET 100; +SELECT WindowClientWidth, WindowClientHeight, COUNT(*) AS PageViews FROM clickbench.hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND IsRefresh = 0 AND DontCountHits = 0 AND URLHash = 2868770270353813622 GROUP BY WindowClientWidth, WindowClientHeight ORDER BY PageViews DESC LIMIT 10 OFFSET 10000; +SELECT DATE_TRUNC('minute', EventTime) AS M, COUNT(*) AS PageViews FROM clickbench.hits WHERE CounterID = 62 AND EventDate >= '2013-07-14' AND EventDate <= '2013-07-15' AND IsRefresh = 0 AND DontCountHits = 0 GROUP BY DATE_TRUNC('minute', EventTime) ORDER BY DATE_TRUNC('minute', EventTime) LIMIT 10 OFFSET 1000; diff --git a/kylin5/query b/kylin5/query new file mode 100755 index 0000000000..fec8f9ffb6 --- /dev/null +++ b/kylin5/query @@ -0,0 +1,57 @@ +#!/bin/bash +# Run SQL from stdin through Kylin's REST API. +# Stdout: raw JSON response. Last stderr line on success: runtime in seconds. +# Exit nonzero on HTTP or response-body errors. +set -e + +query=$(cat) + +KYLIN_TOKEN=$(printf 'ADMIN:KYLIN' | base64) +REQUEST_AUTH_HEADER_NAME=Authorization +HTTP_AUTH_SCHEME=Basic + +req=$(python3 -c ' +import json, sys +q = sys.stdin.read() +print(json.dumps({"sql": q, "project": "clickbench", "acceptPartial": False})) +' <<< "$query") + +tmp_body=$(mktemp) +trap 'rm -f "$tmp_body"' EXIT + +status_line=$(curl -s -o "$tmp_body" \ + -w '%{http_code} %{time_total}\n' \ + -X POST -H "${REQUEST_AUTH_HEADER_NAME}: ${HTTP_AUTH_SCHEME} ${KYLIN_TOKEN}" \ + -H 'Content-Type: application/json' \ + http://localhost:7070/kylin/api/query \ + --data-binary "$req") + +http_code=$(echo "$status_line" | awk '{print $1}') +time_total=$(echo "$status_line" | awk '{print $2}') + +cat "$tmp_body" + +if [ "$http_code" != "200" ]; then + echo "kylin query failed: HTTP $http_code" >&2 + cat "$tmp_body" >&2 + exit 1 +fi + +# HTTP 200 can still carry isException:true; see README.md. +is_exception=$(python3 -c ' +import json, sys +try: + d = json.load(open(sys.argv[1])) + if not isinstance(d, dict) or "isException" not in d: + print("true") + else: + print("true" if d.get("isException") else "false") +except Exception: + print("true") +' "$tmp_body") +if [ "$is_exception" = "true" ]; then + echo "kylin query returned isException:true" >&2 + exit 1 +fi + +printf '%s\n' "$time_total" >&2 diff --git a/kylin5/results/20261001/c6a.2xlarge.json b/kylin5/results/20261001/c6a.2xlarge.json new file mode 100644 index 0000000000..13729f3422 --- /dev/null +++ b/kylin5/results/20261001/c6a.2xlarge.json @@ -0,0 +1,236 @@ +{ + "system": "Apache Kylin 5.0.2-GA (Parquet, single, no cube)", + "date": "2026-10-01", + "machine": "c6a.2xlarge", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": [ + "Java", + "Spark derivative", + "stateless", + "no-cold" + ], + "load_time": 421.406, + "data_size": 14779976446, + "concurrent_qps": 0.058, + "concurrent_error_ratio": 0.167, + "result": [ + [ + 17.3543, + 3.94131, + 3.728236 + ], + [ + 12.492834, + 5.639603, + 6.099351 + ], + [ + 9.540616, + 5.508063, + 5.440651 + ], + [ + 16.331511, + 5.574987, + 5.377784 + ], + [ + 9.548769, + 8.520986, + 8.555613 + ], + [ + 11.02734, + 8.908579, + 8.788621 + ], + [ + 6.640696, + 5.282341, + 5.227396 + ], + [ + 6.031136, + 5.031699, + 5.057432 + ], + [ + null, + null, + null + ], + [ + null, + null, + null + ], + [ + 8.733604, + 6.65584, + 6.67568 + ], + [ + 8.823639, + 6.824864, + 6.855246 + ], + [ + 18.419866, + 16.53877, + 16.364323 + ], + [ + 24.47424, + 20.975926, + 21.183191 + ], + [ + 20.215885, + 18.628002, + 18.00355 + ], + [ + 14.354982, + 13.147464, + 13.040769 + ], + [ + 40.949971, + 37.576548, + 37.545841 + ], + [ + 31.960592, + 28.727341, + 29.008543 + ], + [ + null, + null, + null + ], + [ + 6.635735, + 4.985967, + 4.917619 + ], + [ + 42.544492, + 35.001389, + 16.041324 + ], + [ + 31.122023, + 18.725039, + 17.77926 + ], + [ + 75.519113, + 56.654375, + 54.056612 + ], + [ + 179.133297, + 163.943395, + 161.121103 + ], + [ + 12.621922, + 8.305632, + 8.249867 + ], + [ + 9.686547, + 7.596113, + 7.588677 + ], + [ + 12.545132, + 8.171875, + 8.149969 + ], + [ + 28.209479, + 14.786209, + 16.015311 + ], + [ + null, + null, + null + ], + [ + 21.99715, + 21.270359, + 21.229168 + ], + [ + 19.464698, + 13.986024, + 14.342983 + ], + [ + 28.40233, + 18.59746, + 18.656124 + ], + [ + 107.236131, + 103.176641, + 114.858103 + ], + [ + 78.242612, + 73.940292, + 86.617507 + ], + [ + 76.921322, + 73.668833, + 86.974894 + ], + [ + 20.218035, + 19.702738, + 19.658651 + ], + [ + 30.337504, + 15.311498, + 20.795994 + ], + [ + 29.57623, + 17.195174, + 15.90867 + ], + [ + 31.465845, + 14.190549, + 15.26055 + ], + [ + null, + null, + null + ], + [ + 12.950887, + 6.456414, + 6.401034 + ], + [ + 12.688327, + 6.437689, + 6.399855 + ], + [ + 9.770136, + 6.271349, + 6.189988 + ] + ] +} diff --git a/kylin5/start b/kylin5/start new file mode 100755 index 0000000000..285b9cc8eb --- /dev/null +++ b/kylin5/start @@ -0,0 +1,67 @@ +#!/bin/bash +set -e + +# All-in-one container; create-or-start if needed. +# -m 10G is the vendor default for this tag (see README.md). +CONTAINER=kylin5-clickbench +if sudo docker ps --format '{{.Names}}' | grep -qx "$CONTAINER"; then + exit 0 +fi + +already_existed=0 +if sudo docker ps -a --format '{{.Names}}' | grep -qx "$CONTAINER"; then + already_existed=1 + sudo docker start "$CONTAINER" +else + sudo docker run -d --name "$CONTAINER" \ + --hostname localhost \ + -m 10G \ + -p 7070:7070 -p 8088:8088 -p 9870:9870 \ + -p 8032:8032 -p 8042:8042 -p 2181:2181 \ + apachekylin/apache-kylin-standalone:5.0.2-GA +fi + +# Wait for Kylin's own first-boot REST API before touching kylin.properties. +if [ "$already_existed" -eq 0 ]; then + echo "waiting for Kylin's own first-boot startup before patching kylin.properties..." >&2 + KYLIN_TOKEN=$(printf 'ADMIN:KYLIN' | base64) + REQUEST_AUTH_HEADER_NAME=Authorization + HTTP_AUTH_SCHEME=Basic + up=0 + for i in $(seq 1 300); do + if curl -sf -m 5 http://localhost:7070/kylin/api/user/authentication \ + -X POST -H "${REQUEST_AUTH_HEADER_NAME}: ${HTTP_AUTH_SCHEME} ${KYLIN_TOKEN}" \ + -H 'Content-Type: application/json' >/dev/null 2>&1; then + up=1 + break + fi + sleep 1 + done + if [ "$up" -ne 1 ]; then + echo "start: Kylin's first-boot REST API did not come up within 300 polling attempts (1s apart, each with a 5s curl timeout)" >&2 + exit 1 + fi + + # Canary settings retained from the measured setup; see README.md + # "Canary config". + KYLIN_CONF=/home/kylin/apache-kylin-5.0.2-bin/conf/kylin.properties + sudo docker exec "$CONTAINER" bash -c " + printf '\nkylin.canary.sparder-context-canary-enabled=false\nkylin.canary.sqlcontext-enabled=false\n' >> $KYLIN_CONF + \$KYLIN_HOME/bin/kylin.sh stop + \$KYLIN_HOME/bin/kylin.sh start + " + up=0 + for i in $(seq 1 300); do + if curl -sf -m 5 http://localhost:7070/kylin/api/user/authentication \ + -X POST -H "${REQUEST_AUTH_HEADER_NAME}: ${HTTP_AUTH_SCHEME} ${KYLIN_TOKEN}" \ + -H 'Content-Type: application/json' >/dev/null 2>&1; then + up=1 + break + fi + sleep 1 + done + if [ "$up" -ne 1 ]; then + echo "start: Kylin's REST API did not come back up within 300 polling attempts after the initial-setup restart" >&2 + exit 1 + fi +fi diff --git a/kylin5/stop b/kylin5/stop new file mode 100755 index 0000000000..be80ad07fe --- /dev/null +++ b/kylin5/stop @@ -0,0 +1,6 @@ +#!/bin/bash +# BENCH_RESTARTABLE=no (see ./benchmark.sh) means benchmark-common.sh +# never calls this during the cold-cycle sweep. Provided anyway for +# manual lifecycle management. +sudo docker stop kylin5-clickbench 2>/dev/null || true +exit 0 diff --git a/kylin5/template.json b/kylin5/template.json new file mode 100644 index 0000000000..846178a1f0 --- /dev/null +++ b/kylin5/template.json @@ -0,0 +1,12 @@ +{ + "system": "Apache Kylin 5.0.2-GA (Parquet, single, no cube)", + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": [ + "Java", + "Spark derivative", + "stateless", + "no-cold" + ] +} From 7ba74a66abb594574292b8725f0ddde6672565ea Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 4 Oct 2026 19:44:21 +0000 Subject: [PATCH 2/4] Add benchmark results for kylin5 (c6a.2xlarge, c6a.4xlarge, c6a.large, c6a.metal, c6a.xlarge, c7a.metal-48xl) --- kylin5/results/20261001/c6a.2xlarge.json | 236 -------------------- kylin5/results/20261004/c6a.2xlarge.json | 60 +++++ kylin5/results/20261004/c6a.4xlarge.json | 60 +++++ kylin5/results/20261004/c6a.large.json | 60 +++++ kylin5/results/20261004/c6a.metal.json | 60 +++++ kylin5/results/20261004/c6a.xlarge.json | 60 +++++ kylin5/results/20261004/c7a.metal-48xl.json | 60 +++++ 7 files changed, 360 insertions(+), 236 deletions(-) delete mode 100644 kylin5/results/20261001/c6a.2xlarge.json create mode 100644 kylin5/results/20261004/c6a.2xlarge.json create mode 100644 kylin5/results/20261004/c6a.4xlarge.json create mode 100644 kylin5/results/20261004/c6a.large.json create mode 100644 kylin5/results/20261004/c6a.metal.json create mode 100644 kylin5/results/20261004/c6a.xlarge.json create mode 100644 kylin5/results/20261004/c7a.metal-48xl.json diff --git a/kylin5/results/20261001/c6a.2xlarge.json b/kylin5/results/20261001/c6a.2xlarge.json deleted file mode 100644 index 13729f3422..0000000000 --- a/kylin5/results/20261001/c6a.2xlarge.json +++ /dev/null @@ -1,236 +0,0 @@ -{ - "system": "Apache Kylin 5.0.2-GA (Parquet, single, no cube)", - "date": "2026-10-01", - "machine": "c6a.2xlarge", - "cluster_size": 1, - "proprietary": "no", - "hardware": "cpu", - "tuned": "no", - "tags": [ - "Java", - "Spark derivative", - "stateless", - "no-cold" - ], - "load_time": 421.406, - "data_size": 14779976446, - "concurrent_qps": 0.058, - "concurrent_error_ratio": 0.167, - "result": [ - [ - 17.3543, - 3.94131, - 3.728236 - ], - [ - 12.492834, - 5.639603, - 6.099351 - ], - [ - 9.540616, - 5.508063, - 5.440651 - ], - [ - 16.331511, - 5.574987, - 5.377784 - ], - [ - 9.548769, - 8.520986, - 8.555613 - ], - [ - 11.02734, - 8.908579, - 8.788621 - ], - [ - 6.640696, - 5.282341, - 5.227396 - ], - [ - 6.031136, - 5.031699, - 5.057432 - ], - [ - null, - null, - null - ], - [ - null, - null, - null - ], - [ - 8.733604, - 6.65584, - 6.67568 - ], - [ - 8.823639, - 6.824864, - 6.855246 - ], - [ - 18.419866, - 16.53877, - 16.364323 - ], - [ - 24.47424, - 20.975926, - 21.183191 - ], - [ - 20.215885, - 18.628002, - 18.00355 - ], - [ - 14.354982, - 13.147464, - 13.040769 - ], - [ - 40.949971, - 37.576548, - 37.545841 - ], - [ - 31.960592, - 28.727341, - 29.008543 - ], - [ - null, - null, - null - ], - [ - 6.635735, - 4.985967, - 4.917619 - ], - [ - 42.544492, - 35.001389, - 16.041324 - ], - [ - 31.122023, - 18.725039, - 17.77926 - ], - [ - 75.519113, - 56.654375, - 54.056612 - ], - [ - 179.133297, - 163.943395, - 161.121103 - ], - [ - 12.621922, - 8.305632, - 8.249867 - ], - [ - 9.686547, - 7.596113, - 7.588677 - ], - [ - 12.545132, - 8.171875, - 8.149969 - ], - [ - 28.209479, - 14.786209, - 16.015311 - ], - [ - null, - null, - null - ], - [ - 21.99715, - 21.270359, - 21.229168 - ], - [ - 19.464698, - 13.986024, - 14.342983 - ], - [ - 28.40233, - 18.59746, - 18.656124 - ], - [ - 107.236131, - 103.176641, - 114.858103 - ], - [ - 78.242612, - 73.940292, - 86.617507 - ], - [ - 76.921322, - 73.668833, - 86.974894 - ], - [ - 20.218035, - 19.702738, - 19.658651 - ], - [ - 30.337504, - 15.311498, - 20.795994 - ], - [ - 29.57623, - 17.195174, - 15.90867 - ], - [ - 31.465845, - 14.190549, - 15.26055 - ], - [ - null, - null, - null - ], - [ - 12.950887, - 6.456414, - 6.401034 - ], - [ - 12.688327, - 6.437689, - 6.399855 - ], - [ - 9.770136, - 6.271349, - 6.189988 - ] - ] -} diff --git a/kylin5/results/20261004/c6a.2xlarge.json b/kylin5/results/20261004/c6a.2xlarge.json new file mode 100644 index 0000000000..11b83a4844 --- /dev/null +++ b/kylin5/results/20261004/c6a.2xlarge.json @@ -0,0 +1,60 @@ +{ + "system": "Apache Kylin 5.0.2-GA (Parquet, single, no cube)", + "date": "2026-10-04", + "machine": "c6a.2xlarge", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["Java","Spark derivative","stateless","no-cold"], + "load_time": 222, + "data_size": 14779976446, + "concurrent_qps": 0.06, + "concurrent_error_ratio": 0.122, + "result": [ + [16.943, 3.619, 3.52], + [10.608, 5.137, 5.462], + [9.68, 5.386, 5.195], + [10.462, 5.263, 5.268], + [9.739, 8.281, 8.357], + [10.955, 8.678, 8.639], + [6.494, 5.133, 5.105], + [5.883, 4.889, 4.886], + [null, null, null], + [null, null, null], + [8.621, 6.497, 6.5], + [8.651, 6.666, 6.67], + [18.047, 16.115, 16.047], + [24.22, 20.369, 20.688], + [20.491, 17.899, 17.974], + [14.105, 12.852, 12.858], + [39.926, 36.955, 38.242], + [31.164, 27.765, 28.556], + [null, null, null], + [6.525, 4.854, 4.902], + [27.26, 29.22, 15.206], + [30.92, 18.289, 17.866], + [58.365, 56.654, 31.554], + [159.548, 160.318, 161.238], + [12.591, 8.061, 8.03], + [9.539, 7.396, 7.427], + [12.307, 7.976, 8.06], + [29.037, 14.412, 15.687], + [null, null, null], + [21.134, 19.621, 19.908], + [19.21, 13.722, 13.689], + [28.177, 18.366, 18.531], + [103.776, 104.523, 99.017], + [72.937, 65.047, 73.357], + [74.282, 65.868, 73.869], + [20.103, 19.244, 19.575], + [30.053, 15.166, 16.055], + [28.428, 15.098, 15.062], + [29.583, 16.403, 15.113], + [null, null, null], + [12.932, 6.407, 6.382], + [12.405, 6.332, 6.241], + [9.194, 6.264, 6.128] +] + } + \ No newline at end of file diff --git a/kylin5/results/20261004/c6a.4xlarge.json b/kylin5/results/20261004/c6a.4xlarge.json new file mode 100644 index 0000000000..1ab876b3ff --- /dev/null +++ b/kylin5/results/20261004/c6a.4xlarge.json @@ -0,0 +1,60 @@ +{ + "system": "Apache Kylin 5.0.2-GA (Parquet, single, no cube)", + "date": "2026-10-04", + "machine": "c6a.4xlarge", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["Java","Spark derivative","stateless","no-cold"], + "load_time": 168, + "data_size": 14779976446, + "concurrent_qps": 0.062, + "concurrent_error_ratio": 0.196, + "result": [ + [16.223, 3.625, 3.413], + [10.824, 5.486, 5.133], + [10.056, 5.251, 5.185], + [9.478, 5.248, 5.188], + [9.794, 8.441, 8.363], + [10.883, 8.663, 8.754], + [6.618, 5.187, 5.183], + [5.845, 4.906, 4.946], + [null, null, null], + [null, null, null], + [8.624, 6.482, 6.488], + [8.856, 6.655, 6.758], + [18.127, 16.102, 16.1], + [24.229, 20.582, 20.309], + [19.903, 17.612, 17.701], + [14.312, 12.888, 12.943], + [39.325, 36.573, 36.423], + [30.704, 27.72, 27.366], + [null, null, null], + [6.518, 4.795, 4.765], + [27.042, 27.196, 14.844], + [30.807, 15.927, 15.549], + [58.595, 53.878, 54.635], + [155.747, 157.812, 160.33], + [12.676, 8.112, 8.116], + [9.478, 7.472, 7.417], + [12.301, 8.095, 7.893], + [27.2, 13.334, 13.357], + [null, null, null], + [19.982, 18.798, 18.586], + [19.335, 13.768, 13.78], + [28.484, 18.737, 18.352], + [101.112, 97.501, 97.634], + [72.541, 62.946, 68.091], + [72.975, 63.374, 68.052], + [20.214, 19.36, 19.215], + [29.172, 14.839, 13.648], + [27.273, 14.459, 14.423], + [29.091, 15.982, 14.067], + [null, null, null], + [12.943, 6.376, 6.355], + [12.586, 6.318, 6.28], + [9.166, 6.182, 6.094] +] + } + \ No newline at end of file diff --git a/kylin5/results/20261004/c6a.large.json b/kylin5/results/20261004/c6a.large.json new file mode 100644 index 0000000000..88e3e8dd8f --- /dev/null +++ b/kylin5/results/20261004/c6a.large.json @@ -0,0 +1,60 @@ +{ + "system": "Apache Kylin 5.0.2-GA (Parquet, single, no cube)", + "date": "2026-10-04", + "machine": "c6a.large", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["Java","Spark derivative","stateless","no-cold"], + "load_time": 274, + "data_size": 14779976446, + "concurrent_qps": 0.055, + "concurrent_error_ratio": 0.154, + "result": [ + [33.467, 6.021, 4.783], + [26.739, 8.069, 7.224], + [25.563, 14.27, 9.422], + [12.207, 7.328, 6.489], + [12.523, 10.627, 10.737], + [13.318, 12.548, 11.648], + [7.872, 5.835, 5.641], + [7.116, 5.349, 5.686], + [null, null, null], + [null, null, null], + [10.702, 7.369, 7.315], + [9.384, 7.624, 7.887], + [19.979, 19.293, 20.166], + [28.562, 28.069, 27.787], + [21.973, 22.846, 22.98], + [15.186, 14.739, 15.535], + [46.668, 47.522, 47.083], + [36.945, 34.503, 34.291], + [null, null, null], + [7.202, 5.531, 5.265], + [31.728, 29.973, 29.588], + [34.729, 34.111, 35.514], + [66.577, 63.596, 66.396], + [232.217, 178.478, 174.534], + [14.591, 10.802, 15.198], + [10.927, 8.651, 8.546], + [13.711, 13.477, 13.708], + [34.856, 32.631, 32.929], + [null, null, null], + [24.314, 22.517, 23.27], + [21.531, 20.789, 20.714], + [31.086, 31.124, 30.357], + [118.365, 153.311, 123.873], + [96.104, 92.859, 96.128], + [97.963, 98.039, 96.149], + [23.705, 24.835, 22.883], + [35.316, 35.725, 53.844], + [32.467, 34.116, 33.277], + [38.731, 34.586, 34.004], + [null, null, null], + [18.088, 13.086, 12.99], + [12.94, 13.049, 12.745], + [9.917, 6.693, 6.843] +] + } + \ No newline at end of file diff --git a/kylin5/results/20261004/c6a.metal.json b/kylin5/results/20261004/c6a.metal.json new file mode 100644 index 0000000000..2c58fd7a9f --- /dev/null +++ b/kylin5/results/20261004/c6a.metal.json @@ -0,0 +1,60 @@ +{ + "system": "Apache Kylin 5.0.2-GA (Parquet, single, no cube)", + "date": "2026-10-04", + "machine": "c6a.metal", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["Java","Spark derivative","stateless","no-cold"], + "load_time": 159, + "data_size": 14779976446, + "concurrent_qps": 0.017, + "concurrent_error_ratio": 1, + "result": [ + [35.248, 3.855, 3.782], + [12.183, 5.674, 5.54], + [11.39, 5.809, 5.722], + [10.88, 5.754, 5.698], + [10.685, 9.515, 9.674], + [12.222, 10.513, 11.275], + [9.374, 7.442, 6.528], + [6.957, 5.848, 5.925], + [null, null, null], + [null, null, null], + [9.753, 7.809, 7.491], + [10.172, 8.006, 8.099], + [19.3, 17.431, 17.024], + [25.605, 22.403, 23.824], + [20.774, 18.731, 18.751], + [15.828, 14.668, 14.562], + [40.676, 40.411, 38.404], + [31.989, 29.739, 29.958], + [null, null, null], + [6.337, 4.926, 4.98], + [35.307, 33.74, 44.881], + [35.617, 20.554, 20.579], + [66.017, 60.221, 60.872], + [172.927, 209.388, 161.513], + [13.683, 9.199, 9.285], + [10.345, 8.491, 8.549], + [13.104, 9.2, 9.067], + [30.232, 16.78, 16.707], + [null, null, null], + [21.968, 20.626, 20.55], + [20.353, 15.191, 15.343], + [28.986, 19.973, 20.176], + [103.453, 101.406, 101.957], + [72.645, 64.597, 69.096], + [74.072, 65.786, 68.506], + [24.723, 23.131, 21.635], + [31.808, 16.909, 16.468], + [28.954, 15.894, 15.934], + [33.054, 15.328, 15.043], + [null, null, null], + [13.359, 7.011, 6.948], + [12.983, 7.314, 6.757], + [9.985, 6.596, 6.45] +] + } + \ No newline at end of file diff --git a/kylin5/results/20261004/c6a.xlarge.json b/kylin5/results/20261004/c6a.xlarge.json new file mode 100644 index 0000000000..13e353e144 --- /dev/null +++ b/kylin5/results/20261004/c6a.xlarge.json @@ -0,0 +1,60 @@ +{ + "system": "Apache Kylin 5.0.2-GA (Parquet, single, no cube)", + "date": "2026-10-04", + "machine": "c6a.xlarge", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["Java","Spark derivative","stateless","no-cold"], + "load_time": 242, + "data_size": 14779976446, + "concurrent_qps": 0.057, + "concurrent_error_ratio": 0.15, + "result": [ + [24.732, 4.442, 4.139], + [12.7, 5.916, 6.604], + [11.334, 6.88, 6.314], + [10.244, 5.718, 5.735], + [10.301, 9.108, 9.032], + [11.72, 9.616, 9.619], + [7.217, 5.799, 5.768], + [6.631, 5.533, 5.704], + [null, null, null], + [null, null, null], + [9.235, 7.273, 7.084], + [9.213, 7.411, 7.34], + [19.655, 18.249, 16.954], + [26.177, 22.276, 24.894], + [21.449, 19.423, 19.329], + [15.492, 14.038, 14.048], + [43.366, 41.977, 41.789], + [33.449, 32.388, 33.644], + [null, null, null], + [6.768, 5.318, 5.481], + [28.422, 24.764, 23.784], + [32.059, 24.096, 24.275], + [60.939, 51.196, 79.387], + [171.783, 172.296, 156.859], + [13.038, 8.921, 8.603], + [9.868, 8.022, 7.885], + [12.615, 8.464, 8.496], + [28.943, 18.018, 17.583], + [null, null, null], + [21.856, 20.601, 20.893], + [20.258, 15.169, 15.145], + [28.776, 19.566, 19.556], + [114.291, 113.46, 112.437], + [84.444, 86.214, 83.125], + [90.23, 84.563, 83.99], + [21.514, 20.641, 20.541], + [31.431, 21.057, 22.332], + [31.039, 19.347, 17.823], + [33.086, 21.871, 21.574], + [null, null, null], + [13.11, 6.82, 6.738], + [13.106, 6.864, 6.633], + [9.509, 6.694, 6.559] +] + } + \ No newline at end of file diff --git a/kylin5/results/20261004/c7a.metal-48xl.json b/kylin5/results/20261004/c7a.metal-48xl.json new file mode 100644 index 0000000000..2af71bfda0 --- /dev/null +++ b/kylin5/results/20261004/c7a.metal-48xl.json @@ -0,0 +1,60 @@ +{ + "system": "Apache Kylin 5.0.2-GA (Parquet, single, no cube)", + "date": "2026-10-04", + "machine": "c7a.metal-48xl", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["Java","Spark derivative","stateless","no-cold"], + "load_time": 135, + "data_size": 14779976446, + "concurrent_qps": 0.03, + "concurrent_error_ratio": 1, + "result": [ + [16.238, 3.513, 3.809], + [10.899, 5.991, 5.351], + [9.825, 5.3, 5.275], + [10.327, 7.175, 5.645], + [9.878, 8.493, 8.598], + [11.741, 9.622, 9.534], + [6.738, 5.068, 5.422], + [6.469, 5.216, 4.997], + [null, null, null], + [null, null, null], + [9.841, 7.629, 7.59], + [10.134, 8.166, 8.187], + [18.914, 16.81, 16.611], + [24.753, 22.19, 21.822], + [20.639, 18.543, 18.588], + [14.083, 13.04, 12.874], + [40.122, 36.607, 36.018], + [29.871, 27.275, 27.74], + [null, null, null], + [5.886, 4.342, 4.289], + [35.334, 29.657, 29.985], + [34.466, 21.307, 21.96], + [61.657, 60.843, 60.538], + [154.603, 154.64, 173.149], + [15.095, 10.383, 9.568], + [10.416, 8.467, 8.539], + [13.142, 9.303, 9.407], + [31.516, 18.812, 18.867], + [null, null, null], + [18.038, 17.221, 17.173], + [20.743, 15.321, 15.353], + [28.932, 20.039, 19.987], + [100.751, 95.889, 98.41], + [70.207, 60.436, 68.909], + [70.085, 60.429, 67.611], + [21.305, 20.528, 20.447], + [33.983, 15.902, 15.731], + [28.073, 15.488, 15.637], + [30.417, 14.684, 14.901], + [null, null, null], + [13.47, 7.002, 6.971], + [13.297, 7.11, 6.904], + [9.881, 6.315, 6.31] +] + } + \ No newline at end of file From e72911fe5afa0d209aecfb5f66c40522ba6c0625 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 4 Oct 2026 21:29:52 +0000 Subject: [PATCH 3/4] Add benchmark results for kylin5 (t3a.small) --- kylin5/results/20261004/t3a.small.json | 60 ++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 kylin5/results/20261004/t3a.small.json diff --git a/kylin5/results/20261004/t3a.small.json b/kylin5/results/20261004/t3a.small.json new file mode 100644 index 0000000000..402a121af7 --- /dev/null +++ b/kylin5/results/20261004/t3a.small.json @@ -0,0 +1,60 @@ +{ + "system": "Apache Kylin 5.0.2-GA (Parquet, single, no cube)", + "date": "2026-10-04", + "machine": "t3a.small", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["Java","Spark derivative","stateless","no-cold"], + "load_time": 325, + "data_size": 14779976446, + "concurrent_qps": 0.003, + "concurrent_error_ratio": 0.999, + "result": [ + [98.293, 18.502, 12.945], + [40.118, 18.113, 20.356], + [32.814, 37.555, 22.113], + [33.286, 19.618, 48.291], + [55.251, 68.61, 55.573], + [44.868, 40.989, 43.187], + [36.679, 18.183, 18.992], + [25.795, 20.083, 20.298], + [null, null, null], + [null, null, null], + [34.155, 33.977, 34.347], + [28.493, 35.048, 30.357], + [60.938, 85.917, 85.905], + [81.698, 85.67, 92.294], + [104.132, 96.053, 103.981], + [92.653, 66.267, 65.347], + [139.115, 140.894, 209.408], + [113.311, 104.473, 113.892], + [null, null, null], + [30.459, 22.024, 38.567], + [85.046, 68.941, 73.288], + [84.107, 70.537, 70.093], + [147.977, 124.594, 123.579], + [null, null, null], + [45.577, 47.577, 42.828], + [27.504, 29.238, 28.745], + [33.072, 33.765, 43.683], + [78.614, 73.078, 70.202], + [null, null, null], + [72.289, 62.967, 58.683], + [61.393, 77.073, 60.317], + [79.104, 74.079, 91.026], + [null, 290.107, 295.934], + [223.507, 242.559, 218.808], + [220.04, 271.278, 199.548], + [80.041, 89.842, 101.228], + [88.363, 68.841, 74.884], + [67.023, 60.921, 62.23], + [82.382, 70.819, 61.957], + [null, null, null], + [31.447, 34.081, 27.295], + [26.503, 27.249, 26.499], + [25.907, 25.618, 25.476] +] + } + \ No newline at end of file From e691edc7da90a3bf77929aabb20968732250bbf0 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Mon, 5 Oct 2026 00:19:04 +0200 Subject: [PATCH 4/4] Rename kylin5 to kylin, system name to Kylin Co-Authored-By: Claude Opus 5.5 (1M context) --- {kylin5 => kylin}/README.md | 0 {kylin5 => kylin}/benchmark.sh | 0 {kylin5 => kylin}/check | 0 {kylin5 => kylin}/create.sql | 0 {kylin5 => kylin}/data-size | 2 +- {kylin5 => kylin}/install | 0 {kylin5 => kylin}/load | 2 +- {kylin5 => kylin}/queries.sql | 0 {kylin5 => kylin}/query | 0 {kylin5 => kylin}/results/20261004/c6a.2xlarge.json | 2 +- {kylin5 => kylin}/results/20261004/c6a.4xlarge.json | 2 +- {kylin5 => kylin}/results/20261004/c6a.large.json | 2 +- {kylin5 => kylin}/results/20261004/c6a.metal.json | 2 +- {kylin5 => kylin}/results/20261004/c6a.xlarge.json | 2 +- {kylin5 => kylin}/results/20261004/c7a.metal-48xl.json | 2 +- {kylin5 => kylin}/results/20261004/t3a.small.json | 2 +- {kylin5 => kylin}/start | 2 +- {kylin5 => kylin}/stop | 2 +- {kylin5 => kylin}/template.json | 2 +- 19 files changed, 12 insertions(+), 12 deletions(-) rename {kylin5 => kylin}/README.md (100%) rename {kylin5 => kylin}/benchmark.sh (100%) rename {kylin5 => kylin}/check (100%) rename {kylin5 => kylin}/create.sql (100%) rename {kylin5 => kylin}/data-size (68%) rename {kylin5 => kylin}/install (100%) rename {kylin5 => kylin}/load (98%) rename {kylin5 => kylin}/queries.sql (100%) rename {kylin5 => kylin}/query (100%) rename {kylin5 => kylin}/results/20261004/c6a.2xlarge.json (96%) rename {kylin5 => kylin}/results/20261004/c6a.4xlarge.json (96%) rename {kylin5 => kylin}/results/20261004/c6a.large.json (96%) rename {kylin5 => kylin}/results/20261004/c6a.metal.json (96%) rename {kylin5 => kylin}/results/20261004/c6a.xlarge.json (96%) rename {kylin5 => kylin}/results/20261004/c7a.metal-48xl.json (96%) rename {kylin5 => kylin}/results/20261004/t3a.small.json (96%) rename {kylin5 => kylin}/start (98%) rename {kylin5 => kylin}/stop (77%) rename {kylin5 => kylin}/template.json (69%) diff --git a/kylin5/README.md b/kylin/README.md similarity index 100% rename from kylin5/README.md rename to kylin/README.md diff --git a/kylin5/benchmark.sh b/kylin/benchmark.sh similarity index 100% rename from kylin5/benchmark.sh rename to kylin/benchmark.sh diff --git a/kylin5/check b/kylin/check similarity index 100% rename from kylin5/check rename to kylin/check diff --git a/kylin5/create.sql b/kylin/create.sql similarity index 100% rename from kylin5/create.sql rename to kylin/create.sql diff --git a/kylin5/data-size b/kylin/data-size similarity index 68% rename from kylin5/data-size rename to kylin/data-size index 18385c388a..d931c1f06d 100755 --- a/kylin5/data-size +++ b/kylin/data-size @@ -2,5 +2,5 @@ set -euo pipefail # HDFS logical length of the loaded file (hdfs dfs -du -s column 1, # not disk_space_consumed_with_all_replicas), not the host download. -sudo docker exec kylin5-clickbench hdfs dfs -du -s /clickbench/hits_dir/hits.parquet \ +sudo docker exec kylin-clickbench hdfs dfs -du -s /clickbench/hits_dir/hits.parquet \ | awk '{print $1}' diff --git a/kylin5/install b/kylin/install similarity index 100% rename from kylin5/install rename to kylin/install diff --git a/kylin5/load b/kylin/load similarity index 98% rename from kylin5/load rename to kylin/load index 1b6f12ddb6..8b3576a309 100755 --- a/kylin5/load +++ b/kylin/load @@ -1,7 +1,7 @@ #!/bin/bash set -e -CONTAINER=kylin5-clickbench +CONTAINER=kylin-clickbench # --- Dataset: expects hits.parquet already downloaded, no column rewrite needed --- # Official hits.parquet, unmodified. See README.md ("No Parquet diff --git a/kylin5/queries.sql b/kylin/queries.sql similarity index 100% rename from kylin5/queries.sql rename to kylin/queries.sql diff --git a/kylin5/query b/kylin/query similarity index 100% rename from kylin5/query rename to kylin/query diff --git a/kylin5/results/20261004/c6a.2xlarge.json b/kylin/results/20261004/c6a.2xlarge.json similarity index 96% rename from kylin5/results/20261004/c6a.2xlarge.json rename to kylin/results/20261004/c6a.2xlarge.json index 11b83a4844..6ddb373c8c 100644 --- a/kylin5/results/20261004/c6a.2xlarge.json +++ b/kylin/results/20261004/c6a.2xlarge.json @@ -1,5 +1,5 @@ { - "system": "Apache Kylin 5.0.2-GA (Parquet, single, no cube)", + "system": "Kylin", "date": "2026-10-04", "machine": "c6a.2xlarge", "cluster_size": 1, diff --git a/kylin5/results/20261004/c6a.4xlarge.json b/kylin/results/20261004/c6a.4xlarge.json similarity index 96% rename from kylin5/results/20261004/c6a.4xlarge.json rename to kylin/results/20261004/c6a.4xlarge.json index 1ab876b3ff..b039d68ddf 100644 --- a/kylin5/results/20261004/c6a.4xlarge.json +++ b/kylin/results/20261004/c6a.4xlarge.json @@ -1,5 +1,5 @@ { - "system": "Apache Kylin 5.0.2-GA (Parquet, single, no cube)", + "system": "Kylin", "date": "2026-10-04", "machine": "c6a.4xlarge", "cluster_size": 1, diff --git a/kylin5/results/20261004/c6a.large.json b/kylin/results/20261004/c6a.large.json similarity index 96% rename from kylin5/results/20261004/c6a.large.json rename to kylin/results/20261004/c6a.large.json index 88e3e8dd8f..d5a3a25f8d 100644 --- a/kylin5/results/20261004/c6a.large.json +++ b/kylin/results/20261004/c6a.large.json @@ -1,5 +1,5 @@ { - "system": "Apache Kylin 5.0.2-GA (Parquet, single, no cube)", + "system": "Kylin", "date": "2026-10-04", "machine": "c6a.large", "cluster_size": 1, diff --git a/kylin5/results/20261004/c6a.metal.json b/kylin/results/20261004/c6a.metal.json similarity index 96% rename from kylin5/results/20261004/c6a.metal.json rename to kylin/results/20261004/c6a.metal.json index 2c58fd7a9f..936e87063b 100644 --- a/kylin5/results/20261004/c6a.metal.json +++ b/kylin/results/20261004/c6a.metal.json @@ -1,5 +1,5 @@ { - "system": "Apache Kylin 5.0.2-GA (Parquet, single, no cube)", + "system": "Kylin", "date": "2026-10-04", "machine": "c6a.metal", "cluster_size": 1, diff --git a/kylin5/results/20261004/c6a.xlarge.json b/kylin/results/20261004/c6a.xlarge.json similarity index 96% rename from kylin5/results/20261004/c6a.xlarge.json rename to kylin/results/20261004/c6a.xlarge.json index 13e353e144..0376ba9ef0 100644 --- a/kylin5/results/20261004/c6a.xlarge.json +++ b/kylin/results/20261004/c6a.xlarge.json @@ -1,5 +1,5 @@ { - "system": "Apache Kylin 5.0.2-GA (Parquet, single, no cube)", + "system": "Kylin", "date": "2026-10-04", "machine": "c6a.xlarge", "cluster_size": 1, diff --git a/kylin5/results/20261004/c7a.metal-48xl.json b/kylin/results/20261004/c7a.metal-48xl.json similarity index 96% rename from kylin5/results/20261004/c7a.metal-48xl.json rename to kylin/results/20261004/c7a.metal-48xl.json index 2af71bfda0..7cb5c941e4 100644 --- a/kylin5/results/20261004/c7a.metal-48xl.json +++ b/kylin/results/20261004/c7a.metal-48xl.json @@ -1,5 +1,5 @@ { - "system": "Apache Kylin 5.0.2-GA (Parquet, single, no cube)", + "system": "Kylin", "date": "2026-10-04", "machine": "c7a.metal-48xl", "cluster_size": 1, diff --git a/kylin5/results/20261004/t3a.small.json b/kylin/results/20261004/t3a.small.json similarity index 96% rename from kylin5/results/20261004/t3a.small.json rename to kylin/results/20261004/t3a.small.json index 402a121af7..62ef243309 100644 --- a/kylin5/results/20261004/t3a.small.json +++ b/kylin/results/20261004/t3a.small.json @@ -1,5 +1,5 @@ { - "system": "Apache Kylin 5.0.2-GA (Parquet, single, no cube)", + "system": "Kylin", "date": "2026-10-04", "machine": "t3a.small", "cluster_size": 1, diff --git a/kylin5/start b/kylin/start similarity index 98% rename from kylin5/start rename to kylin/start index 285b9cc8eb..2d9607983e 100755 --- a/kylin5/start +++ b/kylin/start @@ -3,7 +3,7 @@ set -e # All-in-one container; create-or-start if needed. # -m 10G is the vendor default for this tag (see README.md). -CONTAINER=kylin5-clickbench +CONTAINER=kylin-clickbench if sudo docker ps --format '{{.Names}}' | grep -qx "$CONTAINER"; then exit 0 fi diff --git a/kylin5/stop b/kylin/stop similarity index 77% rename from kylin5/stop rename to kylin/stop index be80ad07fe..79801f62c4 100755 --- a/kylin5/stop +++ b/kylin/stop @@ -2,5 +2,5 @@ # BENCH_RESTARTABLE=no (see ./benchmark.sh) means benchmark-common.sh # never calls this during the cold-cycle sweep. Provided anyway for # manual lifecycle management. -sudo docker stop kylin5-clickbench 2>/dev/null || true +sudo docker stop kylin-clickbench 2>/dev/null || true exit 0 diff --git a/kylin5/template.json b/kylin/template.json similarity index 69% rename from kylin5/template.json rename to kylin/template.json index 846178a1f0..3e03787e43 100644 --- a/kylin5/template.json +++ b/kylin/template.json @@ -1,5 +1,5 @@ { - "system": "Apache Kylin 5.0.2-GA (Parquet, single, no cube)", + "system": "Kylin", "proprietary": "no", "hardware": "cpu", "tuned": "no",