Как разница между Scala и Java отражается на работе Spark-приложения, почему код на Scala работает быстрее и когда выбирать этот язык программирования для разработки приложений аналитики больших данных.
Scala vs Java: ключевые отличия
Хотя Apache Spark позволяет разработчику писать код на нескольких языках программирования (Scala, Java, R, Python), сам фреймворк написан на Scala и работает в JVM. Поэтому именно JVM-языки (Scala, Java) являются более эффективными из-за отсутствия трансляции Python-кода в Java-объекты. В частности, PySpark использует библиотеку Py4J для отправки и вычисления заданий, чтобы программа Python, работающая в интерпретаторе Python, динамически получала доступ к объектам Java в JVM. Методы вызываются так, как будто объекты Java находятся в интерпретаторе Python: к коллекциям Java можно получить доступ через стандартные методы коллекций Python. Py4J также позволяет программам Java вызывать объекты Python. Таким образом, Py4J помогает PySpark со стороны драйвера взаимодействовать с JVM. Поскольку Spark реализован на Scala, почти все данные, поступающие к исполнителю Python и обратно, должны проходить через сокет и исполнительную функцию JVM, что и обеспечивает библиотека Py4J. Это и отсутствие нативной многопоточности обусловливает более низкую скорость выполнения Python-кода в Spark по сравнению с Java или Scala,
Будучи представленным еще в 1995 году, объектно-ориентированный Java до сих пор является лидером среди языков программирования для бэкенда. Однако, он имеет свои недостатки, поэтому в 2003 году в ответ на критику Java появился Scala — высокоуровневый функциональный статически типизированный машинно-компилируемый язык программирования общего назначения. Программа на Scala компилируется в байт-код Java и запускается в JVM. Благодаря этому Scala обеспечивает совместимость с библиотеками Java, на которые можно напрямую ссылаться в коде.
Впрочем, несмотря на поддержку функционального программирования, идеи ООП тоже присутствуют в Scala: каждое значение рассматривается как объект, но все операции выполняются как функции. Таким образом, в Java функции — это объекты, а в Scala они являются переменными. Ни одна переменная не существует сама по себе.
Хотя сегодня в Java присутствуют возможности функционального программирования, Scala изначально создавался именно в этой парадигме. Поэтому в Scala поддерживает такие концепции функционального программирования, как неизменность (immutability), функции высшего порядка и отложенные вычисления. Java поддерживает обратную совместимость, а Scala — нет. В свою очередь, Scala поддерживает перегрузку операторов, а Java — нет.
Код на Scala считается лаконичнее аналога на Java, а меньшее количество строк кода означает более быструю разработку и доставку. В частности, задача, которая требует 20 строк на Java, на Scala займет всего 6, поскольку функциональная природа Scala позволяет естественно использовать лямбда-функции и цепочки, задействуя меньшее количество кода. Производительность Scala выше благодаря оптимизации с помощью хвостовой рекурсии (tail call recursion), которая выполняется на этапе компиляции. В этом подходе рекурсивный вызов, если он является последним выражением в методе, может быть опущен и заменен на итерационное решение.
Некоторые идеи и конструкции Scala-кода сложнее Java. Это повышает порог входа в технологию. Например, хотя большую часть синтаксиса и функций Scala позаимствовал у своего предшественника Java, в этом языке есть некоторые новые структуры, недоступные в Java: case-классы и автоматический вывод типа. Благодаря этому Scala можно использовать в качестве предметно-ориентированного языка (DSL), специфицировав для особенностей конкретного проекта.
Наконец, языки используют различные модели параллелизма. В частности, в Java 8 многопоточная модель, когда программа разбивается на несколько параллельно запущенных задач на стадии выполнения. В Scala используется модель акторов, которая позволяет определять каждый объект в качестве актора с определенным поведением и адресом, упрощая взаимодействие потоков и контроль за этим.
Разобравшись с отличиями Scala от Java, далее посмотрим, как эта разница отражается на эффективности Spark-приложения.
Преимущества Scala для разработки Spark-приложения
Итак, перечислим основные плюсы Scala как языка программирования для разработки Spark-приложений:
- скорость — поскольку Spark написан на Scala, можно использовать специализированные конструкции и структуры этого мощного языка программирования;
- новейшие функции — когда в Spark вводятся новые функции, они обычно реализованы именно на Scala, который является основным языком фреймворка;
- прототипирование — в Scala есть инструмент REPL (Read-Eval-Print-Loop), который позволяет интерактивно, поэтапно кодировать и отлаживать без необходимости писать и компилировать полную программу. Java не поддерживает REPL, что затрудняет процесс отладки кода;
- типобезопасность и контроль времени компиляции для операций со всеми структурами данных Spark, включая Dataset;
- по-настоящему отложенные вычисления. Хотя Spark как фреймворк изначально поддерживает концепцию отложенных вычислений, разделяя операции на преобразования и действия, о чем мы писали здесь и здесь, в Scala такая функция присутствует сама по себе. Явно используя ключевое слово lazy в коде программы, разработчик может отложить трудоемкие вычисления до тех пор, пока они не потребуются. В Java нет такой возможности.
В заключение еще раз отметим, что несмотря на перечисленные достоинства, Scala менее зрелый язык и он требует больше усилий для изучения, включая освоение функционального программирования и более сложных концепций, чем в Java. А владение инструментом является одним из ключевых факторов при выборе технологии. Пока популярность и распространенность Java существенно выше. Однако, эффективное использование возможностей Scala в качестве языка программирования может повысить производительность Spark-приложения, которое выполняет мощные аналитические нагрузки на огромных объемах данных.
Освойте возможности Apache Spark для разработки приложений аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
- Основы Apache Spark для разработчиков
- Потоковая обработка в Apache Spark
- Анализ данных с Apache Spark
- Машинное обучение в Apache Spark
- Графовые алгоритмы в Apache Spark
Источники