仅当使用Apache Spark在spark-submit.sh中运行时才出现此错误,它在IntelliJ中使用正常的运行配置可以正常运行,因此我非常确信这是Spark想要访问构造函数的方法,我们希望将其构造为私有的:


  org.apache.spark.deploy.SparkSubmit $类无法访问以下成员
  带有修饰符“ public static”的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开始时是一个基于功能完整的Spark程序,在将构造函数设为私有之前,它可以正常工作。缺少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)

最佳答案

您需要将课程设置为public。默认情况下,类是程序包范围的,这意味着它必须与org.apache.spark.deploy.SparkSubmit驻留在同一程序包中才能调用其方法。

更改

class AnyOldClass implements Serializable {




public class AnyOldClass implements Serializable {

07-24 09:45
查看更多