diff --git a/.gitignore b/.gitignore index 848a7a9c..e4c16c1f 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ __pycache__/ # Default benchmark output directory benchmark_output + +# Generated Presto Config +presto/docker/config/generated/ diff --git a/presto/docker/config/etc_common/catalog/hive.properties b/presto/docker/config/etc_common/catalog/hive.properties deleted file mode 100644 index dee8ce8c..00000000 --- a/presto/docker/config/etc_common/catalog/hive.properties +++ /dev/null @@ -1,8 +0,0 @@ -connector.name=hive-hadoop2 - -# See https://prestodb.io/docs/current/installation/deployment.html#configuring-a-file-based-metastore for more details. -hive.metastore=file -hive.metastore.catalog.dir=file:/var/lib/presto/data/hive/metastore -hive.allow-drop-table=true - -hive.file-splittable=false \ No newline at end of file diff --git a/presto/docker/config/etc_common/catalog/tpch.properties b/presto/docker/config/etc_common/catalog/tpch.properties deleted file mode 100644 index 446fc789..00000000 --- a/presto/docker/config/etc_common/catalog/tpch.properties +++ /dev/null @@ -1,2 +0,0 @@ -connector.name=tpch -tpch.column-naming=STANDARD diff --git a/presto/docker/config/etc_common/log.properties b/presto/docker/config/etc_common/log.properties deleted file mode 100644 index 1c52627f..00000000 --- a/presto/docker/config/etc_common/log.properties +++ /dev/null @@ -1 +0,0 @@ -com.facebook.presto=INFO diff --git a/presto/docker/config/etc_coordinator/config_java.properties b/presto/docker/config/etc_coordinator/config_java.properties deleted file mode 100644 index 5fa6561f..00000000 --- a/presto/docker/config/etc_coordinator/config_java.properties +++ /dev/null @@ -1,15 +0,0 @@ -# Note that adding Presto Native specific configurations here would cause a deployment failure. -coordinator=true -node-scheduler.include-coordinator=false -http-server.http.port=8080 -discovery-server.enabled=true -discovery.uri=http://presto-coordinator:8080 - -# Query execution settings -query.max-memory=32GB -query.max-memory-per-node=16GB -query.max-total-memory-per-node=16GB - -# Set required workers to 1 (minimum allowed) and reduce wait time -query-manager.required-workers=1 -query-manager.required-workers-max-wait=10s diff --git a/presto/docker/config/etc_coordinator/config_native.properties b/presto/docker/config/etc_coordinator/config_native.properties deleted file mode 100644 index 7e4a6c9f..00000000 --- a/presto/docker/config/etc_coordinator/config_native.properties +++ /dev/null @@ -1,23 +0,0 @@ -coordinator=true -node-scheduler.include-coordinator=false -http-server.http.port=8080 -discovery-server.enabled=true -discovery.uri=http://presto-coordinator:8080 - -# Set presto version to match worker -presto.version=testversion - -# Query execution settings -query.max-memory=32GB -query.max-memory-per-node=16GB -query.max-total-memory-per-node=16GB - -# Set required workers to 1 (minimum allowed) and reduce wait time -query-manager.required-workers=1 -query-manager.required-workers-max-wait=10s - -# Set required configuration for Presto C++ workers as indicated in https://prestodb.io/docs/current/presto_cpp/properties.html#coordinator-properties -native-execution-enabled=true -optimizer.optimize-hash-generation=false -regex-library=RE2J -use-alternative-function-signatures=true diff --git a/presto/docker/config/etc_coordinator/node.properties b/presto/docker/config/etc_coordinator/node.properties deleted file mode 100644 index 5abac19b..00000000 --- a/presto/docker/config/etc_coordinator/node.properties +++ /dev/null @@ -1,4 +0,0 @@ -node.id=coordinator -node.environment=test -node.location=test-location -node.data-dir=/var/lib/presto/data diff --git a/presto/docker/config/etc_worker/config_java.properties b/presto/docker/config/etc_worker/config_java.properties deleted file mode 100644 index 4c7cebd7..00000000 --- a/presto/docker/config/etc_worker/config_java.properties +++ /dev/null @@ -1,3 +0,0 @@ -coordinator=false -http-server.http.port=8080 -discovery.uri=http://presto-coordinator:8080 \ No newline at end of file diff --git a/presto/docker/config/etc_worker/config_native.properties b/presto/docker/config/etc_worker/config_native.properties deleted file mode 100644 index bff6a760..00000000 --- a/presto/docker/config/etc_worker/config_native.properties +++ /dev/null @@ -1,10 +0,0 @@ -coordinator=false -http-server.http.port=8080 -discovery.uri=http://presto-coordinator:8080 - -presto.version=testversion - -# Query execution settings -query.max-memory=32GB -query.max-memory-per-node=16GB -query.max-total-memory-per-node=16GB \ No newline at end of file diff --git a/presto/docker/config/etc_worker/node.properties b/presto/docker/config/etc_worker/node.properties deleted file mode 100644 index 9ff21cf3..00000000 --- a/presto/docker/config/etc_worker/node.properties +++ /dev/null @@ -1,4 +0,0 @@ -node.id=worker -node.environment=test -node.location=test-location -node.data-dir=/var/lib/presto/data diff --git a/presto/docker/config/params.json b/presto/docker/config/params.json new file mode 100644 index 00000000..12c3c5f2 --- /dev/null +++ b/presto/docker/config/params.json @@ -0,0 +1,15 @@ +{ + "sys_reserved_mem_percent": 0.05, + "sys_reserved_mem_cap_gb": 2, + "heap_size_percent_of_container_mem": 0.9, + "headroom_percent_of_heap": 0.2, + "query_max_total_mem_per_node_percent_of_heap": 0.8, + "query_max_mem_per_node_percent_of_total": 0.9, + "proxygen_mem_per_worker_gb": 0.125, + "proxygen_mem_cap_gb": 2, + "native_buffer_mem_percent": 0.05, + "native_buffer_mem_cap_gb": 32, + "native_query_mem_percent_of_sys_mem": 0.95, + "join_max_bcast_size_percent_of_container_mem": 0.01, + "memory_push_back_start_below_limit_gb": 5 +} diff --git a/presto/docker/config/template/etc_common/catalog/hive.properties b/presto/docker/config/template/etc_common/catalog/hive.properties new file mode 100644 index 00000000..db4e38f1 --- /dev/null +++ b/presto/docker/config/template/etc_common/catalog/hive.properties @@ -0,0 +1,21 @@ +# Select the connector implementation. "hive-hadoop2" uses the Hive connector +# backed by Hadoop 2.x libraries which is the default for Presto's Hive support. +connector.name=hive-hadoop2 + +# Configure the metastore implementation. "file" enables a simple file-based +# metastore suitable for local testing without an external Hive Metastore (HMS). +# See https://prestodb.io/docs/current/installation/deployment.html#configuring-a-file-based-metastore for more details. +hive.metastore=file +# Root directory where the file-based metastore stores table and partition +# metadata. This path is inside the container volume so state persists across +# server restarts during tests. +hive.metastore.catalog.dir=file:/var/lib/presto/data/hive/metastore +# Allow DROP TABLE statements. Enabled to make smoke/perf tests able to reset +# state and clean up artifacts without manual intervention. +hive.allow-drop-table=true + +# Control whether Presto can split files for parallel reads. Disable when the +# file compression/format isn't splittable to avoid read failures. TPCH Parquet +# test data commonly uses SNAPPY compression that isn't splittable at the file +# level here, hence this must be false. +hive.file-splittable=false diff --git a/presto/docker/config/template/etc_common/catalog/tpch.properties b/presto/docker/config/template/etc_common/catalog/tpch.properties new file mode 100644 index 00000000..824ac5cb --- /dev/null +++ b/presto/docker/config/template/etc_common/catalog/tpch.properties @@ -0,0 +1,7 @@ +# Select the built-in TPCH connector that generates synthetic datasets on the +# fly. Used for functional and performance testing without external storage. +connector.name=tpch + +# Choose the column naming convention for generated tables. "STANDARD" matches +# the canonical TPC-H schema so queries from benchmarks run unmodified. +tpch.column-naming=STANDARD diff --git a/presto/docker/config/etc_common/config.properties b/presto/docker/config/template/etc_common/config.properties similarity index 100% rename from presto/docker/config/etc_common/config.properties rename to presto/docker/config/template/etc_common/config.properties diff --git a/presto/docker/config/etc_common/jvm.config b/presto/docker/config/template/etc_common/jvm.config similarity index 53% rename from presto/docker/config/etc_common/jvm.config rename to presto/docker/config/template/etc_common/jvm.config index 8a1aba4f..7ea5d695 100644 --- a/presto/docker/config/etc_common/jvm.config +++ b/presto/docker/config/template/etc_common/jvm.config @@ -1,12 +1,26 @@ +# Enable JVM server mode for better JIT optimization on long-running servers. -server --Xmx24G +# Maximum Java heap size; templated to match container memory. +-Xmx{{ .HeapSizeGb }}G +# Initial Java heap size; equal to max to avoid heap resizing pauses. +-Xms{{ .HeapSizeGb }}G +# Use the G1 garbage collector for predictable pause times. -XX:+UseG1GC +# Tune G1 region size to balance GC throughput and fragmentation. -XX:G1HeapRegionSize=32M +# Abort when GC overhead becomes excessive to prevent hangs. -XX:+UseGCOverheadLimit +# Make System.gc() invoke concurrent collections to reduce pauses. -XX:+ExplicitGCInvokesConcurrent +# Create heap dumps on OOM for postmortem analysis. -XX:+HeapDumpOnOutOfMemoryError +# Exit the JVM on OOM so orchestration can restart the process. -XX:+ExitOnOutOfMemoryError +# Cap NIO direct buffer cache to limit retained off-heap memory. +-Djdk.nio.maxCachedBufferSize=2000000 +# Allow self-attach for profilers (e.g., async-profiler) during debugging. -Djdk.attach.allowAttachSelf=true +# Open JDK internals for reflection required by Presto and dependencies under Java 11+ modules. --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.ref=ALL-UNNAMED diff --git a/presto/docker/config/template/etc_common/log.properties b/presto/docker/config/template/etc_common/log.properties new file mode 100644 index 00000000..a6503f14 --- /dev/null +++ b/presto/docker/config/template/etc_common/log.properties @@ -0,0 +1,4 @@ +# Root logger level for all Presto server components. INFO provides useful +# operational diagnostics while keeping logs compact for tests. Increase to +# DEBUG when deep troubleshooting is needed. +com.facebook.presto=INFO diff --git a/presto/docker/config/etc_common/node.properties b/presto/docker/config/template/etc_common/node.properties similarity index 100% rename from presto/docker/config/etc_common/node.properties rename to presto/docker/config/template/etc_common/node.properties diff --git a/presto/docker/config/template/etc_coordinator/config_java.properties b/presto/docker/config/template/etc_coordinator/config_java.properties new file mode 100644 index 00000000..b7e62810 --- /dev/null +++ b/presto/docker/config/template/etc_coordinator/config_java.properties @@ -0,0 +1,23 @@ +# Java coordinator configuration. Avoid adding Presto Native-only properties +# here, as they are unsupported by the Java engine and may prevent startup. +# Run this node as the cluster coordinator; it schedules and manages queries. +coordinator=true +# Do not schedule worker tasks on the coordinator to avoid resource contention. +node-scheduler.include-coordinator=false +# Coordinator REST/HTTP port for clients and workers. +http-server.http.port=8080 +# Embedded service that provides node discovery for workers. +discovery-server.enabled=true +# Address workers use to register with the discovery service. +discovery.uri=http://presto-coordinator:8080 + +# Min workers before query starts; keep minimal for quick tests. +query-manager.required-workers=1 +# Maximum wait for required workers to join. +query-manager.required-workers-max-wait=10s + +# Basic memory configuration settings for Java coordinator +query.max-total-memory-per-node=16GB +query.max-total-memory=32GB +query.max-memory-per-node=16GB +query.max-memory=32GB diff --git a/presto/docker/config/template/etc_coordinator/config_native.properties b/presto/docker/config/template/etc_coordinator/config_native.properties new file mode 100644 index 00000000..b08eca85 --- /dev/null +++ b/presto/docker/config/template/etc_coordinator/config_native.properties @@ -0,0 +1,110 @@ +# Run this node as the cluster coordinator; it schedules and manages queries. +coordinator=true +# Do not schedule worker tasks on the coordinator to avoid resource contention. +node-scheduler.include-coordinator=false +# Coordinator REST/HTTP port for clients and workers. +http-server.http.port=8080 +# Embedded service that provides node discovery for workers. +discovery-server.enabled=true +# Address workers use to register with the discovery service. +discovery.uri=http://presto-coordinator:8080 + +# Set Presto version string to match workers for compatibility in tests. +presto.version=testversion + +# Keep up to 30 rolled log files to bound disk usage. +log.max-history=30 +# Rotate logs at ~100MB per file for manageable artifacts. +log.max-size=104857600B +# Reserve heap headroom per node to reduce full GC and OOM risk. +memory.heap-headroom-per-node={{ .HeadroomGb }}GB + +# Limit pending splits per task to avoid excessive memory usage. +node-scheduler.max-pending-splits-per-task=2000 +# Cap concurrent splits per node for balanced scheduling. +node-scheduler.max-splits-per-node=2000 + +# Optimizer flags +# Use known constraints to simplify plan and filters. +optimizer.exploit-constraints=true +# Rewrite large IN lists as joins for performance in some cases. +optimizer.in-predicates-as-inner-joins-enabled=true +# Allow partial aggregations to reduce data shuffled across stages. +optimizer.partial-aggregation-strategy=automatic +# Prefer partial aggregations when beneficial. +optimizer.prefer-partial-aggregation=true +# Default selectivity heuristic for joins when stats are missing. +optimizer.default-join-selectivity-coefficient=0.1 +# Infer additional range predicates to improve filtering. +optimizer.infer-inequality-predicates=true +# Support complex equi-join patterns in the optimizer. +optimizer.handle-complex-equi-joins=true +# Add dynamic domain filters to reduce scanned data. +optimizer.generate-domain-filters=true +# Upper limit for broadcasted table size to avoid memory blowups. +# See: https://github.com/prestodb/presto/issues/22161#issuecomment-1994128619 +join-max-broadcast-table-size={{ .JoinMaxBroadcastTableSizeMb }}MB + +# Client request timeout to avoid hung queries. +query.client.timeout=30m +# Use phased execution policy for improved large query scheduling. +query.execution-policy=phased +# Kill queries based on total reservation on blocked nodes to recover memory. +query.low-memory-killer.policy=total-reservation-on-blocked-nodes +# Upper limit on query wall time to keep tests bounded. +query.max-execution-time=30m +# Keep metadata of up to 1000 queries for UI and debugging. +query.max-history=1000 +# Memory quotas per node and cluster to protect stability. +query.max-total-memory-per-node={{ .JavaQueryMaxTotalMemPerNodeGb }}GB +query.max-total-memory={{ mul .JavaQueryMaxTotalMemPerNodeGb .NumberOfWorkers }}GB +query.max-memory-per-node={{ .JavaQueryMaxMemPerNodeGb }}GB +query.max-memory={{ mul .JavaQueryMaxMemPerNodeGb .NumberOfWorkers }}GB +# Allow deep stage DAGs required by certain benchmark queries. +query.max-stage-count=1300 +# Retain query info at least this long for diagnostics. +query.min-expire-age=120.00m +# Larger scheduling batches for better throughput in benchmarks. +query.min-schedule-split-batch-size=2000 +# Raise warning threshold to align with higher max stage count. +query.stage-count-warning-threshold=150 +# Increase serialized plan/query length limit for complex benchmark queries. +query.max-length=2000000 + +# Disable dynamic filtering for deterministic benchmarking. +experimental.enable-dynamic-filtering=false +# Cap revocable memory per node to avoid overcommit. +experimental.max-revocable-memory-per-node=50GB +# Limit disk spill usage per node to bound IO and disk usage. +experimental.max-spill-per-node=50GB +# Enable repartitioning improvements for shuffle efficiency. +experimental.optimized-repartitioning=true +# Enable dereference and subfield pushdown to reduce scanned data. +experimental.pushdown-dereference-enabled=true +experimental.pushdown-subfields-enabled=true +# Cluster-wide guardrail for spill during a single query per node. +experimental.query-max-spill-per-node=50GB +# Disable reserved memory pool to simplify test behavior. +experimental.reserved-pool-enabled=false +# Stop spilling when disk usage exceeds this fraction. +experimental.spiller-max-used-space-threshold=0.7 +# Directory for spill files during execution. +experimental.spiller-spill-path=/tmp + + +# Min workers before query starts; keep minimal for quick tests. +query-manager.required-workers=1 +# Maximum wait for required workers to join. +query-manager.required-workers-max-wait=10s + +# Set required configuration for Presto C++ workers as indicated in https://prestodb.io/docs/current/presto_cpp/properties.html#coordinator-properties +native-execution-enabled=true +# Disable Java-side hash generation optimizations not used by native workers. +optimizer.optimize-hash-generation=false +# Use RE2J regex engine for performance and determinism. +regex-library=RE2J +# Enable alternative function signatures for native compatibility. +use-alternative-function-signatures=true + +# Optimize for queries that can run entirely on a single worker. +single-node-execution-enabled=true diff --git a/presto/docker/config/template/etc_coordinator/node.properties b/presto/docker/config/template/etc_coordinator/node.properties new file mode 100644 index 00000000..b628e3d8 --- /dev/null +++ b/presto/docker/config/template/etc_coordinator/node.properties @@ -0,0 +1,8 @@ +# Unique identifier for this node. Used in logs and cluster metadata. +node.id=coordinator +# Logical environment name to separate clusters (e.g., dev/test/prod). +node.environment=test +# Optional physical/logical location label for operators and UIs. +node.location=test-location +# Directory for local data such as spill, temp, and metadata caches. +node.data-dir=/var/lib/presto/data diff --git a/presto/docker/config/template/etc_worker/config_java.properties b/presto/docker/config/template/etc_worker/config_java.properties new file mode 100644 index 00000000..8ffb9641 --- /dev/null +++ b/presto/docker/config/template/etc_worker/config_java.properties @@ -0,0 +1,6 @@ +# This node is a Java worker; it executes tasks but doesn't coordinate queries. +coordinator=false +# Worker REST/HTTP port for internal and admin endpoints. +http-server.http.port=8080 +# Address of the coordinator's discovery service for registration. +discovery.uri=http://presto-coordinator:8080 diff --git a/presto/docker/config/template/etc_worker/config_native.properties b/presto/docker/config/template/etc_worker/config_native.properties new file mode 100644 index 00000000..62a824e8 --- /dev/null +++ b/presto/docker/config/template/etc_worker/config_native.properties @@ -0,0 +1,32 @@ +# This node is a worker; it executes tasks but doesn't coordinate queries. +coordinator=false +# Worker REST/HTTP port for internal and admin endpoints. +http-server.http.port=8080 +# Address of the coordinator's discovery service for registration. +discovery.uri=http://presto-coordinator:8080 + +# Set Presto version string to match the coordinator for compatibility. +presto.version=testversion + +# Total system memory available to Presto native process on this node (GB). +system-memory-gb={{ .NativeSystemMemGb }} +# Memory pool reserved for queries on this node (GB). +query-memory-gb={{ .NativeQueryMemGb }} +# Memory limit per node enforced by the coordinator for this worker. +query.max-memory-per-node={{ .NativeQueryMemGb }}GB +# Use the shared memory arbitrator to coordinate memory between tasks. +memory-arbitrator-kind=SHARED + +# Parallel driver cap per task; templated to fully utilize vCPUs on CPU nodes. +task.max-drivers-per-task={{ .VCPUPerWorker }} + +# Collect runtime metrics from the native engine for debugging and tuning. +runtime-metrics-collection-enabled=true +# Enable memory pushback to respect container limits and avoid OOM kills. +# Limit Velox memory to below container limit to maintain safety margin. +system-mem-pushback-enabled=true +system-mem-limit-gb={{ sub .ContainerMemoryGb .GeneratorParameters.MemoryPushBackStartBelowLimitGb }} +system-mem-shrink-gb=20 + +# Optimize for single-node execution when the entire query can run locally. +single-node-execution-enabled=true diff --git a/presto/docker/config/template/etc_worker/node.properties b/presto/docker/config/template/etc_worker/node.properties new file mode 100644 index 00000000..e83991d2 --- /dev/null +++ b/presto/docker/config/template/etc_worker/node.properties @@ -0,0 +1,8 @@ +# Unique identifier for this node. Used in logs and cluster metadata. +node.id=worker +# Logical environment name to separate clusters (e.g., dev/test/prod). +node.environment=test +# Optional physical/logical location label for operators and UIs. +node.location=test-location +# Directory for local data such as spill, temp, and metadata caches. +node.data-dir=/var/lib/presto/data diff --git a/presto/docker/docker-compose.common.yml b/presto/docker/docker-compose.common.yml index aa09fed8..6165006d 100644 --- a/presto/docker/docker-compose.common.yml +++ b/presto/docker/docker-compose.common.yml @@ -1,7 +1,7 @@ services: presto-base-volumes: volumes: - - ./config/etc_common:/opt/presto-server/etc + - ./config/generated/etc_common:/opt/presto-server/etc - ./.hive_metastore:/var/lib/presto/data/hive/metastore - ../testing/integration_tests/data:/var/lib/presto/data/hive/data/integration_test - ${PRESTO_DATA_DIR:-/dev/null}:/var/lib/presto/data/hive/data/user_data @@ -20,7 +20,7 @@ services: ports: - 8080:8080 volumes: - - ./config/etc_coordinator/node.properties:/opt/presto-server/etc/node.properties + - ./config/generated/etc_coordinator/node.properties:/opt/presto-server/etc/node.properties presto-base-native-worker: extends: @@ -31,5 +31,5 @@ services: environment: - GLOG_logtostderr=1 volumes: - - ./config/etc_worker/config_native.properties:/opt/presto-server/etc/config.properties - - ./config/etc_worker/node.properties:/opt/presto-server/etc/node.properties + - ./config/generated/etc_worker/node.properties:/opt/presto-server/etc/node.properties + - ./config/generated/etc_worker/config_native.properties:/opt/presto-server/etc/config.properties diff --git a/presto/docker/docker-compose.java.yml b/presto/docker/docker-compose.java.yml index 01d6d59c..f25fb508 100644 --- a/presto/docker/docker-compose.java.yml +++ b/presto/docker/docker-compose.java.yml @@ -4,7 +4,7 @@ services: file: docker-compose.common.yml service: presto-base-coordinator volumes: - - ./config/etc_coordinator/config_java.properties:/opt/presto-server/etc/config.properties + - ./config/generated/etc_coordinator/config_java.properties:/opt/presto-server/etc/config.properties presto-java-worker: extends: @@ -13,7 +13,7 @@ services: container_name: presto-java-worker image: presto-java-worker:latest volumes: - - ./config/etc_worker/config_java.properties:/opt/presto-server/etc/config.properties - - ./config/etc_worker/node.properties:/opt/presto-server/etc/node.properties + - ./config/generated/etc_worker/config_java.properties:/opt/presto-server/etc/config.properties + - ./config/generated/etc_worker/node.properties:/opt/presto-server/etc/node.properties depends_on: - presto-coordinator diff --git a/presto/docker/docker-compose.native-cpu.yml b/presto/docker/docker-compose.native-cpu.yml index 1008a55b..09fd5a87 100644 --- a/presto/docker/docker-compose.native-cpu.yml +++ b/presto/docker/docker-compose.native-cpu.yml @@ -4,7 +4,7 @@ services: file: docker-compose.common.yml service: presto-base-coordinator volumes: - - ./config/etc_coordinator/config_native.properties:/opt/presto-server/etc/config.properties + - ./config/generated/etc_coordinator/config_native.properties:/opt/presto-server/etc/config.properties presto-native-worker-cpu: extends: diff --git a/presto/docker/docker-compose.native-gpu.yml b/presto/docker/docker-compose.native-gpu.yml index 5b242e0b..376c5167 100644 --- a/presto/docker/docker-compose.native-gpu.yml +++ b/presto/docker/docker-compose.native-gpu.yml @@ -4,7 +4,7 @@ services: file: docker-compose.common.yml service: presto-base-coordinator volumes: - - ./config/etc_coordinator/config_native.properties:/opt/presto-server/etc/config.properties + - ./config/generated/etc_coordinator/config_native.properties:/opt/presto-server/etc/config.properties presto-native-worker-gpu: extends: diff --git a/presto/scripts/generate_presto_config.sh b/presto/scripts/generate_presto_config.sh new file mode 100755 index 00000000..784cd1cf --- /dev/null +++ b/presto/scripts/generate_presto_config.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash + +# Copyright (c) 2025, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -euo pipefail + +if [ ! -x ../pbench/pbench ]; then + echo "ERROR: generate_presto_config.sh script must only be run from presto:presto/scripts" + exit 1 +fi + +# get host values +NPROC=`nproc` +# lsmem will report in SI. Make sure we get values in GB. +RAM_GB=$(lsmem -b | grep "Total online memory" | awk '{print $4 / (1024*1024*1024)}') + +echo "Generating Presto Config files for ${NPROC} CPU cores and ${RAM_GB}GB RAM" + +# variant-specific behavior +# for GPU you must set vcpu_per_worker to a small number, not the CPU count +if [[ -z ${VARIANT_TYPE} || ! ${VARIANT_TYPE} =~ ^(cpu|gpu|java)$ ]]; then + echo "Error: VARIANT_TYPE must be set to a valid variant type (cpu, gpu, java)." + exit 1 +fi +if [[ "${VARIANT_TYPE}" == "gpu" ]]; then + VCPU_PER_WORKER=2 +else + VCPU_PER_WORKER=${NPROC} +fi + +# move to config directory +pushd ../docker/config > /dev/null + +# always move back even on failure +trap "popd > /dev/null" EXIT + +# (re-)generate the config.json file +rm -rf generated +mkdir -p generated +cat > generated/config.json << EOF +{ + "cluster_size": "small", + "coordinator_instance_type": "${NPROC}-core CPU and ${RAM_GB}GB RAM", + "coordinator_instance_ebs_size": 50, + "worker_instance_type": "${NPROC}-core CPU and ${RAM_GB}GB RAM", + "worker_instance_ebs_size": 50, + "number_of_workers": 1, + "memory_per_node_gb": ${RAM_GB}, + "vcpu_per_worker": ${VCPU_PER_WORKER}, + "fragment_result_cache_enabled": true, + "data_cache_enabled": true +} +EOF + +# run pbench to generate the config files +# hide default pbench logging which goes to stderr so we only see any errors +../../pbench/pbench genconfig -p params.json -t template generated 2>&1 | grep -v '\{\"level' diff --git a/presto/scripts/start_presto_helper.sh b/presto/scripts/start_presto_helper.sh index e368c09b..53585a1a 100755 --- a/presto/scripts/start_presto_helper.sh +++ b/presto/scripts/start_presto_helper.sh @@ -85,6 +85,8 @@ fi ./stop_presto.sh +./generate_presto_config.sh + # must determine CUDA_ARCHITECTURES here as nvidia-smi is not available in the docker build context CUDA_ARCHITECTURES="" if [[ "$VARIANT_TYPE" == "gpu" && "$ALL_CUDA_ARCHS" == "true" ]]; then