Помогает ли Kryo в SparkSQL?


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

Например:

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

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

2 3

2 ответа:

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

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

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

Недостатком является то, что на данный момент создание кодеров для пользовательских, непродуктовых классов несколько ограничено (см. обсуждение пользовательских типов), например, начиная здесь: поддерживает ли Apache spark 2.2 пользовательский тип (UDT)?

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

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