You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kyuubi.apache.org by ho...@apache.org on 2022/07/05 01:17:29 UTC
[incubator-kyuubi] branch master updated: [KYUUBI #2895] Show final info in trino engine
This is an automated email from the ASF dual-hosted git repository.
hongdd pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-kyuubi.git
The following commit(s) were added to refs/heads/master by this push:
new 66a45f3e6 [KYUUBI #2895] Show final info in trino engine
66a45f3e6 is described below
commit 66a45f3e6c2a6e51aae6cd3e688227d85cae3732
Author: hongdongdong <ho...@cmss.chinamobile.com>
AuthorDate: Tue Jul 5 09:17:18 2022 +0800
[KYUUBI #2895] Show final info in trino engine
### _Why are the changes needed?_
### _How was this patch tested?_
- [ ] Add some test cases that check the changes thoroughly including negative and positive cases if possible
- [x] Add screenshots for manual tests if appropriate

- [X] [Run test](https://kyuubi.apache.org/docs/latest/develop_tools/testing.html#running-tests) locally before make a pull request
Closes #2896 from hddong/trino-result-info.
Closes #2895
757019cf [hongdongdong] fix scala style
f40b1c53 [hongdongdong] Fix
3edbdfb3 [hongdongdong] [KYUUBI #2895] Show final info in trino engine
Authored-by: hongdongdong <ho...@cmss.chinamobile.com>
Signed-off-by: hongdongdong <ho...@cmss.chinamobile.com>
---
docs/deployment/settings.md | 2 +
.../kyuubi/engine/trino/ProgressFormatUtils.java | 240 +++++++++++++++++++++
.../engine/trino/TrinoConsoleProgressBar.scala | 30 +++
.../kyuubi/engine/trino/TrinoStatement.scala | 20 +-
.../kyuubi/engine/trino/TrinoStatusPrinter.scala | 125 +++++++++++
.../engine/trino/operation/ExecuteStatement.scala | 3 +-
.../org/apache/kyuubi/config/KyuubiConf.scala | 14 ++
7 files changed, 429 insertions(+), 5 deletions(-)
diff --git a/docs/deployment/settings.md b/docs/deployment/settings.md
index 0bc775d97..397811411 100644
--- a/docs/deployment/settings.md
+++ b/docs/deployment/settings.md
@@ -443,6 +443,8 @@ kyuubi.session.engine.startup.waitCompletion|true|Whether to wait for completion
kyuubi.session.engine.trino.connection.catalog|<undefined>|The default catalog that trino engine will connect to|string|1.5.0
kyuubi.session.engine.trino.connection.url|<undefined>|The server url that trino engine will connect to|string|1.5.0
kyuubi.session.engine.trino.main.resource|<undefined>|The package used to create Trino engine remote job. If it is undefined, Kyuubi will use the default|string|1.5.0
+kyuubi.session.engine.trino.showProgress|true|When true, show the progress bar and final info in the trino engine log.|boolean|1.6.0
+kyuubi.session.engine.trino.showProgress.debug|false|When true, show the progress debug info in the trino engine log.|boolean|1.6.0
kyuubi.session.idle.timeout|PT6H|session idle timeout, it will be closed when it's not accessed for this duration|duration|1.2.0
kyuubi.session.local.dir.allow.list||The local dir list that are allowed to access by the kyuubi session application. User might set some parameters such as `spark.files` and it will upload some local files when launching the kyuubi engine, if the local dir allow list is defined, kyuubi will check whether the path to upload is in the allow list. Note that, if it is empty, there is no limitation for that and please use absolute path list.|seq|1.6.0
kyuubi.session.name|<undefined>|A human readable name of session and we use empty string by default. This name will be recorded in event. Note that, we only apply this value from session conf.|string|1.4.0
diff --git a/externals/kyuubi-trino-engine/src/main/java/org/apache/kyuubi/engine/trino/ProgressFormatUtils.java b/externals/kyuubi-trino-engine/src/main/java/org/apache/kyuubi/engine/trino/ProgressFormatUtils.java
new file mode 100644
index 000000000..23cccd7a9
--- /dev/null
+++ b/externals/kyuubi-trino-engine/src/main/java/org/apache/kyuubi/engine/trino/ProgressFormatUtils.java
@@ -0,0 +1,240 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.kyuubi.engine.trino;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.base.Strings.repeat;
+import static java.lang.Math.max;
+import static java.lang.Math.min;
+import static java.lang.String.format;
+import static java.util.concurrent.TimeUnit.MINUTES;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import com.google.common.primitives.Ints;
+import io.airlift.units.DataSize;
+import io.airlift.units.Duration;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
+
+/** Copy from trino-cli `FormatUtils` */
+public final class ProgressFormatUtils {
+ private ProgressFormatUtils() {}
+
+ public static String formatCount(long count) {
+ double fractional = count;
+ String unit = "";
+ if (fractional > 1000) {
+ fractional /= 1000;
+ unit = "K";
+ }
+ if (fractional > 1000) {
+ fractional /= 1000;
+ unit = "M";
+ }
+ if (fractional > 1000) {
+ fractional /= 1000;
+ unit = "B";
+ }
+ if (fractional > 1000) {
+ fractional /= 1000;
+ unit = "T";
+ }
+ if (fractional > 1000) {
+ fractional /= 1000;
+ unit = "Q";
+ }
+
+ return format("%s%s", getFormat(fractional).format(fractional), unit);
+ }
+
+ public static String formatCountRate(double count, Duration duration, boolean longForm) {
+ double rate = count / duration.getValue(SECONDS);
+ if (Double.isNaN(rate) || Double.isInfinite(rate)) {
+ rate = 0;
+ }
+
+ String rateString = formatCount((long) rate);
+ if (longForm) {
+ if (rateString.endsWith(" ")) {
+ rateString = rateString.substring(0, rateString.length() - 1);
+ }
+ rateString += "/s";
+ }
+ return rateString;
+ }
+
+ public static String formatDataSize(DataSize size, boolean longForm) {
+ double fractional = size.toBytes();
+ String unit = null;
+ if (fractional >= 1024) {
+ fractional /= 1024;
+ unit = "K";
+ }
+ if (fractional >= 1024) {
+ fractional /= 1024;
+ unit = "M";
+ }
+ if (fractional >= 1024) {
+ fractional /= 1024;
+ unit = "G";
+ }
+ if (fractional >= 1024) {
+ fractional /= 1024;
+ unit = "T";
+ }
+ if (fractional >= 1024) {
+ fractional /= 1024;
+ unit = "P";
+ }
+
+ if (unit == null) {
+ unit = "B";
+ } else if (longForm) {
+ unit += "B";
+ }
+
+ return format("%s%s", getFormat(fractional).format(fractional), unit);
+ }
+
+ public static String formatDataRate(DataSize dataSize, Duration duration, boolean longForm) {
+ long rate = Math.round(dataSize.toBytes() / duration.getValue(SECONDS));
+ if (Double.isNaN(rate) || Double.isInfinite(rate)) {
+ rate = 0;
+ }
+
+ String rateString = formatDataSize(DataSize.ofBytes(rate), false);
+ if (longForm) {
+ if (!rateString.endsWith("B")) {
+ rateString += "B";
+ }
+ rateString += "/s";
+ }
+ return rateString;
+ }
+
+ private static DecimalFormat getFormat(double value) {
+ DecimalFormat format;
+ if (value < 10) {
+ // show up to two decimals to get 3 significant digits
+ format = new DecimalFormat("#.##");
+ } else if (value < 100) {
+ // show up to one decimal to get 3 significant digits
+ format = new DecimalFormat("#.#");
+ } else {
+ // show no decimals -- we have enough digits in the integer part
+ format = new DecimalFormat("#");
+ }
+
+ format.setRoundingMode(RoundingMode.HALF_UP);
+ return format;
+ }
+
+ public static String pluralize(String word, int count) {
+ if (count != 1) {
+ return word + "s";
+ }
+ return word;
+ }
+
+ public static String formatTime(Duration duration) {
+ int totalSeconds = Ints.saturatedCast(duration.roundTo(SECONDS));
+ int minutes = totalSeconds / 60;
+ int seconds = totalSeconds % 60;
+
+ return format("%s:%02d", minutes, seconds);
+ }
+
+ public static String formatFinalTime(Duration duration) {
+ long totalMillis = duration.toMillis();
+
+ if (totalMillis >= MINUTES.toMillis(1)) {
+ return formatTime(duration);
+ }
+
+ return format("%.2f", (totalMillis / 1000.0));
+ }
+
+ /** Format an indeterminate progress bar: [ <=> ] */
+ public static String formatProgressBar(int width, int tick) {
+ int markerWidth = 3; // must be odd >= 3 (1 for each < and > marker, the rest for "="
+
+ int range =
+ width - markerWidth; // "lower" must fall within this range for the marker to fit within the
+ // bar
+ int lower = tick % range;
+
+ if (((tick / range) % 2) == 1) { // are we going or coming back?
+ lower = range - lower;
+ }
+
+ return repeat(" ", lower)
+ + "<"
+ + repeat("=", markerWidth - 2)
+ + ">"
+ + repeat(" ", width - (lower + markerWidth));
+ }
+
+ public static String formatProgressBar(int width, int complete, int running, int total) {
+ if (total == 0) {
+ return repeat(" ", width);
+ }
+
+ int pending = max(0, total - complete - running);
+
+ // compute nominal lengths
+ int completeLength = min(width, ceil(complete * width, total));
+ int pendingLength = min(width, ceil(pending * width, total));
+
+ // leave space for at least one ">" as long as running is > 0
+ int minRunningLength = (running > 0) ? 1 : 0;
+ int runningLength = max(min(width, ceil(running * width, total)), minRunningLength);
+
+ // adjust to fix rounding errors
+ if (((completeLength + runningLength + pendingLength) != width) && (pending > 0)) {
+ // sacrifice "pending" if we're over the max width
+ pendingLength = max(0, width - completeLength - runningLength);
+ }
+ if ((completeLength + runningLength + pendingLength) != width) {
+ // then, sacrifice "running"
+ runningLength = max(minRunningLength, width - completeLength - pendingLength);
+ }
+ if (((completeLength + runningLength + pendingLength) > width) && (complete > 0)) {
+ // finally, sacrifice "complete" if we're still over the limit
+ completeLength = max(0, width - runningLength - pendingLength);
+ }
+
+ checkState(
+ (completeLength + runningLength + pendingLength) == width,
+ "Expected completeLength (%s) + runningLength (%s) + pendingLength (%s) == width (%s), was %s for complete = %s, running = %s, total = %s",
+ completeLength,
+ runningLength,
+ pendingLength,
+ width,
+ completeLength + runningLength + pendingLength,
+ complete,
+ running,
+ total);
+
+ return repeat("=", completeLength) + repeat(">", runningLength) + repeat(" ", pendingLength);
+ }
+
+ /** Ceiling of integer division */
+ private static int ceil(int dividend, int divisor) {
+ return ((dividend + divisor) - 1) / divisor;
+ }
+}
diff --git a/externals/kyuubi-trino-engine/src/main/scala/org/apache/kyuubi/engine/trino/TrinoConsoleProgressBar.scala b/externals/kyuubi-trino-engine/src/main/scala/org/apache/kyuubi/engine/trino/TrinoConsoleProgressBar.scala
new file mode 100644
index 000000000..feb46a856
--- /dev/null
+++ b/externals/kyuubi-trino-engine/src/main/scala/org/apache/kyuubi/engine/trino/TrinoConsoleProgressBar.scala
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.kyuubi.engine.trino
+
+import org.apache.kyuubi.operation.log.OperationLog
+
+class TrinoConsoleProgressBar(operationLog: OperationLog) {
+
+ // Carriage return
+ private val CR = '\r'
+
+ def printLine(): Unit = operationLog.write("\n")
+ def printLine(s: String): Unit = operationLog.write(s"$s\n")
+ def reprintLine(s: String): Unit = printLine(s"$s$CR")
+}
diff --git a/externals/kyuubi-trino-engine/src/main/scala/org/apache/kyuubi/engine/trino/TrinoStatement.scala b/externals/kyuubi-trino-engine/src/main/scala/org/apache/kyuubi/engine/trino/TrinoStatement.scala
index cdfec61b9..2508f326e 100644
--- a/externals/kyuubi-trino-engine/src/main/scala/org/apache/kyuubi/engine/trino/TrinoStatement.scala
+++ b/externals/kyuubi-trino-engine/src/main/scala/org/apache/kyuubi/engine/trino/TrinoStatement.scala
@@ -32,7 +32,10 @@ import io.trino.client.StatementClientFactory
import org.apache.kyuubi.KyuubiSQLException
import org.apache.kyuubi.Logging
import org.apache.kyuubi.config.KyuubiConf
+import org.apache.kyuubi.config.KyuubiConf.ENGINE_TRINO_SHOW_PROGRESS
+import org.apache.kyuubi.config.KyuubiConf.ENGINE_TRINO_SHOW_PROGRESS_DEBUG
import org.apache.kyuubi.engine.trino.TrinoConf.DATA_PROCESSING_POOL_SIZE
+import org.apache.kyuubi.operation.log.OperationLog
/**
* Trino client communicate with trino cluster.
@@ -40,12 +43,15 @@ import org.apache.kyuubi.engine.trino.TrinoConf.DATA_PROCESSING_POOL_SIZE
class TrinoStatement(
trinoContext: TrinoContext,
kyuubiConf: KyuubiConf,
- sql: String) extends Logging {
+ sql: String,
+ operationLog: Option[OperationLog]) extends Logging {
private lazy val trino = StatementClientFactory
.newStatementClient(trinoContext.httpClient, trinoContext.clientSession.get, sql)
private lazy val dataProcessingPoolSize = kyuubiConf.get(DATA_PROCESSING_POOL_SIZE)
+ private lazy val showProcess = kyuubiConf.get(ENGINE_TRINO_SHOW_PROGRESS)
+ private lazy val showDebug = kyuubiConf.get(ENGINE_TRINO_SHOW_PROGRESS_DEBUG)
implicit val ec: ExecutionContext =
ExecutionContext.fromExecutor(Executors.newFixedThreadPool(dataProcessingPoolSize))
@@ -90,6 +96,9 @@ class TrinoStatement(
}
} else {
Verify.verify(trino.isFinished)
+ if (operationLog.isDefined && showProcess) {
+ TrinoStatusPrinter.printFinalInfo(trino, operationLog.get, showDebug)
+ }
val finalStatus = trino.finalStatusInfo()
if (finalStatus.getError() != null) {
throw KyuubiSQLException(
@@ -103,7 +112,6 @@ class TrinoStatement(
}
.takeWhile(_._1)
.flatMap(_._2)
-
}
def updateTrinoContext(): Unit = {
@@ -135,7 +143,11 @@ class TrinoStatement(
}
object TrinoStatement {
- def apply(trinoContext: TrinoContext, kyuubiConf: KyuubiConf, sql: String): TrinoStatement = {
- new TrinoStatement(trinoContext, kyuubiConf, sql)
+ def apply(
+ trinoContext: TrinoContext,
+ kyuubiConf: KyuubiConf,
+ sql: String,
+ operationLog: Option[OperationLog] = None): TrinoStatement = {
+ new TrinoStatement(trinoContext, kyuubiConf, sql, operationLog)
}
}
diff --git a/externals/kyuubi-trino-engine/src/main/scala/org/apache/kyuubi/engine/trino/TrinoStatusPrinter.scala b/externals/kyuubi-trino-engine/src/main/scala/org/apache/kyuubi/engine/trino/TrinoStatusPrinter.scala
new file mode 100644
index 000000000..0a33e71cc
--- /dev/null
+++ b/externals/kyuubi-trino-engine/src/main/scala/org/apache/kyuubi/engine/trino/TrinoStatusPrinter.scala
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.kyuubi.engine.trino
+
+import java.util.concurrent.TimeUnit._
+
+import io.airlift.units.DataSize
+import io.airlift.units.Duration
+import io.trino.client.StatementClient
+
+import org.apache.kyuubi.engine.trino.ProgressFormatUtils._
+import org.apache.kyuubi.operation.log.OperationLog
+
+/**
+ * Copy from trino-cli
+ * 1. use OperationLog instead PrintStream to out status info
+ */
+object TrinoStatusPrinter {
+
+ def printFinalInfo(
+ client: StatementClient,
+ operationLog: OperationLog,
+ debug: Boolean = false): Unit = {
+ val out = new TrinoConsoleProgressBar(operationLog)
+ val results = client.finalStatusInfo()
+ val stats = results.getStats
+
+ val wallTime = Duration.succinctDuration(stats.getElapsedTimeMillis(), MILLISECONDS)
+
+ val nodes = stats.getNodes
+ if ((nodes == 0) || (stats.getTotalSplits == 0)) {
+ return
+ }
+
+ // Query 12, FINISHED, 1 node
+ val querySummary = s"Query ${results.getId}, ${stats.getState}," +
+ s" ${nodes.formatted("%,d")} ${pluralize("node", nodes)}"
+ out.printLine(querySummary)
+
+ if (debug) {
+ out.printLine(results.getInfoUri.toString)
+ }
+
+ // Splits: 1000 total, 842 done (84.20%)
+ val splitsSummary = s"Splits: ${stats.getTotalSplits.formatted("%,d")} total," +
+ s" ${stats.getCompletedSplits.formatted("%,d")}" +
+ s" done (${stats.getProgressPercentage.orElse(0.0).formatted("%.2f")}%)"
+ out.printLine(splitsSummary)
+
+ if (debug) {
+ // CPU Time: 565.2s total, 26K rows/s, 3.85MB/s
+ val cpuTime = new Duration(stats.getCpuTimeMillis(), MILLISECONDS)
+ val cpuTimeSummary = s"CPU Time: ${cpuTime.getValue(SECONDS).formatted("%.1f")}s total, " +
+ s"${formatCountRate(
+ stats.getProcessedRows(),
+ cpuTime,
+ false).formatted("%5s")} rows/s, " +
+ s"${formatDataRate(
+ DataSize.ofBytes(stats.getProcessedBytes),
+ cpuTime,
+ true).formatted("%8s")}, " +
+ s"${percentage(
+ stats.getCpuTimeMillis(),
+ stats.getWallTimeMillis()).formatted("%d")}% active"
+ out.printLine(cpuTimeSummary)
+
+ val parallelism = cpuTime.getValue(MILLISECONDS) / wallTime.getValue(MILLISECONDS)
+
+ // Per Node: 3.5 parallelism, 83.3K rows/s, 0.7 MB/s
+ val perNodeSummary = s"Per Node: ${(parallelism / nodes).formatted("%.1f")} parallelism, " +
+ s"${formatCountRate(
+ stats.getProcessedRows().toDouble / nodes,
+ wallTime,
+ false).formatted("%5s")} rows/s, " +
+ s"${formatDataRate(
+ DataSize.ofBytes(stats.getProcessedBytes() / nodes),
+ wallTime,
+ true).formatted("%8s")}"
+ out.reprintLine(perNodeSummary)
+
+ // Parallelism: 5.3
+ out.printLine(s"Parallelism: ${parallelism.formatted("%.1f")}")
+
+ // Peak Memory: 1.97GB
+ out.reprintLine("Peak Memory: " + formatDataSize(
+ DataSize.ofBytes(stats.getPeakMemoryBytes()),
+ true))
+
+ // Spilled Data: 20GB
+ if (stats.getSpilledBytes() > 0) {
+ out.reprintLine("Spilled: " + formatDataSize(
+ DataSize.ofBytes(stats.getSpilledBytes()),
+ true))
+ }
+ }
+
+ // 0:32 [2.12GB, 15M rows] [67MB/s, 463K rows/s]
+ val statsLine = s"${formatFinalTime(wallTime)} " +
+ s"[${formatCount(stats.getProcessedRows())} rows, " +
+ s"${formatDataSize(DataSize.ofBytes(stats.getProcessedBytes()), true)}] " +
+ s"[${formatCountRate(stats.getProcessedRows(), wallTime, false)} rows/s, " +
+ s"${formatDataRate(DataSize.ofBytes(stats.getProcessedBytes()), wallTime, true)}]"
+ out.printLine(statsLine)
+ }
+
+ def percentage(count: Double, total: Double): Int = {
+ if (total == 0) 0 else Math.min(100, (count * 100.0) / total).toInt
+ }
+
+}
diff --git a/externals/kyuubi-trino-engine/src/main/scala/org/apache/kyuubi/engine/trino/operation/ExecuteStatement.scala b/externals/kyuubi-trino-engine/src/main/scala/org/apache/kyuubi/engine/trino/operation/ExecuteStatement.scala
index b6aed48c7..eb1b27300 100644
--- a/externals/kyuubi-trino-engine/src/main/scala/org/apache/kyuubi/engine/trino/operation/ExecuteStatement.scala
+++ b/externals/kyuubi-trino-engine/src/main/scala/org/apache/kyuubi/engine/trino/operation/ExecuteStatement.scala
@@ -54,7 +54,8 @@ class ExecuteStatement(
override protected def runInternal(): Unit = {
addTimeoutMonitor(queryTimeout)
- val trinoStatement = TrinoStatement(trinoContext, session.sessionManager.getConf, statement)
+ val trinoStatement =
+ TrinoStatement(trinoContext, session.sessionManager.getConf, statement, getOperationLog)
trino = trinoStatement.getTrinoClient
if (shouldRunAsync) {
val asyncOperation = new Runnable {
diff --git a/kyuubi-common/src/main/scala/org/apache/kyuubi/config/KyuubiConf.scala b/kyuubi-common/src/main/scala/org/apache/kyuubi/config/KyuubiConf.scala
index d48c5750d..4da93194f 100644
--- a/kyuubi-common/src/main/scala/org/apache/kyuubi/config/KyuubiConf.scala
+++ b/kyuubi-common/src/main/scala/org/apache/kyuubi/config/KyuubiConf.scala
@@ -822,6 +822,20 @@ object KyuubiConf {
.stringConf
.createOptional
+ val ENGINE_TRINO_SHOW_PROGRESS: ConfigEntry[Boolean] =
+ buildConf("kyuubi.session.engine.trino.showProgress")
+ .doc("When true, show the progress bar and final info in the trino engine log.")
+ .version("1.6.0")
+ .booleanConf
+ .createWithDefault(true)
+
+ val ENGINE_TRINO_SHOW_PROGRESS_DEBUG: ConfigEntry[Boolean] =
+ buildConf("kyuubi.session.engine.trino.showProgress.debug")
+ .doc("When true, show the progress debug info in the trino engine log.")
+ .version("1.6.0")
+ .booleanConf
+ .createWithDefault(false)
+
val ENGINE_HIVE_MAIN_RESOURCE: OptionalConfigEntry[String] =
buildConf("kyuubi.session.engine.hive.main.resource")
.doc("The package used to create Hive engine remote job. If it is undefined," +