av9ash/GitBugs huggingface dataset:
Bug: Sort table properties by key in DESCRIBE TABLE command
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 16/Dec/20 07:59
Affects Version/s: 3.1.0

Currently:

{code}
-- !query
DESC FORMATTED v
-- !query schema
struct<col_name:string,data_type:string,comment:string>
-- !query output
a                   	string              	                    
b                   	int                 	                    
c                   	string              	                    
d                   	string              	                    
                    	                    	                    
# Detailed Table Information	                    	                    
Database            	default             	                    
Table               	v                   	                    
Created Time [not included in comparison]
Last Access [not included in comparison]
Created By [not included in comparison]
Type                	VIEW                	                    
View Text           	SELECT * FROM t     	                    
View Original Text  	SELECT * FROM t     	                    
View Catalog and Namespace	spark_catalog.default	                    
View Query Output Columns	[a, b, c, d]        	                    
Table Properties    	[view.catalogAndNamespace.numParts=2, view.catalogAndNamespace.part.0=spark_catalog, view.catalogAndNamespace.part.1=default, view.query.out.col.0=a, view.query.out.col.1=b, view.query.out.col.2=c, view.query.out.col.3=d, view.query.out.numCols=4, view.referredTempFunctionsNames=[], view.referredTempViewNames=[]]
{code}

The order of "Table Properties" is indeterministic which makes the test above fails in other environments. It should be best to sort it by key. This is consistent with DSv2 command as well.
Bug: Reduce the memory footprint and gc of the cache (hadoopJobMetadata)
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 11/Dec/20 08:16
Affects Version/s: 3.0.1

 

HadoopRDD uses soft-reference map to cache jobconf (rdd_id -> jobconf).
 When the number of hive partitions read by the driver is large, HadoopRDD.getPartitions will create many jobconfs and add them to the cache.
 The executor will also create a jobconf, add it to the cache, and share it among exeuctors.

The number of jobconfs in the driver cache increases the memory pressure. When the driver memory configuration is not high, full gc becoming very frequent, and these jobconfs are hardly reused.

For example, spark.driver.memory=2560m, the read partition is about 14,000, and a jobconf 96kb.

!jobconf.png!

 

The following is a repair comparison, full gc decreased from 62s to 0.8s, and the number of times decreased from 31 to 5. And the driver applied for less memory (Old Gen 1.667G->968M), the job execution time is also reduced.

 

Current:

!current_job_finish_time.png!

jstat -gcutil PID 2s

!current_gcutil.png!

!current_visual_gc.png!

 

Try to change softValues to weakValues

!fix_job_finish_time.png!

!fix_gcutil.png!

!fix_visual_gc.png!
Bug: Update kubernetes/integration-tests/README.md to follow the default Hadoop profile updated
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 11/Dec/20 09:07
Affects Version/s: 3.1.0

kubernetes/integration-tests/README.md says about how to run the integration tests for Kubernetes as follows.

{code}
To run tests with Hadoop 3.2 instead of Hadoop 2.7, use `--hadoop-profile`.

    ./dev/dev-run-integration-tests.sh --hadoop-profile hadoop-2.7
{code}

In the current master, the default Hadoop profile is hadoop-3.2 so it's better to update the document.
Bug: Update Kafka Headers Documentation in Structured Streaming
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 04/Dec/20 14:52
Affects Version/s: 3.0.0

This is to update the documentation of the Kafka Integration Guide, in particular the Headers section.

The documentation suggests to use `Map` as the type for headers but is the type is 
`Array[(String, Array[Byte])]`
Bug: Clean up `spark.core.connection.ack.wait.timeout` from `configuration.md`
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 02/Dec/20 11:07
Affects Version/s: 2.0.2

After SPARK-9767, Spark remove ConnectionManager and related classes, the configuration item `spark.core.connection.ack.wait.timeout` previously used by ConnectionManager is no longer used by other Spark code, but it still exists in the `configuration.md`.
Bug: Add minimum threshold speculation config
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 10/Dec/20 17:13
Affects Version/s: 3.0.1

When we turn on speculation with default configs we have the last 10% of the tasks subject to speculation. There are a lot of stages where the stage runs for few seconds to minutes. Also in general we don't want to speculate tasks that run within a specific interval. By setting a minimum threshold for speculation gives us better control
Bug: Jobs committed through the S3A Magic committer don't report the bytes written
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 10/Dec/20 15:17
Affects Version/s: 3.0.1

The spark statistics tracking doesn't correctly assess the size of the uploaded files as it only calls getFileStatus on the zero byte objects -not the yet-to-manifest files. Which, given they don't exist yet, isn't easy to do.

HADOOP-17414 will attach the final length as a custom header to the marker object, and implement getXAttr in the S3A FS to probe for it.

BasicWriteStatsTracker can probe for this custom Xattr if the size of the generated file is 0 bytes; if found and parseable use that as the declared length of the output.
Bug: Escape meta-characters in showString
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 07/Dec/20 12:43
Affects Version/s: 3.2.0

This ticket aims at escaping meta-characters (e.g., \n and \t) in `Dataset.showString`.
Before this improvement:
{code}
scala> Seq("aaa\nbbb\t\tccccc").toDF("value").show()
+--------------+
|         value|
+--------------+
|aaa
bbb		ccccc|
+--------------+
{code}
After this improvement:
{code}
+-----------------+
|            value|
+-----------------+
|aaa\nbbb\t\tccccc|
+-----------------+
{code}
Bug: Make approx_count_distinct result consistent whether Optimize rule exists or not
Status: Resolved | Priority: Minor | Resolution: Won't Fix
Created: 31/Dec/20 09:48
Affects Version/s: 3.2.0

This code will fail because folabe value not fold, we should keep result consistent whether Optimize rule exists or not.
{code:java}
val excludedRules = Seq(ConstantFolding, ReorderAssociativeOperator).map(_.ruleName)
withSQLConf(SQLConf.OPTIMIZER_EXCLUDED_RULES.key -> excludedRules.mkString(",")) {
  sql("select approx_count_distinct(1, 0.01 + 0.02)")
}{code}
Bug: Handles a random seed consisting of an expr tree
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 30/Dec/20 12:24
Affects Version/s: 2.4.8

This ticket aims at fixing the minor bug that throws an analysis exception when a seed param in `rand`/`randn` having a expr tree (e.g., `rand(1 + 1)`) with constant folding (`ConstantFolding` and `ReorderAssociativeOperator`) disabled. A query to reproduce this issue is as follows;
{code}
// v3.1.0, v3.0.2, and v2.4.8
$./bin/spark-shell 
scala> sql("select rand(1 + 2)").show()
+-------------------+
|      rand((1 + 2))|
+-------------------+
|0.25738143505962285|
+-------------------+

$./bin/spark-shell --conf spark.sql.optimizer.excludedRules=org.apache.spark.sql.catalyst.optimizer.ConstantFolding,org.apache.spark.sql.catalyst.optimizer.ReorderAssociativeOperator
scala> sql("select rand(1 + 2)").show()
org.apache.spark.sql.AnalysisException: Input argument to rand must be an integer, long or null literal.;
  at org.apache.spark.sql.catalyst.expressions.RDG.seed$lzycompute(randomExpressions.scala:49)
  at org.apache.spark.sql.catalyst.expressions.RDG.seed(randomExpressions.scala:46)
  at org.apache.spark.sql.catalyst.expressions.Rand.doGenCode(randomExpressions.scala:98)
  at org.apache.spark.sql.catalyst.expressions.Expression.$anonfun$genCode$3(Expression.scala:146)
  at scala.Option.getOrElse(Option.scala:189)
  ...
{code}

A root cause is that the match-case code below cannot handle the case described above:
https://github.com/apache/spark/blob/42f5e62403469cec6da680b9fbedd0aa508dcbe5/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/randomExpressions.scala#L46-L51
Bug: Wrong metrics information in Spark Monitoring Documentation
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 30/Dec/20 10:46
Affects Version/s: 3.0.0

I recently integrated the spark executor metrics documented in [Spark Monitoring|https://spark.apache.org/docs/3.0.0/monitoring.html#component-instance--executor] into our Graphite based monitoring system. I see

[Executor|https://spark.apache.org/docs/3.0.0/monitoring.html#component-instance--executor] and latest one too

+namespace=CodeGenerator+
 * *note:*: these metrics are conditional to a configuration parameter: {{spark.metrics.staticSources.enabled}} (default is true)
 * compilationTime (histogram)
 * generatedClassSize (histogram)
 * generatedMethodSize (histogram)
 * *hiveClientCalls.count - irrelevant and metric not present in metric registery too*
 * sourceCodeSize (histogram)

It is just a minor bug on documentation side. I am raising a PR for this.
Bug: Cleanup "view bounds are deprecated" compilation warnings
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 16/Dec/20 08:05
Affects Version/s: 3.2.0

There are only 3 compilation warnings related to `view bounds are deprecated` in SequenceFileRDDFunctions:

[WARNING] /spark-source/core/src/main/scala/org/apache/spark/rdd/SequenceFileRDDFunctions.scala:35: view bounds are deprecated; use an implicit parameter instead.
[WARNING] /spark-source/core/src/main/scala/org/apache/spark/rdd/SequenceFileRDDFunctions.scala:35: view bounds are deprecated; use an implicit parameter instead.
[WARNING] /spark-source/core/src/main/scala/org/apache/spark/rdd/SequenceFileRDDFunctions.scala:55: view bounds are deprecated; use an implicit parameter instead.
Bug: Move the old partition data to trash instead of deleting it when inserting rewrite hive table
Status: Resolved | Priority: Minor | Resolution: Duplicate
Created: 29/Dec/20 22:32
Affects Version/s: 3.2.0

InsertIntoHiveTable should move the old partition data to trash instead of deleting it.

Because that's what we do in hive.

[https://github.com/apache/hive/blob/9c6f8b76123c88b0c8a98645874722ba80b3c2b0/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java]

`deleteOldPathForReplace`
Bug: Fix misleading error message for unresolved attributes inside INSERT action of MERGE INTO
Status: Open | Priority: Minor | Resolution: 
Created: 26/Dec/20 11:19
Affects Version/s: 3.0.0

Per spec, INSERT assignments are resolved only against the source table in MERGE operations. However, the error message does not take this into account and prints all columns from both the source and target tables. This leads to confusing error messages.

{{cannot resolve '`id`' given input columns: [t.c, s.c1, s.c2, t.id]}}
Bug: Unify random functions and make Uuid Shuffle support seed in SQL
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 20/Dec/20 07:39
Affects Version/s: 3.2.0

Unify the seed of random functions
1. Add a hold place expression `DefaultSeed` as the defualt seed.
2. Change `Rand`,`Randn`,`Uuid`,`Shuffle` default seed to `DefaultSeed`.
3. Replace `DefaultSeed` to real seed at `ResolveRandomSeed` rule.
Bug: Can't configure response header size
Status: Open | Priority: Minor | Resolution: 
Created: 24/Dec/20 20:13
Affects Version/s: 3.0.0

We use JWT tokens to secure your spark UI. These tokens can get quite large. We have configured `{{spark.ui.requestHeaderSize}}`. However we also use the spark master UI as a proxy for our workers and for driver apps. When the HTTP request flow through the spark master UI we get this error when building the responses.

We believe a `{{spark.ui.responseHeaderSize` would solve this issue. Jetty's HttpConfig has a property to set the response header max size.}}

 

org.sparkproject.jetty.http.BadMessageException: 500: Request header too large
 at org.sparkproject.jetty.http.HttpGenerator.generateRequest(HttpGenerator.java:279)
 at org.sparkproject.jetty.client.http.HttpSenderOverHTTP$HeadersCallback.process(HttpSenderOverHTTP.java:231)
 at org.sparkproject.jetty.util.IteratingCallback.processing(IteratingCallback.java:241)
 at org.sparkproject.jetty.util.IteratingCallback.iterate(IteratingCallback.java:224)
 at org.sparkproject.jetty.client.http.HttpSenderOverHTTP.sendHeaders(HttpSenderOverHTTP.java:62)
 at org.sparkproject.jetty.client.HttpSender.send(HttpSender.java:214)
 at org.sparkproject.jetty.client.http.HttpChannelOverHTTP.send(HttpChannelOverHTTP.java:85)
 at org.sparkproject.jetty.client.HttpChannel.send(HttpChannel.java:128)
 at org.sparkproject.jetty.client.HttpConnection.send(HttpConnection.java:201)
Bug: Try to push down filters for parquet and orc should add extra `filters.nonEmpty` condition
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 08/Dec/20 04:03
Affects Version/s: 3.2.0

 
{code:java}
lazy val footerFileMetaData =
  ParquetFileReader.readFooter(conf, filePath, SKIP_ROW_GROUPS).getFileMetaData
// Try to push zdown filters when filter push-down is enabled.
val pushed = if (enableParquetFilterPushDown) {
  val parquetSchema = footerFileMetaData.getSchema
  val parquetFilters = new ParquetFilters(parquetSchema, pushDownDate, pushDownTimestamp,
    pushDownDecimal, pushDownStringStartWith, pushDownInFilterThreshold, isCaseSensitive)
  filters
    // Collects all converted Parquet filter predicates. Notice that not all predicates can be
    // converted (`ParquetFilters.createFilter` returns an `Option`). That's why a `flatMap`
    // is used here.
    .flatMap(parquetFilters.createFilter)
    .reduceOption(FilterApi.and)
} else {
  None
}
{code}
 

 

Should add extra condition `filters.nonEmpty` when try to push down filters for parquet to avoid unnecessary file reading (parquet footer), ORC has similar problems.
Bug: BytesToBytesMap's iterator hasNext method should be idempotent.
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 11/Dec/20 09:49
Affects Version/s: 3.0.0

BytesToBytesMap's MapIterator's hasNext method is not idempotent. 
{code:java}
// 
public boolean hasNext() {
  if (numRecords == 0) {
    if (reader != null) {
      // if called multiple multiple times, it will throw NoSuchElement exception
      handleFailedDelete();
    }
  }
  return numRecords > 0;
}
{code}
Multiple calls to this `hasNext` method will call `handleFailedDelete()` multiple times, which will throw NoSuchElementException  as the spillWrites has already been empty.

 

We observed this issue for in one of our production jobs after upgrading to Spark 3.0
Bug: Use assertAnalysisError in HiveDDLSuite.scala
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 19/Dec/20 20:43
Affects Version/s: 3.2.0

HiveDDLSuite has many of the following patterns:
{code:java}
val e = intercept[AnalysisException] {
  sql(sqlString)
}
assert(e.message.contains(exceptionMessage))
{code}
However, there already exists "assertAnalysisError" helper function which does exactly the same thing.
Bug: Add updated partition path list interface into DataWritingCommand for dynamic partition insertion
Status: Open | Priority: Minor | Resolution: 
Created: 18/Dec/20 09:30
Affects Version/s: 2.4.3

FileFormatWriter.write method actually returns the set of all partition paths that were updated during this write job, but is ignored in DataWritingCommand's implementations. This makes user who want to analyze query execution metrics via QueryExecutionListener difficult to get these information.
Bug: Update Jetty to 9.4.34
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 17/Dec/20 21:59
Affects Version/s: 3.0.1

We should update Jetty to 9.4.34, from 9.4.28, to pick up fixes, plus a possible CVE fix.

https://github.com/eclipse/jetty.project/releases/tag/jetty-9.4.33.v20201020
https://github.com/eclipse/jetty.project/releases/tag/jetty-9.4.34.v20201102
Bug: Remove command name in AnalysisException message when a relation is not resolved
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 16/Dec/20 06:37
Affects Version/s: 3.2.0

For some of the commands that use UnresolvedTable, UnresolvedView, and UnresolvedTableOrView to resolve identifier, when the identifier cannot be resolved, the exception will be something like "Table or view not found for 'SHOW TBLPROPERTIES': badtable". The command name should be dropped to be consistent with other existing commands.
Bug: Canonicalization error in SortAggregate
Status: Open | Priority: Minor | Resolution: 
Created: 10/Dec/20 19:18
Affects Version/s: 3.0.1

The canonicalization plan for a simple aggregate query is different each time for SortAggregate but not for HashAggregate.

The issue can be demonstrated by adding the following unit tests to SQLQuerySuite. The HashAggregate test passes and the SortAggregate test fails.

The first test has numeric input and the second test is operating on strings, which forces the use of SortAggregate rather than HashAggregate.
{code:java}
test("HashAggregate canonicalization") {
  val data = Seq((1, 1)).toDF("c0", "c1")
  val df1 = data.groupBy(col("c0")).agg(first("c1"))
  val df2 = data.groupBy(col("c0")).agg(first("c1"))
  assert(df1.queryExecution.executedPlan.canonicalized ==
      df2.queryExecution.executedPlan.canonicalized)
}

test("SortAggregate canonicalization") {
  val data = Seq(("a", "a")).toDF("c0", "c1")
  val df1 = data.groupBy(col("c0")).agg(first("c1"))
  val df2 = data.groupBy(col("c0")).agg(first("c1"))
  assert(df1.queryExecution.executedPlan.canonicalized ==
      df2.queryExecution.executedPlan.canonicalized)
} {code}
The SortAggregate test fails with the following output .
{code:java}
SortAggregate(key=[none#0], functions=[first(none#0, false)], output=[none#0, #1])
+- *(2) Sort [none#0 ASC NULLS FIRST], false, 0
   +- Exchange hashpartitioning(none#0, 5), ENSURE_REQUIREMENTS, [id=#105]
      +- SortAggregate(key=[none#0], functions=[partial_first(none#1, false)], output=[none#0, none#2, none#3])
         +- *(1) Sort [none#0 ASC NULLS FIRST], false, 0
            +- *(1) Project [none#0 AS #0, none#1 AS #1]
               +- *(1) LocalTableScan [none#0, none#1]

 did not equal 

SortAggregate(key=[none#0], functions=[first(none#0, false)], output=[none#0, #1])
+- *(2) Sort [none#0 ASC NULLS FIRST], false, 0
   +- Exchange hashpartitioning(none#0, 5), ENSURE_REQUIREMENTS, [id=#148]
      +- SortAggregate(key=[none#0], functions=[partial_first(none#1, false)], output=[none#0, none#2, none#3])
         +- *(1) Sort [none#0 ASC NULLS FIRST], false, 0
            +- *(1) Project [none#0 AS #0, none#1 AS #1]
               +- *(1) LocalTableScan [none#0, none#1] {code}
The error is caused by the resultExpression for the aggregate function being assigned a new ExprId in the final aggregate.
Bug: Minikube is failing to start on research-jenkins-worker-05
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 10/Dec/20 20:16
Affects Version/s: 3.1.0

[https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder-K8s/37190/console]

 
{code:java}
+ minikube --vm-driver=kvm2 start --memory 6000 --cpus 8
* minikube v1.7.3 on Ubuntu 20.04
* Using the kvm2 driver based on user configuration
! Unable to update kvm2 driver: unable to acquire lock for {Name:mk900956b073697a4aa6c80a27c6bb0742a99a53 Clock:{} Delay:500ms Timeout:10m0s Cancel:<nil>}: unable to open /tmp/juju-mk900956b073697a4aa6c80a27c6bb0742a99a53: permission denied
* Kubernetes 1.17.3 is now available. If you would like to upgrade, specify: --kubernetes-version=1.17.3
* Reconfiguring existing host ...
* Using the running kvm2 "minikube" VM ...
* 
X Unable to start VM. Please investigate and run 'minikube delete' if possible
* Error: [SSH_AUTH_FAILURE] post-start: command runner: ssh client: Error dialing tcp via ssh client: ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain{code}
Bug: Add timeout info for ShuffleBlockFetcherIterator when get remote block
Status: In Progress | Priority: Minor | Resolution: 
Created: 10/Dec/20 14:10
Affects Version/s: 2.4.3

In order to facilitate the troubleshooting of hotspots or data skew， it's better to add more information on  ShuffleBlockFetcherIterator.

The new log are shown as below:
{code:java}
2020-07-27 21:00:49,910 TRACE org.apache.spark.storage.ShuffleBlockFetcherIterator: Got remote block shuffle_1_39_5 from hostname:7337 cost  3511 ms
{code}
We can easily get the point that the current container cost 3511 ms for getting remote block list from node hostname:7337.
Bug: SparkR docker install requires LaTeX packages
Status: Open | Priority: Minor | Resolution: 
Created: 10/Dec/20 20:15
Affects Version/s: 3.2.0

See: [https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder-K8s/37190/console]

 

* checking PDF version of manual ... WARNING
LaTeX errors when creating PDF version.
This typically indicates Rd problems.
LaTeX errors found:
! LaTeX Error: File `inconsolata.sty' not found.

Type X to quit or <RETURN> to proceed,
or enter new name. (Default extension: sty)

! Emergency stop.
<read *>
Bug: Upgrade httpclient from 4.5.6 to 4.5.13
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 07/Dec/20 02:00
Affects Version/s: 3.1.0

Current httpclient is 4.5.6 which is released over 2 years ago.
Now 4.5.13 is available so let's upgrade it.
Bug: Remove -Djava.version=11 from Scala 2.13 build in GitHub Actions
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 07/Dec/20 01:50
Affects Version/s: 3.1.0

In the GitHub Actions' job, the build command for Scala 2.13 is defined as follows.
{code}
./build/sbt -Pyarn -Pmesos -Pkubernetes -Phive -Phive-thriftserver -Phadoop-cloud -Pkinesis-asl -Djava.version=11 -Pscala-2.13 compile test:compile
{code}

Though, Scala 2.13 build uses Java 8 rather than 11 so let's remove -Djava.version=11.
Bug: Extend connection timeout to DB server for DB2IntegrationSuite and its variants
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 03/Dec/20 06:00
Affects Version/s: 3.1.0

The container image ibmcom/db2 creates a database when it starts up.
The database creation can take over 2 minutes.

DB2IntegrationSuite and its variants use the container image but the connection timeout is set to 2 minutes so these suites almost always fail.
Bug: Add option to keep container after tests finish for DockerJDBCIntegrationSuites for debug
Status: Resolved | Priority: Minor | Resolution: Fixed
Created: 04/Dec/20 02:34
Affects Version/s: 3.1.0

DockerJDBCIntegrationSuites (e.g. DB2IntegrationSuite, PostgresIntegrationSuite) launch a docker container which is removed after tests finish.
If we have an option to keep the container, it would be useful for debug.
Bug: Show shuffle read size / records correctly when only remotebytesread is available
Status: Resolved | Priority: Trivial | Resolution: Fixed
Created: 24/Dec/20 09:29
Affects Version/s: 3.0.1

At present, the stage page only displays the data of Shuffle Read Size / Records when localBytesRead>0.

Sometimes the data of shuffle read metrics is remoteBytesRead>0 localBytesRead=0.
Bug: docker entrypoint should using `spark-class` for spark executor
Status: In Progress | Priority: Trivial | Resolution: 
Created: 11/Dec/20 16:12
Affects Version/s: 3.0.1

In docker {{entrypoint.sh}}, spark driver using {{spark-submit}} command but spark executor using pure {{java}} command which don't load {{spark-env.sh}} in {{$SPARK_HOME/conf}} directory.
This can lead configuration mismatch between driver and executors in the cases {{spark-env.sh}} contains something like custom envvars or pre-start hooks