Помогает ли 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 ответа:
Согласно документации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 должны автоматически наследовать преимущество производительности.