it-roy-ru.com

java.lang.NoClassDefFoundError: Не удалось инициализировать класс при запуске искрового задания с помощью spark-submit в коде scala

У меня есть код, который выглядит ниже 

 объект ErrorTest {
 case class APIResults (состояние: строка, столбец_1: длинный, столбец_2: двойной, ...) 

 def funcA (строки: ArrayBuffer [Row]) (неявный defaultFormats: DefaultFormats: Defaultray): ArrayBuffer [APIResults] = {
 // вызвать некоторый API и получить результаты и вернуть APIResults 
 ...
} 

 // MARK: загрузить свойства 
 Val props = loadProperties () 
 Private def loadProperties (): Properties = {
 val configFile = новый файл ("config.properties") 
 val reader = новый FileReader (configFile) 
 val props = new Properties () 
 props.load (считыватель) 
 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: ArrayBuffer [Row], p2: ArrayBuffer [Row]) => (p1 ++ = p2) 

 val sql1 = 
 s "" "
 select * from tbl_a где ...
" "" 

 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 (строки)}} 
 .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
7
KAs

Я встречал тот же вопрос, что и вы. Я определил метод convert вне метода main. Когда я использую его с dataframe.rdd.map{x => convert(x)} в main, NoClassDefFoundError:Could not initialize class Test$ произошло. 

Но когда я использую объект функции convertor, который является тем же кодом, что и метод convert, в методе main ошибка не возникает. 

Я использовал spark 2.1.0, scala 2.11, это похоже на ошибку в spark? 

2
cnstevenyu

Я предполагаю, что проблема в том, что val props = loadProperties() определяет член для внешнего класса (main). Затем этот член будет сериализован (или запущен) для исполнителей, у которых нет среды сохранения с драйвером.

0
Morrissss