Skip to content

Commit 96a5a12

Browse files
Mark Paveysrowen
authored andcommitted
[SPARK-26137][CORE] Use Java system property "file.separator" inste…
… of hard coded "/" in DependencyUtils ## What changes were proposed in this pull request? Use Java system property "file.separator" instead of hard coded "/" in DependencyUtils. ## How was this patch tested? Manual test: Submit Spark application via REST API that reads data from Elasticsearch using spark-elasticsearch library. Without fix application fails with error: 18/11/22 10:36:20 ERROR Version: Multiple ES-Hadoop versions detected in the classpath; please use only one jar:file:/C:/<...>/spark-2.4.0-bin-hadoop2.6/work/driver-20181122103610-0001/myApp-assembly-1.0.jar jar:file:/C:/<...>/myApp-assembly-1.0.jar 18/11/22 10:36:20 ERROR Main: Application [MyApp] failed: java.lang.Error: Multiple ES-Hadoop versions detected in the classpath; please use only one jar:file:/C:/<...>/spark-2.4.0-bin-hadoop2.6/work/driver-20181122103610-0001/myApp-assembly-1.0.jar jar:file:/C:/<...>/myApp-assembly-1.0.jar at org.elasticsearch.hadoop.util.Version.<clinit>(Version.java:73) at org.elasticsearch.hadoop.rest.RestService.findPartitions(RestService.java:214) at org.elasticsearch.spark.rdd.AbstractEsRDD.esPartitions$lzycompute(AbstractEsRDD.scala:73) at org.elasticsearch.spark.rdd.AbstractEsRDD.esPartitions(AbstractEsRDD.scala:72) at org.elasticsearch.spark.rdd.AbstractEsRDD.getPartitions(AbstractEsRDD.scala:44) at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:253) at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:251) at scala.Option.getOrElse(Option.scala:121) at org.apache.spark.rdd.RDD.partitions(RDD.scala:251) at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:49) at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:253) at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:251) at scala.Option.getOrElse(Option.scala:121) at org.apache.spark.rdd.RDD.partitions(RDD.scala:251) at org.apache.spark.SparkContext.runJob(SparkContext.scala:2126) at org.apache.spark.rdd.RDD$$anonfun$collect$1.apply(RDD.scala:945) at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151) at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112) at org.apache.spark.rdd.RDD.withScope(RDD.scala:363) at org.apache.spark.rdd.RDD.collect(RDD.scala:944) ... at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.spark.deploy.worker.DriverWrapper$.main(DriverWrapper.scala:65) at org.apache.spark.deploy.worker.DriverWrapper.main(DriverWrapper.scala) With fix application runs successfully. Closes #23102 from markpavey/JIRA_SPARK-26137_DependencyUtilsFileSeparatorFix. Authored-by: Mark Pavey <[email protected]> Signed-off-by: Sean Owen <[email protected]> (cherry picked from commit ce61bac) Signed-off-by: Sean Owen <[email protected]>
1 parent de5f489 commit 96a5a12

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

core/src/main/scala/org/apache/spark/deploy/DependencyUtils.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,12 @@ private[deploy] object DependencyUtils {
6060
hadoopConf: Configuration,
6161
secMgr: SecurityManager): String = {
6262
val targetDir = Utils.createTempDir()
63+
val userJarName = userJar.split(File.separatorChar).last
6364
Option(jars)
6465
.map {
6566
resolveGlobPaths(_, hadoopConf)
6667
.split(",")
67-
.filterNot(_.contains(userJar.split("/").last))
68+
.filterNot(_.contains(userJarName))
6869
.mkString(",")
6970
}
7071
.filterNot(_ == "")

core/src/test/scala/org/apache/spark/deploy/SparkSubmitSuite.scala

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -936,6 +936,25 @@ class SparkSubmitSuite
936936
}
937937
}
938938

939+
test("remove copies of application jar from classpath") {
940+
val fs = File.separator
941+
val sparkConf = new SparkConf(false)
942+
val hadoopConf = new Configuration()
943+
val secMgr = new SecurityManager(sparkConf)
944+
945+
val appJarName = "myApp.jar"
946+
val jar1Name = "myJar1.jar"
947+
val jar2Name = "myJar2.jar"
948+
val userJar = s"file:/path${fs}to${fs}app${fs}jar$fs$appJarName"
949+
val jars = s"file:/$jar1Name,file:/$appJarName,file:/$jar2Name"
950+
951+
val resolvedJars = DependencyUtils
952+
.resolveAndDownloadJars(jars, userJar, sparkConf, hadoopConf, secMgr)
953+
954+
assert(!resolvedJars.contains(appJarName))
955+
assert(resolvedJars.contains(jar1Name) && resolvedJars.contains(jar2Name))
956+
}
957+
939958
test("Avoid re-upload remote resources in yarn client mode") {
940959
val hadoopConf = new Configuration()
941960
updateConfWithFakeS3Fs(hadoopConf)

0 commit comments

Comments
 (0)