有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

静态构造函数上带有Apache Spark/Java反射错误的scala MVCE?

只有在运行spark submit时才会出现此错误。对于ApacheSpark,它在IntelliJ中运行正常,运行配置正常,所以我确信这是Spark想要访问构造函数的方式,我们希望它是私有的:

Class org.apache.spark.deploy.SparkSubmit$ can not access a member of class jpsgcs.thold.AnyOldClass with modifiers "public static"

以下是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是一个功能完整的基于Spark的程序,在我们将构造函数设置为私有之前,它运行良好。缺少SparkContext和SparkConf不是问题所在

我们有一个通过几个级别继承的类。为了制作该类的RDD,我们必须在继承链上进行大约五个级别,使所有这些级别都可以序列化。把这么深的一堆连载起来会很难看的,对吧?(那是在我们尝试Kryo之前)

我们认为,每个核心运行一个worker是一种更好的方法,这样每个核心就有一个JVM。在每个JVM中,我们希望得到这个类的一个实例。然后,我们将使用另一个在JavaRDD中并行化的类来修改这个类的内容,每个core/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)

共 (1) 个答案

  1. # 1 楼答案

    你需要让你的班级public。默认情况下,类是包作用域,这意味着它必须与org.apache.spark.deploy.SparkSubmit驻留在同一个包中才能调用其方法

    改变

    class AnyOldClass implements Serializable {
    

    public class AnyOldClass implements Serializable {