我想在Spark Jobserver上运行Spark Job。 在执行期间,我遇到了一个例外:
堆叠:
java.lang.RuntimeException:scala.ScalaReflectionException:class JavaMirror中的com.some.example.instrument.data.SQLMapping org.apache.spark.util.MutableURLClassLoader@55b699ef类型类 带有classpath的org.apache.spark.util.MutableURLClassLoader [file:/app/spark-job-server.jar]和父母正在 sun.misc.Launcher$AppClassLoader@2e817b38类型类 sun.misc.Launcher $ AppClassLoader with classpath [... / classpath 没找到罐子 /。
在 scala.reflect.internal.Mirrors $ RootsBase.staticClass(Mirrors.scala:123) 在 scala.reflect.internal.Mirrors $ RootsBase.staticClass(Mirrors.scala:22) 在 com.some.example.instrument.DataRetriever $$ anonfun $ $ combineMappings 1 $$ typecreator15 $ 1.适用(DataRetriever.scala:136) 在 scala.reflect.api.TypeTags $ WeakTypeTagImpl.tpe $ lzycompute(TypeTags.scala:232) at scala.reflect.api.TypeTags $ WeakTypeTagImpl.tpe(TypeTags.scala:232) 在 org.apache.spark.sql.catalyst.encoders.ExpressionEncoder $。适用(ExpressionEncoder.scala:49) 在org.apache.spark.sql.Encoders $ .product(Encoders.scala:275)at at org.apache.spark.sql.LowPrioritySQLImplicits $ class.newProductEncoder(SQLImplicits.scala:233) 在 org.apache.spark.sql.SQLImplicits.newProductEncoder(SQLImplicits.scala:33) 在 com.some.example.instrument.DataRetriever $$ anonfun $ combineMappings $ 1.适用(DataRetriever.scala:136) 在 com.some.example.instrument.DataRetriever $$ anonfun $ combineMappings $ 1.适用(DataRetriever.scala:135) 在scala.util.Success $$ anonfun $ map $ 1.apply(Try.scala:237)at at scala.util.Try $ .apply(Try.scala:192)at scala.util.Success.map(Try.scala:237)at scala.concurrent.Future $$ anonfun $ map $ 1.apply(Future.scala:237)at at scala.concurrent.Future $$ anonfun $ map $ 1.apply(Future.scala:237)at at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)at at scala.concurrent.impl.ExecutionContextImpl $ AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:121) 在 scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) 在 scala.concurrent.forkjoin.ForkJoinPool $ WorkQueue.runTask(ForkJoinPool.java:1339) 在 scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) 在 scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
在DataRetriever
中,我将简单案例类转换为DataSet。
案例类定义:
case class SQLMapping(id: String,
it: InstrumentPrivateKey,
cc: Option[String],
ri: Option[SourceInstrumentId],
p: Option[SourceInstrumentId],
m: Option[SourceInstrumentId])
case class SourceInstrumentId(instrumentId: Long,
providerId: String)
case class InstrumentPrivateKey(instrumentId: Long,
providerId: String,
clientId: String)
导致问题的代码:
import session.implicits._
def someFunc(future: Future[ID]): Dataset[SQLMappins] = {
future.map {f =>
val seq: Seq[SQLMapping] = getFromEndpoint(f)
val ds: Dataset[SQLMapping] = seq.toDS()
...
}
}
这项工作有时会奏效,但如果我重新开始工作,就会抛出异常。
更新28.03.2018
我忘了提一个细节,结果证明这很重要。
数据集是在Future
内构建的。
答案 0 :(得分:1)
将来调用toDS()
导致ScalaReflectionException。
我决定在future.map
之外构建DataSet。
您可以使用此示例作业验证无法在future.map
中构建数据集。
package com.example.sparkapplications
import com.typesafe.config.Config
import org.apache.spark.SparkContext
import org.apache.spark.sql.SparkSession
import scala.concurrent.Await
import scala.concurrent.Future
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
import spark.jobserver.SparkJob
import spark.jobserver.SparkJobValid
import spark.jobserver.SparkJobValidation
object FutureJob extends SparkJob{
override def runJob(sc: SparkContext,
jobConfig: Config): Any = {
val session = SparkSession.builder().config(sc.getConf).getOrCreate()
import session.implicits._
val f = Future{
val seq = Seq(
Dummy("1", 1),
Dummy("2", 2),
Dummy("3", 3),
Dummy("4", 4),
Dummy("5", 5)
)
val ds = seq.toDS
ds.collect()
}
Await.result(f, 10 seconds)
}
case class Dummy(id: String, value: Long)
override def validate(sc: SparkContext,
config: Config): SparkJobValidation = SparkJobValid
}
稍后,如果使用spark 2.3.0问题仍然存在,并且直接通过spark-submit
传递jar,我将提供相关信息。