2016-02-04 36 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