【问题标题】:How to use distributed Spark and Play Framework?如何使用分布式 Spark 和 Play 框架?
【发布时间】:2016-11-25 12:08:19
【问题描述】:

您如何在开发中使用 Play Framework 和 Spark 集群?

我可以运行任何将 master 设置为 local[*] 的 Spark 应用程序

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

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,它们都会因同样的问题而崩溃。

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

【问题讨论】:

  • 请提供您下载的存储库?
  • 嗨@ShivanshSrivastava:来自最新的 Lightbend Activator,命令 activator ui 显示了几个示例 Spark 应用程序。我一一运行并阅读了他们的资料。除非我错过了一个,否则都使用 local[*] 作为 Spark master。

标签: apache-spark playframework playframework-2.0 spark-streaming typesafe-activator


【解决方案1】:

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

在 Advanced Dependency Management 部分下,它解释了 master 如何将 JAR 分发给 slave worker。

从那里开始,将 --jars 命令行选项转换为 SparkContext 上的 .addJar。

通过激活器 dist 生成 jar,它将位于 target/scala-2.version 下,然后通过 addJars 添加该文件的路径。

现在完美运行。

唯一的问题是,在开发中,Play 将在您更改文件时重新启动应用程序,使用同一个 JVM,这将产生一个 Spark 错误,即在一个 JVM 中有两个上下文。因此,您需要重新启动应用程序以测试更改。小麻烦,考虑到 Play 下 Spark 的强大功能。干杯!

【讨论】:

  • 嗨 Jose,你的意思是我们使用 spark-submit,我们必须添加 --jars 和来自 target/scala-xx 的 jar 文件?能否请您多说一些,因为我还是不明白,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
相关资源
最近更新 更多