0

如何在开发中使用Play Framework和Spark群集?如何使用分布式Spark和Play框架?

我可以运行设置到主任何星火应用程序的本地[*]

但如果我将它设置为在群集上运行,我得到这个:

play.api.Application$$anon$1: Execution exception[[SparkException: Job aborted due to stage failure: Task 1 in stage 0.0 failed 4 times, most recent failure: Lost task 1.3 in stage 0.0 (TID 5, 192.168.1.239): java.lang.ClassNotFoundException: controllers.Application$$anonfun$test$1$$anonfun$2 
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:348) 
at org.apache.spark.serializer.JavaDeserializationStream$$anon$1.resolveClass(JavaSerializer.scala:67) 
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1620) 
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1521) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1781) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) 
at org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:75) 
at org.apache.spark.serializer.JavaSerializerInstance.deserialize(JavaSerializer.scala:114) 
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66) 
at org.apache.spark.scheduler.Task.run(Task.scala:86) 
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:274) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 

我明白的问题是分布式工作人员没有加载我的应用程序类。

那么如何使用Lightbend Activator下的Spark?通过命令行提交Play Framework应用程序没有任何意义,它应该在Play下运行,以便您可以在浏览器中看到结果。

我下载了Lightbend示例Spark应用程序,它们使用本地[*]作为Spark Master。如果我切换到spark:// master:port url,它们都会崩溃并出现同样的问题。

有谁知道如何解决这个问题?提前致谢。

+0

请提供您从哪里下载的存储库? –

+0

Hi @ShivanshSrivastava:来自最新的Lightbend Activator,命令激活器ui显示了几个Spark应用示例。我一个接一个地跑了,看了他们的消息。除非我错过了,否则都使用本地[*]作为Spark主。 –

回答

2

对不起,伙计们。这是正确的解释in the documentation

在高级依赖管理部分下,它解释了主服务器如何将JAR分发给从属工作者。

从那里,它是一个将--jars命令行选项转换为SparkContext上的.addJar的问题。

生成通过激活DIST罐子,这将是目标/斯卡拉-2.version下,然后通过addJars的路径添加到该文件。

现在完美运作。

唯一的问题是,在发展,游戏将重新启动应用程序时,你改变的文件,使用相同的JVM,这将产生一个JVM有两个上下文的火花错误。因此,您需要重新启动应用程序才能测试更改。小小的滋扰,考虑到Spark下Spark的威力。干杯!

+0

嗨,何塞,你的意思是我们使用spark-submit,我们必须添加-jar与来自target/scala-xx的jar文件? 可否请您多谈这件事,因为我还是不明白,谢谢。 –