Hi Denys,
For Hive-LLAP, we used the attached tez-site.xml and hive-site.xml.
>From our experiments, the configuration values are reasonable.
We tried a few different values for hive.llap.daemon.num.executors, and
reported the best result.
Thank you.
Sungwoo
On Thu, Sep 10, 2026 at 11:25 PM Denys Kuzmenko <[email protected]>
wrote:
> Hi Sungwoo,
>
> We are setting up the infrastructure for performance testing and would
> like to understand if you have made any Hive configuration tuning on the
> HS2, Tez AM, or LLAP side.
>
> Could you please share any relevant Hive configuration changes or tuning
> parameters you used?
>
> Thank you,
> Denys
>
<configuration>
<property>
<name>tez.counters.max</name>
<value>10000</value>
</property>
<property>
<name>tez.counters.max.groups</name>
<value>3000</value>
</property>
<!-- TezSplitGrouper -->
<property>
<name>tez.grouping.max-size</name>
<value>1073741824</value>
</property>
<property>
<name>tez.grouping.min-size</name>
<value>16777216</value>
</property>
<!-- ShuffleVertexManager -->
<property>
<name>tez.shuffle-vertex-manager.max-src-fraction</name>
<value>0.4</value>
</property>
<property>
<name>tez.shuffle-vertex-manager.min-src-fraction</name>
<value>0.2</value>
</property>
<property>
<name>tez.shuffle-vertex-manager.enable.auto-parallel</name>
<value>true</value>
</property>
<!-- CartesianProductVertexManager -->
<property>
<name>tez.cartesian-product.grouping-fraction</name>
<value>0.75</value>
</property>
<property>
<name>tez.cartesian-product.min-ops-per-worker</name>
<value>1000000</value>
</property>
<!-- set to mapreduce_shuffle in both LLAP and container mode -->
<!-- in LLAP mode, LLAP daemons use their own shuffle handler -->
<property>
<name>tez.am.shuffle.auxiliary-service.id</name>
<value>mapreduce_shuffle</value>
</property>
<!-- Runtime -->
<property>
<name>tez.runtime.compress</name>
<value>true</value>
</property>
<property>
<name>tez.runtime.compress.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
<property>
<name>tez.runtime.io.sort.mb</name>
<value>1040</value>
</property>
<property>
<name>tez.runtime.unordered.output.buffer.size-mb</name>
<value>307</value>
</property>
<property>
<name>tez.runtime.pipelined.sorter.lazy-allocate.memory</name>
<value>true</value>
</property>
<property>
<name>tez.runtime.report.partition.stats</name>
<value>precise</value>
</property>
<!-- Shuffle -->
<property>
<name>tez.runtime.shuffle.connect.timeout</name>
<value>180000</value>
</property>
<property>
<name>tez.runtime.shuffle.read.timeout</name>
<value>60000</value>
</property>
<property>
<name>tez.runtime.shuffle.keep-alive.enabled</name>
<value>true</value>
</property>
<property>
<name>tez.runtime.pipelined-shuffle.enabled</name>
<value>false</value>
</property>
<property>
<name>tez.runtime.enable.final-merge.in.output</name>
<value>true</value>
</property>
<property>
<name>tez.runtime.shuffle.memory.limit.percent</name>
<value>0.5</value>
</property>
<property>
<name>tez.runtime.task.input.post-merge.buffer.percent</name>
<value>0.9</value>
</property>
<property>
<name>tez.runtime.optimize.local.fetch</name>
<value>true</value>
</property>
<!-- Secure Shuffle -->
<!--
if hadoop.security.credential.provider.path is not set in core-site.xml,
passwords are read dirctly from tez-site.xml in text.
if hadoop.security.credential.provider.path is set in core-site.xml,
passwords are read from the credential file.
-->
<property>
<name>tez.runtime.shuffle.ssl.enable</name>
<value>false</value>
</property>
<!-- Iceberg -->
<property>
<name>tez.mrreader.config.update.properties</name>
<value>hive.io.file.readcolumn.names,hive.io.file.readcolumn.ids</value>
</property>
<!-- Tez -->
<property>
<name>tez.am.launch.cmd-opts</name>
<value>-XX:+AlwaysPreTouch -Xss512k -XX:+UseG1GC -XX:+UseNUMA -XX:InitiatingHeapOccupancyPercent=40 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=200 -XX:MetaspaceSize=1024m -Djava.net.preferIPv4Stack=true --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.time=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.util.concurrent=ALL-UNNAMED --add-opens java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens java.base/java.util.regex=ALL-UNNAMED --add-opens java.base/java.util.zip=ALL-UNNAMED --add-opens java.base/java.util.stream=ALL-UNNAMED --add-opens java.base/java.util.jar=ALL-UNNAMED --add-opens java.base/java.util.function=ALL-UNNAMED --add-opens java.logging/java.util.logging=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.lang.ref=ALL-UNNAMED --add-opens java.base/java.nio.charset=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED --add-opens java.base/java.util.concurrent.locks=ALL-UNNAMED --add-opens java.base/sun.util.calendar=ALL-UNNAMED</value>
</property>
<property>
<name>tez.am.launch.env</name>
<value>LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native/,JAVA_HOME=/home/gitlab-runner/jdk-22.0.2+9/</value>
</property>
<property>
<name>tez.am.resource.memory.mb</name>
<value>16384</value>
</property>
<property>
<name>tez.task.launch.cmd-opts</name>
<value>-XX:+AlwaysPreTouch -Xss512k -XX:+UseG1GC -XX:+UseNUMA -XX:InitiatingHeapOccupancyPercent=40 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=200 -XX:MetaspaceSize=1024m -Djava.net.preferIPv4Stack=true --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.time=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.util.concurrent=ALL-UNNAMED --add-opens java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens java.base/java.util.regex=ALL-UNNAMED --add-opens java.base/java.util.zip=ALL-UNNAMED --add-opens java.base/java.util.stream=ALL-UNNAMED --add-opens java.base/java.util.jar=ALL-UNNAMED --add-opens java.base/java.util.function=ALL-UNNAMED --add-opens java.logging/java.util.logging=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.lang.ref=ALL-UNNAMED --add-opens java.base/java.nio.charset=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED --add-opens java.base/java.util.concurrent.locks=ALL-UNNAMED --add-opens java.base/sun.util.calendar=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.base/sun.nio.cs=ALL-UNNAMED --add-opens java.base/sun.security.action=ALL-UNNAMED --add-opens java.base/java.lang.invoke=ALL-UNNAMED --add-opens java.base/jdk.internal.ref=ALL-UNNAMED</value>
</property>
<property>
<name>tez.task.launch.env</name>
<value>LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native/,JAVA_HOME=/home/gitlab-runner/jdk-22.0.2+9/</value>
</property>
<property>
<name>tez.container.max.java.heap.fraction</name>
<value>0.8f</value>
</property>
<property>
<name>tez.am.mode.session</name>
<value>true</value>
</property>
<!-- 6144, set to 8192 when running in container mode -->
<property>
<name>tez.task.resource.memory.mb</name>
<value>8192</value>
</property>
<property>
<name>tez.history.logging.enabled</name>
<value>false</value>
</property>
<property>
<name>tez.dag.history.logging.enabled</name>
<value>false</value>
</property>
<property>
<name>tez.am.container.reuse.enabled</name>
<value>true</value>
</property>
<property>
<name>tez.am.container.reuse.timeout.secs</name>
<value>-1</value>
</property>
<property>
<name>tez.history.logging.service.class</name>
<value>org.apache.tez.dag.history.logging.impl.DevNullHistoryLoggingService</value>
</property>
<property>
<name>tez.am.tez-ui.webservice.enable</name>
<value>false</value>
</property>
</configuration>
<configuration>
<property>
<name>atlas.hook.hive.maxThreads</name>
<value>1</value>
</property>
<property>
<name>atlas.hook.hive.minThreads</name>
<value>1</value>
</property>
<property>
<name>datanucleus.autoCreateSchema</name>
<value>false</value>
</property>
<property>
<name>datanucleus.cache.level2.type</name>
<value>none</value>
</property>
<property>
<name>datanucleus.fixedDatastore</name>
<value>true</value>
</property>
<property>
<name>dfs.client.mmap.enabled</name>
<value>false</value>
</property>
<property>
<name>dfs.short.circuit.shared.memory.watcher.interrupt.check.ms</name>
<value>0</value>
</property>
<!-- Directory -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>${hive.hdfs.warehouse.dir}</value>
</property>
<property>
<name>hive.metastore.warehouse.external.dir</name>
<value>/hive/warehouse</value>
</property>
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
</property>
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/tmp/hive/operation_logs</value>
</property>
<!-- Hive -->
<property>
<name>hive.auto.convert.join.noconditionaltask.size</name>
<value>1145044992</value>
</property>
<property>
<name>hive.auto.convert.sortmerge.join.to.mapjoin</name>
<value>true</value>
</property>
<property>
<name>hive.compactor.cleaner.on</name>
<value>true</value>
</property>
<property>
<name>hive.compactor.initiator.on</name>
<value>true</value>
</property>
<property>
<name>hive.compactor.worker.threads</name>
<value>10</value>
</property>
<property>
<name>hive.disable.unsafe.external.table.operations</name>
<value>false</value>
</property>
<property>
<name>hive.driver.parallel.compilation</name>
<value>true</value>
</property>
<property>
<name>hive.enforce.sortmergebucketmapjoin</name>
<value>true</value>
</property>
<property>
<name>hive.exec.max.dynamic.partitions</name>
<value>100000</value>
</property>
<property>
<name>hive.exec.max.dynamic.partitions.pernode</name>
<value>100000</value>
</property>
<property>
<name>hive.exec.orc.compression.strategy</name>
<value>SPEED</value>
</property>
<property>
<name>hive.exec.orc.default.compress</name>
<value>SNAPPY</value>
</property>
<property>
<name>hive.exec.orc.default.stripe.size</name>
<value>67108864</value>
</property>
<property>
<name>hive.exec.orc.encoding.strategy</name>
<value>SPEED</value>
</property>
<property>
<name>hive.exec.reducers.bytes.per.reducer</name>
<value>67108864</value>
</property>
<property>
<name>hive.fetch.task.conversion.threshold</name>
<value>1073741824</value>
</property>
<property>
<name>hive.limit.optimize.enable</name>
<value>true</value>
</property>
<property>
<name>hive.limit.pushdown.memory.usage</name>
<value>0.04</value>
</property>
<property>
<name>hive.llap.io.etl.skip.format</name>
<value>none</value>
</property>
<property>
<name>hive.log.every.n.records</name>
<value>1000000</value>
</property>
<property>
<name>hive.mapjoin.bucket.cache.size</name>
<value>10000</value>
</property>
<property>
<name>hive.merge.nway.joins</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.aggregate.stats.cache.enabled</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.cache.pinobjtypes</name>
<value>Table,Database,Type,FieldSchema,Order</value>
</property>
<property>
<name>hive.metastore.event.listeners</name>
<value>org.apache.hive.hcatalog.listener.DbNotificationListener</value>
</property>
<property>
<name>hive.metastore.pre.event.listeners</name>
<value></value>
</property>
<property>
<name>hive.metastore.server.max.threads</name>
<value>100000</value>
</property>
<property>
<name>metastore.stats.fetch.bitvector</name>
<value>true</value>
</property>
<property>
<name>hive.optimize.bucketmapjoin</name>
<value>true</value>
</property>
<property>
<name>hive.optimize.bucketmapjoin.sortedmerge</name>
<value>true</value>
</property>
<property>
<name>hive.optimize.dynamic.partition.hashjoin</name>
<value>true</value>
</property>
<property>
<name>hive.optimize.metadataonly</name>
<value>true</value>
</property>
<property>
<name>hive.orc.compute.splits.num.threads</name>
<value>20</value>
</property>
<property>
<name>hive.orc.splits.include.file.footer</name>
<value>false</value>
</property>
<property>
<name>hive.query.reexecution.stats.persist.scope</name>
<value>query</value>
</property>
<property>
<name>hive.security.metastore.authorization.manager</name>
<value>org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider</value>
</property>
<property>
<name>hive.server2.transport.mode</name>
<value>binary</value>
</property>
<property>
<name>hive.support.concurrency</name>
<value>true</value>
</property>
<property>
<name>hive.tez.auto.reducer.parallelism</name>
<value>true</value>
</property>
<property>
<name>hive.txn.manager</name>
<value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
</property>
<property>
<name>hive.vectorized.execution.mapjoin.minmax.enabled</name>
<value>true</value>
</property>
<property>
<name>hive.vectorized.execution.mapjoin.native.fast.hashtable.enabled</name>
<value>true</value>
</property>
<property>
<name>hive.vectorized.groupby.checkinterval</name>
<value>4096</value>
</property>
<property>
<name>hive.vectorized.adaptor.usage.mode</name>
<value>all</value>
<description>
Set to chosen for stability or to avoid vectorizing UDFs that do not have native vectorized versions available. Cf. HIVE-21935
</description>
</property>
<!-- Correctness -->
<property>
<name>hive.optimize.shared.work.dppunion</name>
<value>true</value>
</property>
<property>
<name>hive.optimize.shared.work.dppunion.merge.eventops</name>
<value>true</value>
</property>
<property>
<name>hive.optimize.shared.work.downstream.merge</name>
<value>true</value>
</property>
<property>
<name>hive.optimize.shared.work.parallel.edge.support</name>
<value>true</value>
</property>
<property>
<name>hive.optimize.shared.work.merge.ts.schema</name>
<value>true</value>
</property>
<property>
<name>hive.optimize.cte.materialize.threshold</name>
<value>-1</value>
</property>
<!-- Security -->
<property>
<name>hive.server2.enable.doAs</name>
<value>false</value>
</property>
<property>
<name>hive.security.authenticator.manager</name>
<value>org.apache.hadoop.hive.ql.security.ProxyUserAuthenticator</value>
</property>
<property>
<name>hive.security.authorization.manager</name>
<value>org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdConfOnlyAuthorizerFactory</value>
</property>
<!-- Metastore -->
<property>
<name>hive.metastore.db.type</name>
<value>MYSQL</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://${hive.database.host}:3305/${hive.database.name}?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>password</value>
</property>
<property>
<name>hive.metastore.kerberos.keytab.file</name>
<value>${hive.metastore.keytab.file}</value>
</property>
<property>
<name>hive.metastore.kerberos.principal</name>
<value>${hive.metastore.principal}</value>
</property>
<property>
<name>hive.metastore.sasl.enabled</name>
<value>${hive.secure.mode}</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://${hive.metastore.host}:${hive.metastore.port}</value>
</property>
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
<!-- HiveServer2 -->
<property>
<name>hive.users.in.admin.role</name>
<value>hive</value>
</property>
<property>
<name>hive.server2.authentication</name>
<value>${hive.server2.authentication.mode}</value>
</property>
<property>
<name>hive.server2.authentication.kerberos.keytab</name>
<value>${hive.server2.keytab.file}</value>
</property>
<property>
<name>hive.server2.authentication.kerberos.principal</name>
<value>${hive.server2.principal}</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>${hive.server2.host}</value>
</property>
<property>
<name>hive.server2.thrift.port</name>
<value>${hive.server2.port}</value>
</property>
<!-- LLAP I/O -->
<property>
<name>hive.llap.io.enabled</name>
<value>false</value>
</property>
<property>
<name>hive.llap.io.memory.size</name>
<value>72Gb</value>
</property>
<property>
<name>hive.llap.io.threadpool.size</name>
<value>36</value>
</property>
<property>
<name>hive.llap.daemon.num.executors</name>
<value>36</value>
</property>
<property>
<name>hive.execution.engine</name>
<value>tez</value>
</property>
<property>
<name>hive.execution.mode</name>
<value>llap</value>
<!-- <value>container</value> -->
</property>
<property>
<name>hive.llap.hs2.coordinator.enabled</name>
<value>false</value>
</property>
<property>
<name>hive.llap.daemon.service.hosts</name>
<value>@llapservice</value>
</property>
<property>
<name>hive.llap.client.consistent.splits</name>
<value>true</value>
</property>
<property>
<name>hive.llap.execution.mode</name>
<value>all</value>
</property>
<!-- do not set when using LLAP -->
<!--
<property>
<name>hive.aux.jars.path</name>
<value>${hive.work.dir}/hive/hivejar/apache-hive-${hive.src.rev}-bin/lib/hive-llap-common-${hive.src.rev}.jar,${hive.work.dir}/hive/hivejar/apache-hive-${hive.src.rev}-bin/lib/hive-llap-server-${hive.src.rev}.jar,${hive.work.dir}/hive/hivejar/apache-hive-${hive.src.rev}-bin/lib/hive-llap-tez-${hive.src.rev}.jar,${hive.work.dir}/hive/hivejar/apache-hive-${hive.src.rev}-bin/lib/hive-iceberg-handler-${hive.src.rev}.jar,${hive.work.dir}/hive/hivejar/apache-hive-${hive.src.rev}-bin/lib/hive-parser-${hive.src.rev}.jar</value>
</property>
-->
<!-- Iceberg -->
<property>
<name>iceberg.catalog</name>
<value>iceberg</value>
</property>
<property>
<name>iceberg.catalog.iceberg.type</name>
<value>hive</value>
</property>
<property>
<name>iceberg.catalog.iceberg.clients</name>
<value>10</value>
</property>
<property>
<name>iceberg.catalog.iceberg.uri</name>
<value>thrift://${hive.metastore.host}:${hive.metastore.port}</value>
</property>
<property>
<name>iceberg.catalog.iceberg.warehouse</name>
<value>${hive.warehouse.dir}</value>
</property>
<property>
<name>write.format.default</name>
<value>orc</value>
</property>
<property>
<name>iceberg.mr.split.size</name>
<value>16777216</value>
</property>
<property>
<name>hive.iceberg.stats.source</name>
<value>iceberg</value>
</property>
<property>
<name>iceberg.hive.keep.stats</name>
<value>false</value>
</property>
<!-- Hive 4 on Tez -->
<property>
<name>tez.lib.uris</name>
<value>hdfs://${hdfs.lib.dir}/tez/tar/tez-${tez.src.rev}.tar.gz</value>
</property>
<property>
<name>tez.use.cluster.hadoop-libs</name>
<value>true</value>
</property>
<property>
<name>hive.tez.container.size</name>
<value>8192</value>
</property>
<!--
<property>
<name>hive.tez.java.opts</name>
<value>-XX:+AlwaysPreTouch -Xss512k -XX:+UseG1GC -XX:TLABSize=8m -XX:+ResizeTLAB -XX:+UseNUMA -XX:InitiatingHeapOccupancyPercent=40 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=200 -server -Djava.net.preferIPv4Stack=true -XX:NewRatio=8 -XX:+AggressiveOpts</value>
</property>
-->
<property>
<name>hive.zookeeper.quorum</name>
<value>blue0:2182</value>
</property>
<property>
<name>hive.server2.webui.port</name>
<value>0</value>
</property>
<property>
<name>hive.compactor.crud.query.based</name>
<value>true</value>
</property>
</configuration>