gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:51:41 25 4
gpt4 key购买 nike

仅当使用 Apache Spark 通过 spark-submit.sh 运行时才会出现此错误,这在 IntelliJ 中运行正常,具有正常的运行配置,所以我非常相信这是关于 Spark 如何访问我们想要私有(private)的构造函数:

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 的程序,在我们将构造函数设为私有(private)之前运行良好。缺少 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 {

关于java - 静态构造函数上带有 Apache Spark/Java 反射错误的 MVCE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35211960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com