gpt4 book ai didi

hadoop - Spark自定义序列化程序导致ClassNotFound

转载 作者:行者123 更新时间:2023-12-02 20:00:17 25 4
gpt4 key购买 nike

我正在尝试使用自定义 Spark 序列化程序定义为:

conf.set(“spark.serializer”,CustomSparkSerializer.class.getCanonicalName());

但是,当我向Spark提交应用程序时,在执行程序环境创建时遇到 ClassNotFoundException 的问题,例如:

16/04/01 18:41:11 INFO util.Utils:在端口52153上成功启动了服务“sparkExecutor”。

Exception in thread "main" java.lang.reflect.UndeclaredThrowableException
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1643)
at org.apache.spark.deploy.SparkHadoopUtil.runAsSparkUser(SparkHadoopUtil.scala:68)
at org.apache.spark.executor.CoarseGrainedExecutorBackend$.run(CoarseGrainedExecutorBackend.scala:149)
at org.apache.spark.executor.CoarseGrainedExecutorBackend$.main(CoarseGrainedExecutorBackend.scala:250)
at org.apache.spark.executor.CoarseGrainedExecutorBackend.main(CoarseGrainedExecutorBackend.scala)
Caused by: java.lang.ClassNotFoundException: example.CustomSparkSerializer
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:270)
at **org.apache.spark.util.Utils$.classForName(Utils.scala:173)**
at org.apache.spark.SparkEnv$.instantiateClass$1(SparkEnv.scala:266)
at org.apache.spark.SparkEnv$.instantiateClassFromConf$1(SparkEnv.scala:287)
at org.apache.spark.SparkEnv$.create(SparkEnv.scala:290)
at org.apache.spark.SparkEnv$.createExecutorEnv(SparkEnv.scala:218)
at org.apache.spark.executor.CoarseGrainedExecutorBackend$$anonfun$run$1.apply$mcV$sp(CoarseGrainedExecutorBackend.scala:183)
at org.apache.spark.deploy.SparkHadoopUtil$$anon$1.run(SparkHadoopUtil.scala:69)
at org.apache.spark.deploy.SparkHadoopUtil$$anon$1.run(SparkHadoopUtil.scala:68)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)

在本地独立模式下,可以使用“ spark.executor.extraClassPath = path / to / jar ”解决问题,但是在具有多个节点的群集上则无济于事。

我已经尝试了所有已知的方法(对我而言),例如使用--jars,执行程序(甚至驱动程序)的额外类和库路径,sc.addJar ...也无济于事。

我发现Spark在org.apache.spark.util.Utils $ .classForName(Utils.scala:173)中使用特定的类加载器作为加载序列化程序类,但是我真的不明白如何使自定义序列化程序可加载。

应用程序流程提交更加复杂- Oozie-> SparkSubmit-> YARN客户端-> Spark应用程序

问题是-有人知道如何使用自定义spark序列化程序以及如何解决ClassNotFound问题吗?

提前致谢!

最佳答案

发生这种情况的原因是因为我使用了带有前缀 / home / some_user 的spark.executor.extraClassPath。似乎Spark无法从该路径加载任何类,因为Spark进程的所有者是另一个用户,一旦我将JAR放置到像 / usr / lib / 这样的路径smth上,一切正常。

因此,我与用户和Hadoop / Oozie / Spark进程所有者混淆了,但是我没想到ClassLoaders =)有这种行为

谢谢你的帮助!

关于hadoop - Spark自定义序列化程序导致ClassNotFound,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36507263/

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