Как работает сериализация Spark для тематических классов? - PullRequest
0 голосов
/ 09 октября 2018

Я столкнулся с чем-то странным в Spark 2.2 и как он десериализует классы дел.Для этих примеров предположим, что этот класс дел:

case class X(a:Int, b:Int) {
  println("in the constructor!!!")
}

Если у меня есть следующая операция сопоставления, я вижу и мой конструктор, и значение сообщений 'a' в журналах исполнителя.

ds.map(x => {
  val x = X(1, 2)
  println(s"a=${x.a})
}

При следующей операции сопоставления я не вижу своего сообщения конструктора, но я вижу значение сообщения 'a' в журналах исполнителя.Сообщение конструктора находится в журналах драйверов.

val x = X(1, 2)
ds.map(x => println(s"a=${x.a}"))

И я получаю то же поведение, если использую широковещательную переменную.

val xBcast = sc.broadcast(X(1, 2))
ds.map(x => println(s"a=${xBcast.value.a}"))

Есть идеи, что происходит?Spark сериализует каждое поле по мере необходимости?Я ожидал, что весь объект будет отправлен и десериализован.С этой десериализацией я бы ожидал вызова конструктора.

Когда я посмотрел код кодера для Products, похоже, он получает необходимые поля от конструктора.Я предполагаю, что предполагал, что он будет использовать эти кодировщики для такого рода вещей.

Я даже декомпилировал файл класса моего case-класса, и сгенерированный конструктор кажется разумным.

1 Ответ

0 голосов
/ 09 октября 2018

Spark использует сериализацию Java (доступно, потому что классы дел расширяются Serializable) по умолчанию, что не требует использования конструктора для десериализации.См. этот вопрос StackOverflow для получения подробных сведений о сериализации / десериализации Java .

Обратите внимание, что эта зависимость от сериализации Java может вызвать проблемы, поскольку внутренний формат сериализации не задуман, поэтому различия в версиях JVM могутпривести к неудачной десериализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...