2016-02-04 67 views
1

獲取只有通過與Apache的星火spark-submit.sh運行這個錯誤,這運行正常的IntelliJ中與正常運行的配置,所以我非常確信,這是一些關於如何星火想要訪問的構造,這是我們希望私營:MVCE與靜態構造函數的Apache Spark/Java反射錯誤?

類org.apache.spark.deploy.SparkSubmit $不能訪問的 類jpsgcs.thold.AnyOldClass成員與修飾語 「公共靜態」

這裏的MVCE:

import java.io.IOException; 
import java.io.Serializable; 

class AnyOldClass implements Serializable { 
    public String anyOldString = null; 

    private AnyOldClass() throws IOException { 
     anyOldString = new String("hello dere"); 
    } 

    public static void main(String[] args) throws Exception { 
     AnyOldClass anyOldInstance = new AnyOldClass(); 
     anyOldInstance.go(); 
    } 

    private void go() { 
     System.out.println("Visualize "); 
    } 
} 

完整版下面的錯誤,這MVCE開始爲我們做出了構造私人工作過罰款全功能的基於星火計劃。缺乏SparkContext和SparkConf不是問題。

我們有這個類,通過幾級繼承。爲了創建這個類的RDD,我們必須在繼承鏈上設置五個級別,從而使所有這些級別的可序列化。序列化這麼深的堆棧會變得很難看,對嗎? (這之前,我們甚至嘗試KRYO)

我們認爲這是一個更好的辦法來運行每個核心一個工人,導致每一個核心的JVM。在每個JVM中,我們想要獲得這個類的一個實例。然後,我們將使用另一個類,我們並行的JavaRDD修改這個類的內容,每個核心/ JVM一個分區,與基於RDD級到位修改這一類的每個分區的每個元素。根據要求

完整堆棧跟蹤:

Exception in thread "main" java.lang.IllegalAccessException: Class org.apache.spark.deploy.SparkSubmit$ can not access a member of class jpsgcs.thold.AnyOldClass with modifiers "public static" 
    at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102) 
    at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296) 
    at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288) 
    at java.lang.reflect.Method.invoke(Method.java:490) 
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:672) 
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:180) 
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:205) 
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:120) 
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) 
+0

@Samuel地感謝......我加入了斯卡拉標記,因爲Spark是斯卡拉 – JimLohse

回答

3

你需要讓你的public類。默認情況下,類是包的範圍,這意味着它將不得不與org.apache.spark.deploy.SparkSubmit位於相同的包中,以便調用它的方法。

變化

class AnyOldClass implements Serializable { 

public class AnyOldClass implements Serializable { 
+1

真棒!非常感謝,我被拋棄了,Java喜歡它,沒有讓你感到厭煩,你只是在一個非常有趣的項目上做了很大的改變......謝謝!我會盡快接受這個,我可以:)幾分鐘 – JimLohse

+0

只是能夠測試出我們代碼的完整版本,在那裏工作過。如果您對整體概念有任何其他意見,請告訴我。 – JimLohse

+0

關於「反思」,我認爲讓班級非公開的想法是多麼糟糕......良好的學習經驗。看直接編譯時JVM不會窒息,但Spark窒息。 – JimLohse