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文件? 可否請您多談這件事,因爲我還是不明白,謝謝。 –