Spark:线程中的异常" main" akka.actor.ActorNotFound:

时间:2016-01-14 15:10:08

标签: apache-spark spark-notebook

我将我的火花作业从本地笔记本电脑提交到远程独立Spark集群(spark:// IP:7077)。它已成功提交。但是,我没有得到任何输出,并在一段时间后失败。当我检查群集上的工作人员时,我发现以下异常:

Exception in thread "main" akka.actor.ActorNotFound: Actor not found for: ActorSelection[Actor[akka.tcp://sparkDriver@localhost:54561/]/user/CoarseGrainedScheduler]

当我在本地系统(local [*])上运行相同的代码时,它会成功运行并提供输出。

请注意,我在spark notebook中运行它。当我使用spark-submit

通过终端提交时,相同的应用程序在远程独立群集上成功运行

我在笔记本配置中遗漏了什么?还有其他可能的原因吗?

代码非常简单。

详细例外:

Exception in thread "main" akka.actor.ActorNotFound: Actor not found for: ActorSelection[Actor[akka.tcp://sparkDriver@localhost:54561/]/user/CoarseGrainedScheduler]
    at akka.actor.ActorSelection$$anonfun$resolveOne$1.apply(ActorSelection.scala:66)
    at akka.actor.ActorSelection$$anonfun$resolveOne$1.apply(ActorSelection.scala:64)
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
    at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.processBatch$1(BatchingExecutor.scala:67)
    at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply$mcV$sp(BatchingExecutor.scala:82)
    at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply(BatchingExecutor.scala:59)
    at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply(BatchingExecutor.scala:59)
    at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:72)
    at akka.dispatch.BatchingExecutor$Batch.run(BatchingExecutor.scala:58)
    at akka.dispatch.ExecutionContexts$sameThreadExecutionContext$.unbatchedExecute(Future.scala:74)
    at akka.dispatch.BatchingExecutor$class.execute(BatchingExecutor.scala:110)
    at akka.dispatch.ExecutionContexts$sameThreadExecutionContext$.execute(Future.scala:73)
    at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:40)
    at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:248)
    at akka.pattern.PromiseActorRef.$bang(AskSupport.scala:269)
    at akka.actor.EmptyLocalActorRef.specialHandle(ActorRef.scala:512)
    at akka.actor.DeadLetterActorRef.specialHandle(ActorRef.scala:545)
    at akka.actor.DeadLetterActorRef.$bang(ActorRef.scala:535)
    at akka.remote.RemoteActorRefProvider$RemoteDeadLetterActorRef.$bang(RemoteActorRefProvider.scala:91)
    at akka.actor.ActorRef.tell(ActorRef.scala:125)
    at akka.dispatch.Mailboxes$$anon$1$$anon$2.enqueue(Mailboxes.scala:44)
    at akka.dispatch.QueueBasedMessageQueue$class.cleanUp(Mailbox.scala:438)
    at akka.dispatch.UnboundedDequeBasedMailbox$MessageQueue.cleanUp(Mailbox.scala:650)
    at akka.dispatch.Mailbox.cleanUp(Mailbox.scala:309)
    at akka.dispatch.MessageDispatcher.unregister(AbstractDispatcher.scala:204)
    at akka.dispatch.MessageDispatcher.detach(AbstractDispatcher.scala:140)
    at akka.actor.dungeon.FaultHandling$class.akka$actor$dungeon$FaultHandling$$finishTerminate(FaultHandling.scala:203)
    at akka.actor.dungeon.FaultHandling$class.terminate(FaultHandling.scala:163)
    at akka.actor.ActorCell.terminate(ActorCell.scala:338)
    at akka.actor.ActorCell.invokeAll$1(ActorCell.scala:431)
    at akka.actor.ActorCell.systemInvoke(ActorCell.scala:447)
    at akka.dispatch.Mailbox.processAllSystemMessages(Mailbox.scala:262)
    at akka.dispatch.Mailbox.run(Mailbox.scala:218)
    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)

示例代码

val logFile = "hdfs://hostname/path/to/file"
val conf = new SparkConf() 
.setMaster("spark://hostname:7077") // as appears on hostname:8080
.setAppName("myapp")
.set("spark.executor.memory", "20G")
.set("spark.cores.max", "40")
.set("spark.executor.cores","20")
.set("spark.driver.allowMultipleContexts","true")

val sc2 = new SparkContext(conf)
val logData = sc2.textFile(logFile)
val numAs = logData.filter(line => line.contains("hello")).count()
val numBs = logData.filter(line => line.contains("hi")).count()
println("Lines with a: %s, Lines with b: %s".format(numAs, numBs))

2 个答案:

答案 0 :(得分:0)

当你说" spark notebook"我假设你的意思是github项目https://github.com/andypetrella/spark-notebook

我必须查看笔记本的具体内容,但我注意到你的工作人员正在尝试连接到#34; localhost"上的主人。

对于普通的Spark配置,在$ SPARK_HOME / conf / spark-env.sh中的工作者集SPARK_MASTER_IP上查看是否有帮助,即使您在独立模式下在单台计算机上运行,​​也请设置此项。根据我的经验,Spark并不总能正确解析主机名,因此从所有IP的基线开始是一个好主意。

其余的是一般信息,看看它是否有助于解决您的具体问题:

如果您要从笔记本电脑提交群集,请使用--deploy-mode进行群集,以告知您的驱动程序在其中一个工作节点上运行。这样可以额外考虑如何设置类路径,因为您不知道驱动程序将在哪个工作线上运行。

这里有一些关于完整性的一般信息,有一个关于主机名解析为IP地址的已知Spark错误。在所有情况下,我都不会将此作为完整答案,但我建议尝试使用所有IP的基线,并仅使用单个配置SPARK_MASTER_IP。只有这两种做法,我让我的集群工作,所有其他配置,或使用主机名,似乎只是搞砸了。

所以在你的spark-env.sh中删除SPARK_LOCAL_IP并将SPARK_MASTER_IP更改为IP地址,而不是主机名。

I have treated this more at length in this answer.

为了更完整,这里是答案的一部分:

您可以ping运行Spark主服务器的框吗?你可以从主人那里ping工人吗?更重要的是,您可以从主箱中为工作人员提供无密码ssh吗?根据1.5.2文档,您需要能够使用私钥执行此操作并将工作程序输入conf / slaves文件中。我在最后复制了相关段落。

您可以获得工作人员可以联系主人的情况,但是主人无法回到工作人员,因此看起来没有连接。检查两个方向。 我认为奴隶文件在主节点上,而无密码的ssh可能导致与你所看到的类似的错误。

根据我交换的答案,还有an old bug,但不清楚该错误是如何解决的。

答案 1 :(得分:0)

更新

通过在应用程序代码中包含驱动程序的IP地址(即本地笔记本电脑的公共IP),可以避免上述问题。这可以通过在spark上下文中添加以下行来完成:

.set("spark.driver.host",YourSystemIPAddress)

但是,如果驱动程序的IP地址在NAT后面,则可能会出现问题。在这种情况下,工人将无法找到IP。