web-dev-qa-db-ja.com

java.lang.NoClassDefFoundError:sparkジョブをspark経由で起動するときにクラスを初期化できませんでした-scalaコードで送信)

私は以下のようなコードを持っています

オブジェクトErrorTest {
 case class APIResults(status:String、col_1:Long、col_2:Double、...)
 
 def funcA(rows:ArrayBuffer [ Row])(implicit defaultFormats:DefaultFormats):ArrayBuffer [APIResults] = {
 //いくつかのAPIを呼び出して結果を取得し、APIResults 
 ... 
} [.____を返します。 ] 
 //マーク:プロパティの読み込み
 val props = loadProperties()
 private def loadProperties():プロパティ= {
 val configFile = new File( "config .properties ")
 val reader = new FileReader(configFile)
 val props = new Properties()
 props.load(reader)
 props 
} 
 
 def main(args:Array [String]):Unit = {
 val prop_a = props.getProperty( "prop_a")
 
 val session = Context.initialSparkSession(); 
 import session.implicits ._ 
 
 val initialSet = ArrayBuffer.empty [Row] 
 val addToSet =( s:ArrayBuffer [Row]、v:Row)=>(s + = v)
 val mergePartitionSets =(p1:ArrayBu ffer [Row]、p2:ArrayBuffer [Row])=>(p1 ++ = p2)
 
 val sql1 = 
 s "" "
 select * from tbl_a where ... 
 "" "
 
 session.sql(sql1)
 .rdd.map {row => {implicit val format = DefaultFormats; (row.getLong(6)、row)}} 
。aggregateByKey(initialSet)(addToSet、mergePartitionSets)
 .repartition(40)
 .map {case(rowNumber、rows )=> {暗黙のval形式= DefaultFormats; funcA(rows)}} 
。flatMap(x => x)
 .toDF()
 .write.mode(SaveMode.Overwrite).saveAsTable( "tbl_b")
} 
} 

_spark-submit_を介して実行すると、エラーがスローされます原因:Java.lang.NoClassDefFoundError:クラスstaging_jobs.ErrorTest $を初期化できませんでした。しかし、val props = loadProperties()mainメソッドの最初の行に移動すると、エラーは発生しなくなります。誰かがこの現象について説明してもらえますか?どうもありがとう!

_Caused by: Java.lang.NoClassDefFoundError: Could not initialize class staging_jobs.ErrorTest$
  at staging_jobs.ErrorTest$$anonfun$main$1.apply(ErrorTest.scala:208)
  at staging_jobs.ErrorTest$$anonfun$main$1.apply(ErrorTest.scala:208)
  at scala.collection.Iterator$$anon$11.next(Iterator.scala:409)
  at scala.collection.Iterator$$anon$12.nextCur(Iterator.scala:434)
  at scala.collection.Iterator$$anon$12.hasNext(Iterator.scala:440)
  at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:408)
  at org.Apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIterator.processNext(Unknown Source)
  at org.Apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.Java:43)
  at org.Apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$8$$anon$1.hasNext(WholeStageCodegenExec.scala:377)
  at org.Apache.spark.sql.execution.datasources.FileFormatWriter$SingleDirectoryWriteTask.execute(FileFormatWriter.scala:243)
  at org.Apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$org$Apache$spark$sql$execution$datasources$FileFormatWriter$$executeTask$3.apply(FileFormatWriter.scala:190)
  at org.Apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$org$Apache$spark$sql$execution$datasources$FileFormatWriter$$executeTask$3.apply(FileFormatWriter.scala:188)
  at org.Apache.spark.util.Utils$.tryWithSafeFinallyAndFailureCallbacks(Utils.scala:1341)
  at org.Apache.spark.sql.execution.datasources.FileFormatWriter$.org$Apache$spark$sql$execution$datasources$FileFormatWriter$$executeTask(FileFormatWriter.scala:193)
  ... 8 more
_
9
KAs

私はあなたと同じ質問に出会った。 convertメソッドの外にメソッドmainを定義しました。 maindataframe.rdd.map{x => convert(x)}と一緒に使用すると、NoClassDefFoundError:Could not initialize class Test$ 起こりました。

しかし、convertorメソッドでconvertメソッドと同じコードである関数オブジェクトmainを使用すると、エラーは発生しませんでした。

spark 2.1.0、scala 2.11、sparkのバグのようですか?

4
cnstevenyu

問題は、val props = loadProperties()が(mainの)外部クラスのメンバーを定義していることだと思います。次に、このメンバーは、ドライバーを使用した保存環境を持たないエグゼキューターでシリアル化(または実行)されます。

1
Morrissss