Рубрика:
Разработка /
Машинное обучение
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
АЛЕКСАНДР КАЛЕНДАРЕВ, ведущий программист AD-1, akalend@mail.ru
Добавляем в веб-проект аналитику и интеллект на базе Apache Spark
Можно сказать, что наступает век интеллектуального интернета, где каждое веб-приложение имеет интеллектуальный блок принятия решений (ИБПР). В данной статье мы рассмотрим ИБПР на базе Apache Spark
Просто о сложном
В современном информационном пространстве важную роль играют системы принятия решений (СПР), что повышает конкуренцию веб-проектов. Это и рекомендательные системы, основанные на оценках пользователя, таких проектах, как Netfix, Яндекс.Музыка, Кинопоиск. Это системы оценки платежеспособности заемщика. Такие проекты есть в любом банке. Это рекомендательные системы продвижения и сбыта товаров, секции: «С этим товаром также покупают...», «Мы вам рекомендуем обратить внимание на...». Это разного рода рекламные системы, которые стремятся показать баннеры и ролики соответствующей целевой аудитории. Основную роль в интеллектуальных СПР играет машинное обучение.
Рассмотрим основные алгоритмы, используемые в машинном обучении:
- кластеризация;
- категоризация;
- коллаборативная фильтрация.
Чтоб определить группы пользователей, применяется кластеризация. Это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны быть объекты со сходными показателями (фактор).
Например, мы хотим иметь данные о скачивании музыки двух жанров: рок и шансон. Представим эти данные в виде графика. По оси Х будем откладывать количество скачиваний шансона, а по Y – рока.
На рис. 1 можно выделить два ярко выраженных кластера, которые отмечены красным: «Группа любителей рока» и «Группа любителей шансона». Когда появляется новая мелодия из категории джаз, то ее можно рекомендовать пользователям, которые входят в первый кластер, и шансон – во втором. Далее идет второй шаг.
Рисунок 1. Кластеризация
Категоризация – структурирование схожих по темам документов, формирование обобщающих, классифицирующих категорий таким образом, чтобы объединить документы в группы, и создание модели, которую можно будет применять для классификации новых документов на основании рассчитанных ранее статистических параметров. В нашем случае это присваивание каждой мелодии определенной категории (экспертная оценка). Для музыки это немного сложнее, хотя можно выделить определенные категории путем спектрального и амплитудно-частотного анализа. Для текстового контента все намного проще, выделение категорий происходит по частоте встречаемости и взаимному расположению определенных слов.
В информационном пространстве важную роль играют системы принятия решений, что повышает конкуренцию веб-проектов |
Также используется метод коллаборативной фильтрации. Это метод построения прогнозов (рекомендаций), использующий известные предпочтения (оценки) группы пользователей для прогнозирования неизвестных предпочтений другого пользователя.
Информация группы пользователей, такая как рейтинги, оценки, клики, покупки, применяется для предоставления рекомендаций другим, схожим по предпочтениям пользователям сайта.
Работа с большим объемом данных предполагает распараллеливание их обработки и склейки результатов. Такой механизм был придуман в Googlе и реализован в рамках проекта Apache Hadoop, который в сочетании с распределенной файловой системой и распределенными хранилищами часто облегчает решение задач параллелизации, предоставляя программистам определенный API.
Коротко об Apache Spark
Обработкой блоков информации осуществляется Apache Spark. Spark – это открытый проект группы Apache, который был реализован в 2014 году. Он позиционируется как инструмент для быстрых кластерных вычислений. В настоящее время проект является наиболее активным из проектов Apache. Он может работать как под управлением кластера (Hadoop YARN или Apache Mesos), так и самостоятельно (локально), т.е. вести обработку данных в пределах одного сервера.
Apache Spark реализован на Scala (v 2.10) и требует VM Java не ниже 1.8. Проще всего запустить готовый docker-контейнер (hub.docker.io) с уже настроенным Apache Spark. Инсталляция и настройка хорошо описаны в «Руководстве пользователя» [1]. Необходимо выставить переменные окружения: JAVA_HOME, SCALA_HOME, SPARK_HOME, добавить в переменную окружения PATH путь до $SPARK_HOME/bin и для интерактивной запустить spark-shell (см. рис. 2). Для запуска интерактивной оболочки на питоне используйте:
bin/pyspar
Рисунок 2. Запуск Spark-shell
Можно запустить spark-монитор:
spark-class org.apache.spark.deploy.master.Master
Если посмотреть браузером http://localhost:8080, то увидим такую картинку (см. рис. 3).
Рисунок 3. Мониторинг
Spark API поддерживает только три языка: Scala, Java и Python. И еще для исследовательских целей можно использовать R, который тоже поддерживает Spark.
Так как Spark реализован на Scala, то лучше его и использовать. Но в нашем мире много Java-программистов, и очень мало кто пишет на Scala. А натыкаться на грабли не очень-то и хочется. Так как сам Scala использует JVM, то Java-классы прекрасно интегрируются в Spark. Oб обработчиках, реализованных на Python (Jython), такого не скажешь, так как есть некоторые, не совсем совместимые, классы, при использовании которых будет потеря в производительности.
Spark изнутри
В основу Spark легла реализация RDD (Resilient Distributed Dataset), переводится как множество распределенно-гибких данных. По сути, это распределенное множество данных в памяти, но удобнее всего его представить как таблицу. RDD при необходимости можно сериализовать и временно сохранить на диск. Также RDD могут быть разбиты на партиции – это минимальный объем RDD, который будет обработан каждым рабочим узлом распределенной системы.
Все операции делятся на две группы: преобразования (transformations) и действия (actions). Каждое преобразование принимает на вход RDD, производит на нем некоторые вычисления и передает далее снова RDD. Заключающим оператором всегда должно быть действие. Оно уже преобразует полученное RDD в окончательный результат: в виде текстового файла, числа, строки, сериализованных данных, записанных в БД или очередь. Каждая программа в Spark всегда должна заканчиваться действием.
Тут необходимо учесть очень важное замечание, что сама программа начинает выполняться с действия, т.е. если мы работаем с большими объемами данных, то на момент выполнения action наши данные (RDD) должны быть такого размера, чтоб не было переполнения памяти.
Классический пример из документации (подсчет слов):
val textFile = sc.textFile("/home/data/in.txt")
val counts = textFile.flatMap(line => line.split(" "))
.map(word => (word, 1))
.reduceByKey(_ + _)
counts.saveAsTextFile("/home/data/out.txt")
В данном примере метод saveAsTextFile() – это действие, все остальные методы являются преобразованиями.
В состав Spark входит (см. рис. 4):
- SparkSQL – это возможность осуществлять преобразования на RDD с помощью стандартных SQL-запросов.
- Spark MLlib – это библиотека машинного обучения. В ней сосредоточенно почти все из того, о чем шла речь в самом начале статьи. Далее мы более полно рассмотрим ее возможности.
- Spark Streaming – это возможность обработки данных в потоковом режиме (режим реального времени) (см. рис. 5). Я бы назвал это основным достоинством Spark. Именно благодаря библиотеке Spark Streaming его можно использовать в online-режиме. Spark Streaming подхватывает данные из разных источников, передает их на обработку и по окончании передает поток данных далее. С помощью Spark Streaming можно решать задачи определения спама в соцсетях, осуществлять оптимальные рекламные предложения, определение разных подделок.
- GraphX – библиотека вычислений на графах. Некоторые модели можно представить в виде графов. С этими графами можно осуществлять трансформации и, используя дерево графов, принимать необходимые решения. Также пакет включает библиотеку распределенных алгоритмов для работы с графами.
Рисунок 4. Состав Spark
Рисунок 5. Spark Streaming
Немного о MLlib
MLlib – это основная библиотека Spark, содержащая множество процедур, которые подходят для задач обработки данных, построения модели и по ней принятия решения:
- классификация (org.apache.spark.mllib.classification)
- регрессия (org.apache.spark.mllib.regression)
- кластеризация (org.apache.spark.mllib.clustering)
- тематическое моделирование (org.apache.spark.mllib.tree.model)
- сингулярное разложение (org.apache.spark.mllib.linalg.SingularValueDecomposition) и анализ по методу главных компонент (org.apache.spark.mllib.linalg.distributed.RowMatrix);
- проверка гипотез и статистической выборки (org.apache.spark.mllib.stat)
Конечно, в рамки одной статьи не сможет уложиться такой обширный материал, предлагаю просмотреть следующие ресурсы [2-5].
Как это работает в реальных проектах
На рис. 6 изображена принципиальная схема работы в веб-проектах.
Рисунок 6. Принципиальная архитектура использования Spark
Проект можно разделить на две отдельные части: оnline-обработка и оffline-обработка. оffline-обработка происходит, как правило, раз в сутки, где на основании суточных и предыдущих данных строится статистическая или поведенческая модель. Online-часть – это быстрое определение по действиям пользователя его принадлежности к той или иной модели, и на основании этого производится решение о предоставлении ему той или иной услуги. Это может быть показ рекламного баннера, слота с информацией о похожем или сопутствующем товаре, предложение о приобретении кредитной карты. Все системы между собой очень похожи, отличие может быть лишь в использованных технологиях, например в качестве очереди может использоваться Apache Kafka или RabbitMQ, в качестве кэша для хранения сессий может использоваться Redis, Memcache. Для хранения данных может использоваться PgSQL или MySQL, Hbase или Cassandra, а в одном проекте, я знаю, используют ClickHouse (Open Source-разработка от Yandex) как быстрое масштабируемое хранилище для не реляционных данных.
Естественно, у каждого проекта свои особенности, и нет «серебряной пули». На рис. 6 представлена лишь обобщенная схема, обкатанная на одном из проектов. У вас может получиться другая схема. Если тема понравилась, пишите и присылайте пожелания и вопросы в редакцию или лично мне. В следующих статьях я смогу осветить более полно ту или иную часть этой обширной темы. Если у вас есть опыт в этой области, поделитесь им, попробуйте себя в качестве автора.
- Programming guidy. Официальная документация – https://spark.apache.org/docs/2.2.0/rdd-programming-guide.html.
- Сэнди Риза, Ури Лизерсон, Шон Оуэн, Джош Уиллс. Spark для профессионалов: современные паттерны обработки больших данных. O’Reilly. 2015/ пер. изд-во «Питер».
- Nick Pentreath.Machine Learning with Spark. Packt Publishing. 2015.
- Holden Karau, Andy Konwinski, Patrick Wendell, and Matei Zaharia. Learning Spark. O’Reilly. 2015.
- Big Data Now. O’Reilly Media. Edition 2015.
Ключевые слова: spark, mashine learning, apache.
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|