Передача данных Spark между методами scala - Производительность - PullRequest
0 голосов
/ 10 сентября 2018

Недавно я разработал приложение Spark Streaming с использованием Scala и Spark. В этом приложении я широко использовал Implicit Class (шаблон Pimp my Library) для реализации более общих утилит, таких как Запись Dataframe в HBase, путем создания неявного класса, расширяющего Dataframe Spark. Например,

implicit class DataFrameExtension(private val dataFrame: DataFrame) extends Serializable { ..... // Custom methods to perform some computations }

Однако старший архитектор из моей команды реорганизовал код (указав причину несоответствия стиля и производительности) и скопировал эти методы в новый класс. Теперь эти методы принимают Dataframe в качестве аргумента.

Может ли кто-нибудь помочь мне,

  1. Создает ли неявные классы Scala какие-либо издержки во время время выполнения?
  2. Создает ли перемещение объекта dataframe между методами какие-либо издержки с точки зрения вызовов методов или сериализации?
  3. Я немного искал, но не смог найти ни одного руководства по стилю, которое бы давало рекомендации по использованию неявных классов или методов над традиционными методами.

Заранее спасибо.

1 Ответ

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

Создает ли неявные классы Scala какие-либо издержки во время выполнения?

Не в вашем случае. * Неявные некоторые накладные расходы, когда неявным типом является AnyVal (таким образом, должен быть упакован). Последствия разрешаются во время компиляции, и, за исключением нескольких вызовов виртуальных методов, не должно быть никаких накладных расходов.

Создает ли перемещение объекта dataframe между методами какие-либо издержки с точки зрения вызовов методов или сериализации?

Нет, не более, чем любой другой тип. Очевидно, что сериализации не будет.

... если я передам фреймы данных между методами в коде Spark, это может создать замыкание и в результате приведет к родительскому классу, который содержит объект dataframe.

Только если вы используете переменные с областью видимости внутри вашего фрейма данных, например filter($"col" === myVar), где myVar объявлено в области действия метода. В этом случае Spark может сериализовать класс упаковки, но этого легко избежать. Помните, что кадры данных передаются довольно часто и довольно глубоко внутри кода Spark, и, вероятно, в любой другой библиотеке, которую вы можете использовать (например, источники данных).

Очень часто (и удобно) использовать неявные классы расширения, как вы.

...