company_banner

Твоя Data такая большая: Введение в Spark на Java

    Apache Spark – универсальный инструмент для процессинга больших данных, с которым можно писать в Hadoop с различных СУБД, стримить всякие источники в реальном времени, параллельно делать с данными какую-нибудь сложную обработку, и все это не при помощи каких-то батчей, скриптов и SQL-запросов, а при помощи функционального подхода.


    Про Spark ходит несколько мифов:

    • Spark’y нужен Hadoop: не нужен!
    • Spark’у нужна Scala: не обязательно!

    Почему? Смотрите под катом.

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

    Миф 1. Spark не работает без Hadoop


    Что такое Hadoop? Грубо говоря, это распределенная файловая система, хранилище данных с набором API для процессинга этих самых данных. И, как ни странно, будет правильнее сказать что Hadoop нуждается в Spark, а не наоборот!

    Дело в том, что стандартный инструментарий Hadoop’а не позволяет процессить имеющиеся данные с высокой скоростью, а Spark – позволяет. И вот вопрос, нужен ли Spark’у Hadoop? Давайте посмотрим на то, что такое Spark:



    Как видите, здесь нет Hadoop’a: есть API, есть SQL, есть стриминг и многое другое. А Hadoop не обязателен. А Cluster manager, спросите вы? Кто будет запускать ваш Spark на кластер? Александр Сергеевич? Вот именно из этого вопроса и растут ноги у нашего мифа: чаще всего для распределения job’ов Спарка по кластеру используется YARN под Hadoop, однако есть и альтернативы: Apache Mesos, например, который вы можете использовать, если по какой-то причине не любите Hadoop.

    Миф 2. Spark написан на Scala, значит под него тоже надо писать на Scala


    Со Spark можно работать и под Java, и под Scala, при этом второй вариант многими считается лучшим по нескольким причинам:

    • Scala это круто!
    • Более лакончиный и удобный синтаксис.
    • Spark API заточен под Scala, и выходит он раньше, чем Java API;

    Давайте по порядку, начнем с первого тезиса о крутости и модности Scala. Контрагрумент прост и умещается в одну строку: Вы может быть удивитесь, но большинство Java-разработчиков… знают Java! И это много стоит – команда сеньоров, переходя на скала превращаются в StackOverflow-Driven джуниоров!



    Синтаксис отдельная история – если почитать любой холивар Java vs. Scala, вы встретите примерно вот такие примеры (как вы видите, код просто суммирует длины строк):

    Scala
    val lines = sc.textFile("data.txt") 
    val lineLengths = lines.map(_.length) 
    val totalLength = lineLengths.reduce(_+_) 
    

    Java
    JavaRDD<String> lines = sc.textFile ("data.txt"); 
    JavaRDD<Integer> lineLengths = lines.map (new Function() { 
        @Override 
        public Integer call (String lines) throws Exception { 
            return lines.length (); 
        } 
    }); 
    
    Integer totalLength = lineLengths.reduce (new Function2() { 
        @Override 
        public Integer call(Integer a, Integer b) throws Exception {
             return a + b; 
        } 
    }); 
    

    Год назад даже в документации Spark примеры выглядели именно так. Однако давайте посмотрим на код на Java 8:

    Java 8
    JavaRDD<String> lines = sc.textFile ("data.txt"); 
    JavaRDD<Integer> lineLengths = lines.map (String::length); 
    int totalLength = lineLengths.reduce ((a, b) -> a + b);

    Выглядит вполне неплохо, не так ли? В любом случае, нужно понимать еще и то, что Java это знакомый нам мир: Spring, дизайн паттерны, концепции и многое другое. На Scala джависту придется столкнуться с совершенно иным миром и здесь стоит задуматься, готовы ли вы или ваш заказчик на такой риск.

    Все примеры взяты из доклада Евгения EvgenyBorisov Борисова о Spark, который прозвучал на JPoint 2016, став, кстати лучшим докладом конференции. Хотите продолжения: RDD, тестирования, примеров и live-кодинга? Смотрите видео:



    Больше Spark богам BigData

    А если после просмотра доклада Евгения вы пережили экзистенциальный катарсис, осознав, что со Spark’ом надо познакомиться плотнее, можно сделать это вживую вместе с Евгением уже через месяц:

    12-13 октября в Санкт-Петербурге состоится большой двухдневный тренинг «Welcome to Spark».

    Обсудим проблемы и решения, с которыми поначалу сталкиваются неопытные Spark-разработчики. Разберемся с синтаксисом и всякими хитростями, а главное посмотрим, как можно писать Spark на Java при помощи известных вам фрэймворков, инструментов и концепций, таких как Inversion of Control, design patterns, Spring framework, Maven/Gradle, Junit. Все они могут помочь сделать ваше Spark-приложение более элегантным, читабельным и привычным.

    Будет много заданий, live coding-а и в конечном итоге вы выйдете с этого тренинга с достаточными знаниями, чтобы начать самостоятельно работать на Spark-e в привычном мире Java.
    Подробную программу выкладывать сюда большого смысла нет, кто захочет, найдет на странице тренинга.

    ЕВГЕНИЙ БОРИСОВ
    Naya Technologies


    Евгений Борисов разрабатывает на Java с 2001 года и принял участие в большом количестве Enterprise-проектов. Пройдя путь от простого программиста до архитектора и устав от рутины, он вышел в свободные художники. Сегодня пишет и проводит курсы, семинары и мастер классы для различной аудитории: live-курсы по J2EE для офицеров израильской армии. Spring — по WebEx’у для румын, Hibernate через GoToMeeting для канадцев, Troubleshooting и Design Patterns для украинцев.

    P.S. Пользуясь случаем, поздравляю всех с днем программиста!
    JUG Ru Group
    241,40
    Конференции для программистов и сочувствующих. 18+
    Поделиться публикацией

    Комментарии 14

      0
      Минус за неуместную для хабра картинку.
      Чать не drive2, чтобы картинками сиськами и прочим дешевым трэшем завлекать.
        +1
        Окей, поправим!
        0

        А еще spark умеет в standalone кластер.
        Но я все равно не смог его поднять :(

          0
          А в чём проблема? Мне понадобилось самостоятельно указать только 4 параметра: SPARK_WORKER_MEMORY, SPARK_EXECUTOR_MEMORY, SPARK_DAEMON_MEMORY и SPARK_WORKER_CORES. Работников можно запускать вручную на локальных машинах, если через start_slaves.sh не получается, больше там вроде проблем и нет, разве что еще log4j настроить надо.
            0

            Собственно, даже spark-shell в режим консоли не входит.

              +1
              У spark-shell вроде есть зависимость от Scala, причем определенной версии, а у самого Spark есть зависимость от некоторых частей Hadoop (т.е. надо скачивать пакет с Pre-built for Hadoop 'version'). Я на разных машинах с разными ОС запускал, проблемы с запуском возникли разве что под Windows, там какую то либу от Hadoop надо отдельно скачивать.
          +9
          Уже некоторое время мучаю себя мыслью, что надо написать нормальную серию статей по спарку.
          Думал что ура, написали, теперь мучаться не надо.
          Придется все равно писать.
            +3
            У вас на картинке лого другого Spark'a (Spark — A micro web framework).
            Где можно найти сравнение производительности спарковского MLlib запущенного на одном компьютере с другими решениями для машинного обучения под java/scala?
              0
              В спешке убирал похабную картинку и не сообразил даже, что лого не то. Вроде сейчас лучше.
                0
                А можно (любопытно очень) ссылку на исходную картинку… ну в комментарии под спойлером для особо любопытных?
              0
              А возможно где-то код посмотреть, который получился в результате?
                +2
                На джаве неудобно. Если флоу rdd-бейзд. На котлине намного лучше, но пока плохо без деструктуризации в лямбдах. Так что пока скала без изощрений. А для датафреймов точно можно без скалы.
                  +1
                  Используем спарк уже более двух лет в серьёзных проектах.

                  Изначально пытались не заморачиваться скалой и пробовали писать на яве, но очень быстро до всех дошло что это мазохизм.
                  На скале наиболее оптимальный и читаемый код, прекрасная документация.
                  Писать спарк приложения на яве — это пустая трата времени.

                  Когда есть много легаси кода на питоне, то можно попытаться его встроить в PySpark, но это скорее временное решение.
                  В спарке сейчас более чем достаточно инструментария, поэтому все новые приложения пишем только на скале.

                  И ещё, spark без yarn — это только если у вас на кластере крутится одно приложение. Ни о каком серьёзном планировщике ресурсов речи при этом быть не может.
                    +1
                    Думал прочитать что-нить полезное, а в результате понял, что смысл этого — идите на двухдневный тренинг…

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое