Реализация DBSCAN в распределенной системе

У меня проблема с большими данными, и у меня очень ограниченный опыт параллельной обработки и больших данных. У меня есть сотни миллионов строк, состоящих из данных широты и долготы и нескольких идентификаторов. Для каждого идентификатора у меня могут быть данные в диапазоне от 10000 до 10 миллионов.

Я реализую алгоритм кластеризации на основе плотности (DBSCAN) для решения некоторых бизнес-требований. Алгоритм кластеризации выполняется независимо для каждого идентификатора.

Текущая реализация

Текущая реализация основана на коде Python с использованием библиотеки машинного обучения sklearn, но для выполнения (кластеризация + другая бизнес-логика) требуется день или больше (кластеризация + другая бизнес-логика) для примерно 50 миллионов точек данных.

Я могу оптимизировать код Python и сократить время, но я ищу более подходящее решение.

Доступность

У меня есть искровой кластер, распределенный по примерно 20 машинам, но в pyspark нет реализации DBSCAN. После некоторого поиска я мог найти некоторые реализации scala, но они кажутся менее надежными. URL-адреса из моего поиска. https://github.com/irvingc/dbscan-on-spark

DBSCAN на spark: какая реализация

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

Как я уже упоминал, алгоритм кластеризации работает независимо для каждого устройства. Один из способов сократить время — распределить вычисление каждого идентификатора параллельно на все 20 машин. Так что я мог бы получить как минимум в 20 раз лучшую производительность. Но я понятия не имею, как этого добиться. Все, о чем я могу думать, это MapReduce.

Я открыт для любого более надежного решения. Любая помощь будет принята с благодарностью.


person Sam    schedule 20.09.2017    source источник


Ответы (2)


Накладные расходы pySpark не пренебрежимо малы из-за сериализации. Если вы хотите работать очень быстро, используйте как можно меньше слоев, чтобы уменьшить накладные расходы.

Я бы просто разделил данные на нужные разделы, а затем обработал их независимо на отдельных узлах, используя самый быстрый DBSCAN, который вы можете найти (тест! Обязательно включите индексирование данных и проверьте результат на правильность. Сообщается об одной из версий Spark получить неверный результат). Недавно был опубликован сравнительный отчет, в котором наблюдалась 1000-кратная разница во времени выполнения для реализаций DBSCAN. Так что еще один DBSCAN может иметь значение.

person Has QUIT--Anony-Mousse    schedule 23.09.2017

Вы можете попробовать этот пример https://github.com/bwoneill/pypardis на pyspark и scikit-learn. . Я пробовал локально. Расчет 75 000 точек занял почти 1,5 часа. Но, может быть, в кластере это будет быстрее.

person Valeriy K.    schedule 26.02.2018