Регистрация классов с Kryo через SparkSession в Spark 2+ - PullRequest
0 голосов
/ 29 сентября 2018

Я перехожу с Spark 1.6 на 2.3.

Мне нужно зарегистрировать пользовательские классы в Kryo.Итак, что я вижу здесь: https://spark.apache.org/docs/2.3.1/tuning.html#data-serialization

val conf = new SparkConf().setMaster(...).setAppName(...)
conf.registerKryoClasses(Array(classOf[MyClass1], classOf[MyClass2]))
val sc = new SparkContext(conf)

Проблема в том, что ... везде в инструкциях Spark 2+ это указывает на то, что SparkSession - это путь для всего ... и есливам нужно SparkContext это должно быть через spark.sparkContext, а не как отдельное значение.

Так что теперь я использую следующее (и стер любые следы conf, sc и т. д. из моего кода)...

val spark = SparkSession.builder.appName("myApp").getOrCreate()

Мой вопрос : где я могу зарегистрировать классы в Kryo, если я не использую SparkConf или SparkContext напрямую?

Iсм. spark.kryo.classesToRegister здесь: https://spark.apache.org/docs/2.3.1/configuration.html#compression-and-serialization

У меня достаточно обширный conf.json для установки spark-defaults.conf, но я хочу сделать его обобщенным для всех приложений, поэтому я не хочу регистрировать классы здесь.

Когда я смотрю здесь: https://spark.apache.org/docs/2.3.1/api/scala/index.html#org.apache.spark.sql.SparkSession

Это заставляет меня думать, что я могу сделать что-то вроде следующего, чтобы увеличить мой spark-defaults.conf:

val spark = 
  SparkSession
    .builder
    .appName("myApp")
    .config("spark.kryo.classesToRegister", "???")
    .getOrCreate()

Но что такое??? если я хочу зарегистрироваться org.myorg.myapp.{MyClass1, MyClass2, MyClass3}?Я не могу найти пример такого использования.

Будет ли это:

.config("spark.kryo.classesToRegister", "MyClass1,MyClass2,MyClass3")

или

.config("spark.kryo.classesToRegister", "class org.myorg.mapp.MyClass1,class org.myorg.mapp.MyClass2,class org.myorg.mapp.MyClass3")

или что-то еще?

EDIT

, когда я пытаюсь протестировать различные форматы в spark-shell через spark.conf.set("spark.kryo.classesToRegister", "any,any2,any3"), я никогда не получаю никаких сообщений об ошибках, независимо от того, что я помещаю в строку any,any2,any3.

Я пытался создать any каждый из следующих форматов

  • "org.myorg.myapp.myclass"
  • "myclass"
  • "class org.myorg.myapp.myclass"

Я не могу сказать, успешно ли что-либо из них зарегистрировано.

1 Ответ

0 голосов
/ 29 сентября 2018

Пробовали ли вы следующее, оно должно работать, поскольку оно фактически является частью SparkConf API, и я думаю, что единственное, чего не хватает, так это того, что вам просто нужно подключить его к SparkSession:

  private lazy val sparkConf = new SparkConf()
    .setAppName("spark_basic_rdd").setMaster("local[*]").registerKryoClasses(...)
  private lazy val sparkSession = SparkSession.builder()
    .config(sparkConf).getOrCreate()

А если вам нужен Spark Context, вы можете позвонить: private lazy val sparkContext: SparkContext = sparkSession.sparkContext

...