Определение SparkSession в объекте scala в качестве глобальной переменной вызывает ошибку java.lang.ClassNotFoundException в режиме Spark yarn - PullRequest
0 голосов
/ 09 октября 2018

В режиме искровой пряжи я объявил переменную SparkSession в объекте scala следующим образом:

</p>

<code>object ScalaTest {

  // will raise java.lang.NoClassDefFoundError: Could not initialize class ScalaTest
  val sparkConf  = new SparkConf().setAppName("Scala Test")
  val hiveCtx    = SparkSession.builder().config(sparkConf).enableHiveSupport().getOrCreate()


  def mapKeyWord(rows: Iterator[Row]): Iterator[Row] = {
    for (row <- rows) yield {
      Row(key_word, pv)
    }
  }

  def getData(hiveCtxArg: SparkSession): Unit = {
    val hiveCtx = hiveCtxArg
    val sqlQuery = """select key_word, sum(pv) as pv from test_table group by key_word"""
    val dfRDD = hiveCtx.sql(sqlQuery).rdd.mapPartitions(mapKeyWord)
    println("Count of rdd: %s".format(dfRDD.count))
  }


  def main(args: Array[String]): Unit = {
    // SparkSession should declared here
    //    val sparkConf            = new SparkConf().setAppName("Scala Test")
    //    val hiveCtx              = SparkSession.builder().config(sparkConf).enableHiveSupport().getOrCreate()

    getData(hiveCtx)
    println("Jobs done.")
  }
}
</code>

После отправки в Spark с режимом пряжи, приведенный выше кодвызовет java.lang.NoClassDefFoundError: Не удалось инициализировать класс ScalaTest.Однако в локальном режиме код работает нормально.

Я предполагаю, что переменные, определенные в объекте, являются статическими и инициализируются только один раз в драйвере?

...