Содержание
Знакомство со средствами работы с большими данными в Spark
Мотивировка
Стоимость индустрии т.н. «больших данных» к 2020 году составит примерно 200 миллиардов долларов, показывая рост в 10-15% в год [ 1, 2 ]. Готовность бизнеса инвестировать в «большие данные» объясняется частично эффектом ажиотажа, но также частично способностью аналитических техник решать конкретные задачи, дающие преимущество перед другими компаниями на рынке. В силу объемов данных, такие задачи не могут быть решены мощностями персональных компьютеров. Естественным обходом этого ограничения является исполнение алгоритмов на кластере – совокупности узлов, выполняющих параллельные вычисления.
Одной системой управления кластерами является Apache Spark [ 3 ]. Spark относительно молодой, но уже достаточно зрелый фреймворк (первый релиз состоялся в 2014 году), идеологически являющийся наследником Apache Hadoop и парадигмы MapReduce [ 4 ]. Его основное преимущество – скорость, в чем он опережает Hadoop на 2 порядка в некоторых задачах [ 3 ], а также гибкая архитектура, делающая Spark отличным выбором для реализации алгоритмов машинного обучения.
Линейная регрессия представляет собой классический метод анализа данных. Простота модели делает возможным её интерпретацию, что особенно востребовано в задачах, где нужно объяснить структуру данных и взаимодействие разных переменных («признаков»). Например, линейную регрессию любят аналитические отделы банков. Оценка параметров линейной регрессии может быть осуществлена разными способами, в т.ч. алгоритмом градиентного спуска, каковой алгоритм (и/или его модификации) применяется повсеместно и вне контекста линейной регрессии.
Предлагаемое задание является вполне реальным примером того, что могут попросить реализовать при трудоустройстве в крупную технологическую компанию ;)
Задание
Оценить параметры линейной регрессии для миллиона точек, используя фреймворк для распределенных вычислений Spark.
Баллы
2 курс – 50 баллов, 1 курс – 100 баллов.
Необходимые навыки и подготовка
- Способность читать большие объемы текстов на техническом английском. Можно открыть эту страничку и проверить, насколько её чтение дается комфортно.
- Умение программировать на Python и/или Java и/или Scala. Выбор Java и/или Scala менее предпочтителен, т.к. руководитель толком их не знает, и в случае возникновения затруднений языкового характера, студенту придется разбираться самостоятельно.
- Знание Linux и TCP/IP на базовом уровне: понимать, что означает hdfs://0.0.0.0:8020, уметь редактировать файлы конфигурации и запускать программы и т.п.
Математическая часть задания относительно простая. Детали реализации могут быть чуть более сложные. При любых затруднениях, да и просто так, можно обращаться за помощью к руководителю за напутственной подсказкой.
Часть 1
- Познакомиться с линейной регрессией и методом градиентого спуска по конспекту.
- Запрограммировать простейшую реализацию (в batch варианте) и продемострировать работоспособность прототипа на синтетических данных.
- В качестве демонстрации предъявить оценку коэффициентов в сравнении с оригинальными коэффициентов, по которым сгенерированы синтетические данные. Также здорово будет показать график функции ошибки.
Замечания
- Синтетические данные либо сделать самостоятельно (задать уравнение гиперплоскости в R^d и посчитать значения на сетке в R^{d-1}, после чего зашумить), либо попросить у руководителя.
Часть 2
- Разобраться с общей идеей реализации параллельной версии алгоритма по презентации.
- Запрограммировать параллельную реализацию градиентого спуска под кластерный движок Spark.
- Продемострировать вертикальную и горизонтальную масштабируемость (или отсутствие их и объяснить причину) на синтетических данных. Сравнить скорость выполнения с первоначальным прототипом.
Замечания
- Spark лучше всего скачать непосредственно с сайта проекта. Там же находится раздел с документацией, с которой придется ознакомиться.
- Вкратце, нужно настроить по крайней мере два вычислительных узла (ноды): master и slave. Master нода координирует вычисления, slave – непосредственно считатет [ cluster-overview ] Проще всего поднять Spark в режиме Standalone Deploy [ spark-standalone ].
- Однако полноценный кластер получится только если поднять минимум две slave ноды на двух разных системах. Можно поэкспериментировать с виртуальными машинами, но проще будет сделать это на двух физических компьютерах. Их нужно будет поместить в одну сеть и, дополнительно, настроить распределенную файловую систему HDFS.
- Первоначальная реализация градиентного спуска должна быть модифицирована для запуска на кластере, см. [ rdd-programming-guide, submitting-applications, pyspark ].
Удачи!
Руководитель
Зотиков Дмитрий