Знакомство со средствами работы с большими данными в Spark

Мотивировка

Стоимость индустрии т.н. «больших данных» к 2020 году составит примерно 200 миллиардов долларов, показывая рост в 10-15% в год [ 1, 2 ]. Готовность бизнеса инвестировать в «большие данные» объясняется частично эффектом ажиотажа, но также частично способностью аналитических техник решать конкретные задачи, дающие преимущество перед другими компаниями на рынке. В силу объемов данных, такие задачи не могут быть решены мощностями персональных компьютеров. Естественным обходом этого ограничения является исполнение алгоритмов на кластере – совокупности узлов, выполняющих параллельные вычисления.

Одной системой управления кластерами является Apache Spark [ 3 ]. Spark относительно молодой, но уже достаточно зрелый фреймворк (первый релиз состоялся в 2014 году), идеологически являющийся наследником Apache Hadoop и парадигмы MapReduce [ 4 ]. Его основное преимущество – скорость, в чем он опережает Hadoop на 2 порядка в некоторых задачах [ 3 ], а также гибкая архитектура, делающая Spark отличным выбором для реализации алгоритмов машинного обучения.

Линейная регрессия представляет собой классический метод анализа данных. Простота модели делает возможным её интерпретацию, что особенно востребовано в задачах, где нужно объяснить структуру данных и взаимодействие разных переменных («признаков»). Например, линейную регрессию любят аналитические отделы банков. Оценка параметров линейной регрессии может быть осуществлена разными способами, в т.ч. алгоритмом градиентного спуска, каковой алгоритм (и/или его модификации) применяется повсеместно и вне контекста линейной регрессии.

Предлагаемое задание является вполне реальным примером того, что могут попросить реализовать при трудоустройстве в крупную технологическую компанию ;)

Задание

Оценить параметры линейной регрессии для миллиона точек, используя фреймворк для распределенных вычислений Spark.

Баллы

2 курс – 30 баллов, 1 курс – 60 баллов.

Необходимые навыки и подготовка

  • Способность читать большие объемы текстов на техническом английском. Можно открыть эту страничку и проверить, насколько её чтение дается комфортно.
  • Умение программировать на Python и/или Java и/или Scala. Выбор Java и/или Scala менее предпочтителен, т.к. руководитель толком их не знает, и в случае возникновения затруднений языкового характера, студенту придется разбираться самостоятельно.
  • Знание Linux и TCP/IP на базовом уровне: понимать, что означает hdfs://0.0.0.0:8020, уметь редактировать файлы конфигурации и запускать программы и т.п.

Математическая часть задания относительно простая. Детали реализации могут быть чуть более сложные. При любых затруднениях, да и просто так, можно обращаться за помощью к руководителю за напутственной подсказкой.

Часть 1

  1. Познакомиться с линейной регрессией и методом градиентого спуска по конспекту.
  2. Запрограммировать простейшую реализацию (в batch варианте) и продемострировать работоспособность прототипа на синтетических данных.
  3. В качестве демонстрации предъявить оценку коэффициентов в сравнении с оригинальными коэффициентов, по которым сгенерированы синтетические данные. Также здорово будет показать график функции ошибки.

Замечания

  • Синтетические данные либо сделать самостоятельно (задать уравнение гиперплоскости в R^d и посчитать значения на сетке в R^{d-1}, после чего зашумить), либо попросить у руководителя.

Часть 2

  1. Разобраться с общей идеей реализации параллельной версии алгоритма по презентации.
  2. Запрограммировать параллельную реализацию градиентого спуска под кластерный движок Spark.
  3. Продемострировать вертикальную и горизонтальную масштабируемость (или отсутствие их и объяснить причину) на синтетических данных. Сравнить скорость выполнения с первоначальным прототипом.

Замечания

  • Spark лучше всего скачать непосредственно с сайта проекта. Там же находится раздел с документацией, с которой придется ознакомиться.
  • Вкратце, нужно настроить по крайней мере два вычислительных узла (ноды): master и slave. Master нода координирует вычисления, slave – непосредственно считатет [ cluster-overview ] Проще всего поднять Spark в режиме Standalone Deploy [ spark-standalone ].
  • Однако полноценный кластер получится только если поднять минимум две slave ноды на двух разных системах. Можно поэкспериментировать с виртуальными машинами, но проще будет сделать это на двух физических компьютерах. Их нужно будет поместить в одну сеть и, дополнительно, настроить распределенную файловую систему HDFS.
  • Первоначальная реализация градиентного спуска должна быть модифицирована для запуска на кластере, см. [ rdd-programming-guide, submitting-applications, pyspark ].

Удачи!

Руководитель

Зотиков Дима xio@ungrund.org

research/prob_spark.txt · Последние изменения: 2018/09/04 00:10 — dzotikov
Наверх
CC Attribution-Noncommercial-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0