Kryo помогает повысить производительность приложений Spark за счет эффективного подхода к сериализации.
Мне интересно, поможет ли Kryo в случае SparkSQL и как мне его использовать.
В приложениях SparkSQL мы будем выполнять множество операций на основе столбцов, таких как df.select($"c1", $"c2"), а схема DataFrame Row не совсем статична.
Не знаю, как зарегистрировать один или несколько классов сериализатора для варианта использования.

Например:

case class Info(name: String, address: String)
...
val df = spark.sparkContext.textFile(args(0))
         .map(_.split(','))
         .filter(_.length >= 2)
         .map {e => Info(e(0), e(1))}
         .toDF
df.select($"name") ... // followed by subsequent analysis
df.select($"address") ... // followed by subsequent analysis

Не думаю, что стоит определять классы case для каждого select.
Или мне поможет, если я зарегистрирую Info как registerKryoClasses(Array(classOf[Info]))

6
user6502167 14 Мар 2018 в 09:15

2 ответа

Лучший ответ

Согласно документации Spark, SparkSQL не использует сериализации Kryo или Java.

Наборы данных похожи на RDD, однако вместо использования сериализации Java или Kryo они используют специализированный кодировщик для сериализации объектов для обработки или передачи по сети. В то время как кодировщики и стандартная сериализация отвечают за преобразование объекта в байты, кодировщики представляют собой код, генерируемый динамически и использующий формат, который позволяет Spark выполнять многие операции, такие как фильтрация, сортировка и хеширование, без десериализации байтов обратно в объект.

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

При этом есть способ использовать Kryo в качестве реализации кодировщика, см., Например, здесь: Как хранить пользовательские объекты в наборе данных?. Но это предназначено как решение для хранения пользовательских объектов (например, не классов продуктов) в наборе данных, а не специально нацелено на стандартные фреймы данных.

Без сериализаторов Kryo of Java создание кодировщиков для пользовательских классов, не относящихся к продуктам, несколько ограничено (см. Обсуждения определяемых пользователем типов), например, начиная с здесь: Поддерживает ли Apache Spark 2.2 определяемый пользователем тип (UDT)?

8
GPI 27 Май 2020 в 13:57

Вы можете установить для сериализатора значение kryo, установив для свойства spark.serializer значение org.apache.spark.serializer.KryoSerializer либо на SparkConf, либо в файле настраиваемых свойств, который вы передаете команде spark-submit с помощью < strong> - флаг файла свойств .

Когда вы настраиваете сериализатор Kryo, Spark будет прозрачно использовать Kryo при передаче данных между узлами. Итак, операторы Spark SQL должны автоматически наследовать преимущество в производительности.

0
ilooner 14 Мар 2018 в 06:29