Skip to content

Commit ce61bac

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 apache#23102 from markpavey/JIRA_SPARK-26137_DependencyUtilsFileSeparatorFix. Authored-by: Mark Pavey <[email protected]> Signed-off-by: Sean Owen <[email protected]>
1 parent affe809 commit ce61bac

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
@@ -61,11 +61,12 @@ private[deploy] object DependencyUtils extends Logging {
6161
hadoopConf: Configuration,
6262
secMgr: SecurityManager): String = {
6363
val targetDir = Utils.createTempDir()
64+
val userJarName = userJar.split(File.separatorChar).last
6465
Option(jars)
6566
.map {
6667
resolveGlobPaths(_, hadoopConf)
6768
.split(",")
68-
.filterNot(_.contains(userJar.split("/").last))
69+
.filterNot(_.contains(userJarName))
6970
.mkString(",")
7071
}
7172
.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
@@ -962,6 +962,25 @@ class SparkSubmitSuite
962962
}
963963
}
964964

965+
test("remove copies of application jar from classpath") {
966+
val fs = File.separator
967+
val sparkConf = new SparkConf(false)
968+
val hadoopConf = new Configuration()
969+
val secMgr = new SecurityManager(sparkConf)
970+
971+
val appJarName = "myApp.jar"
972+
val jar1Name = "myJar1.jar"
973+
val jar2Name = "myJar2.jar"
974+
val userJar = s"file:/path${fs}to${fs}app${fs}jar$fs$appJarName"
975+
val jars = s"file:/$jar1Name,file:/$appJarName,file:/$jar2Name"
976+
977+
val resolvedJars = DependencyUtils
978+
.resolveAndDownloadJars(jars, userJar, sparkConf, hadoopConf, secMgr)
979+
980+
assert(!resolvedJars.contains(appJarName))
981+
assert(resolvedJars.contains(jar1Name) && resolvedJars.contains(jar2Name))
982+
}
983+
965984
test("Avoid re-upload remote resources in yarn client mode") {
966985
val hadoopConf = new Configuration()
967986
updateConfWithFakeS3Fs(hadoopConf)

0 commit comments

Comments
 (0)