Uploaded image for project: 'Spark'
  1. Spark
  2. SPARK-1210

Prevent ContextClassLoader of Actor from becoming ClassLoader of Executor

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Blocker
    • Resolution: Fixed
    • 0.9.0
    • 1.0.0
    • Spark Core
    • None

    Description

      Constructor of org.apache.spark.executor.Executor should not set context class loader of current thread, which is backend Actor's thread.

      Run the following code in local-mode REPL.

      scala> case class Foo(i: Int)
      scala> val ret = sc.parallelize((1 to 100).map(Foo), 10).collect

      This causes errors as follows:

      ERROR actor.OneForOneStrategy: [L$line5.$read$$iwC$$iwC$$iwC$$iwC$Foo;
      java.lang.ArrayStoreException: [L$line5.$read$$iwC$$iwC$$iwC$$iwC$Foo;
      at scala.runtime.ScalaRunTime$.array_update(ScalaRunTime.scala:88)
      at org.apache.spark.SparkContext$$anonfun$runJob$3.apply(SparkContext.scala:870)
      at org.apache.spark.SparkContext$$anonfun$runJob$3.apply(SparkContext.scala:870)
      at org.apache.spark.scheduler.JobWaiter.taskSucceeded(JobWaiter.scala:56)
      at org.apache.spark.scheduler.DAGScheduler.handleTaskCompletion(DAGScheduler.scala:859)
      at org.apache.spark.scheduler.DAGScheduler.processEvent(DAGScheduler.scala:616)
      at org.apache.spark.scheduler.DAGScheduler$$anonfun$start$1$$anon$2$$anonfun$receive$1.applyOrElse(DAGScheduler.scala:207)
      at akka.actor.ActorCell.receiveMessage(ActorCell.scala:498)
      at akka.actor.ActorCell.invoke(ActorCell.scala:456)
      at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:237)
      at akka.dispatch.Mailbox.run(Mailbox.scala:219)
      at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386)
      at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
      at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
      at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
      at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

      This is because the class loaders to deserialize result Foo instances might be different from backend Actor's, and the Actor's class loader should be the same as Driver's.

      See PR: https://github.com/apache/spark/pull/15

      Attachments

        Issue Links

          Activity

            People

              ueshin Takuya Ueshin
              ueshin Takuya Ueshin
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: