scala 类组织的apache-spark异常,java.lang.NoClassDefFoundError:无法初始化类XXX

wz3gfoph  于 2023-02-19  发布在  Scala
关注(0)|答案(1)|浏览(172)

类组织的apache-spark异常,java. lang. NoClassDefFoundError:无法初始化类XXX(类中存在字段验证)异常,当我试图做的Spark数据框字段验证。以下是我的代码

    • 并且使用的所有类和对象都已序列化。AWS EMR Spark作业失败(在本地计算机中工作正常)**
val newSchema = df.schema.add("errorList", ArrayType(new StructType()
.add("fieldName" , StringType)
.add("value" , StringType)
.add("message" , StringType)))

    //Validators is a Sequence of validations on columns in a Row.
    // Validator method signature 
    // def checkForErrors(row: Row): (fieldName, value, message) ={
    // logic to validate the field in a row }
    
    val validateRow: Row => Row = (row: Row)=>{
    val errorList = validators.map(validator => validator.checkForErrors(row)
    Row.merge(row, Row(errorList))
    }
    
    
    val validateDf = df.map(validateRow)(RowEncoder.apply(newSchema))

版本:Spark 2.4.7和Scala 2.11.8
任何关于为什么会发生这种情况的想法,或者如果有人有同样的问题。

wyyhbhjk

wyyhbhjk1#

我在EMR版本6.8.0中遇到了一个非常类似的问题--特别是,spark.jars配置在EMR上没有得到尊重(我将它指向S3中JAR的位置),尽管它似乎是通常接受的Spark参数。
对我来说,解决方案是遵循以下指南(“我如何解决亚马逊EMR上Spark中的“java.lang.ClassNotFoundException”?”):https://aws.amazon.com/premiumsupport/knowledge-center/emr-spark-classnotfoundexception/
在CDK中(其中我们的EMR集群定义为),我设置了一个EMR步骤,在集群创建后立即执行,重写spark.driver.extraClassPathspark.executor.extraClassPath以包含我的附加JAR的位置(在我的例子中,JAR实际上来自Docker映像,但是您也可以设置一个引导操作,将其从S3复制到集群上),按照他们在“For Amazon EMR Release Version 6. 0. 0及更高版本"下的文章中的代码,您必须进行这种“重写”的原因是因为EMR已经用一堆自己的JAR位置填充了这些X1 M3 N1 X,例如对于包含S3驱动程序的JAR,因此您实际上必须附加自己的JAR位置,而不是直接将spark.*.extraClassPath设置为您的位置。如果您这样做(我试过了),那么您将失去许多EMR功能,例如能够从S3读取。

#!/bin/bash
#
# This is an example of script_b.sh for changing /etc/spark/conf/spark-defaults.conf
#
while [ ! -f /etc/spark/conf/spark-defaults.conf ]
do
  sleep 1
done
#
# Now the file is available, do your work here
#
sudo sed -i '/spark.*.extraClassPath/s/$/:\/home\/hadoop\/extrajars\/\*/' /etc/spark/conf/spark-defaults.conf
exit 0

相关问题