Apache Sedona: как ускорить джойн геоданных в Spark в 4 раза
Когда речь заходит о джойне датафреймов с геоданными, многие инженеры сталкиваются с серьезными проблемами производительности. Особенно остро это ощущается при работе с миллиардами записей, когда каждая минута экономии имеет значение. Инженеры МТС Web Services нашли решение, которое позволило сократ

Когда речь заходит о джойне датафреймов с геоданными, многие инженеры сталкиваются с серьезными проблемами производительности. Особенно остро это ощущается при работе с миллиардами записей, когда каждая минута экономии имеет значение. Инженеры МТС Web Services нашли решение, которое позволило сократить время выполнения такой операции в четыре раза, используя Apache Sedona. В этой статье мы подробно разберем, как им это удалось, какие технические детали и настройки сыграли ключевую роль, и как вы можете применить этот опыт в своих проектах.
Проблема: обогащение витрины геособытий
Павел Молчанов, Data Engineer из группы обработки гео- и медиаданных Big Data компании МТС Web Services, поделился опытом на конференции Highload++. Его команда работает над продуктом «ГеоЭффект», который рассчитывает геостатистику на основе телеком-данных, например, по туризму. Ежедневно инфраструктурная команда обновляет витрину-источник с событиями — точками нахождения абонентов мобильной сети по всем регионам присутствия МТС. На каждого абонента приходится около 200 геособытий в день, а общий объем витрины достигает 11 миллиардов записей в сутки.
Проблема заключалась в том, что в витрине отсутствовала привязка геособытий к административно-территориальной информации «Регион РФ / район». Для продуктовой команды это было критично, так как заказчики требовали именно такие данные. Задача состояла в том, чтобы дообогатить витрину дополнительными атрибутами на основе координат геособытий. Технологический стек команды — Spark на Hadoop-кластере с HDFS и Hive Metastore, хотя уже ведутся подготовительные работы по переходу на Data LakeHouse. Повествование ведется в контексте технологий Spark on YARN + Sedona + HDFS + Hive.
Почему традиционные подходы не работают
Традиционный подход к джойну геоданных в Spark предполагает использование broadcast-переменных или декартова произведения с последующей фильтрацией. Однако при объемах в миллиарды записей такие методы становятся крайне неэффективными. Команда МТС Web Services рассматривала несколько альтернатив, включая самостоятельную реализацию пространственного индекса, но остановилась на Apache Sedona — библиотеке, которая предоставляет распределенные пространственные операции для Spark.
Apache Sedona (ранее известная как GeoSpark) — это кластерная система для обработки пространственных данных, которая поддерживает пространственные RDD и DataFrame API. Она включает в себя пространственные индексы, такие как R-tree и Quad-Tree, что позволяет существенно ускорить пространственные джойны. Для команды это был естественный выбор, так как библиотека интегрируется с Spark и не требует значительных изменений в существующем коде.
До внедрения Sedona команда использовала подход с broadcast-переменными, который работал только для небольших справочников. Но когда речь зашла о миллиардах записей, стало ясно, что нужен более масштабируемый подход. Sedona позволила выполнять пространственные джойны на кластере без необходимости загружать все данные в память драйвера.
Как работает пространственный джойн в Apache Sedona
Apache Sedona использует пространственные индексы для ускорения операций. Вместо того чтобы перебирать все пары точек и полигонов, Sedona строит индекс на одном из датафреймов и затем выполняет точечный поиск. Это снижает вычислительную сложность с O(NM) до O(Nlog(M)), где N — количество точек, а M — количество полигонов.
В случае МТС Web Services, команда использовала функцию STContains для определения, попадает ли точка в полигон. Sedona автоматически строит пространственный индекс на полигонах, что значительно ускоряет операцию. Однако важно правильно настроить параметры, такие как количество партиций и размер воркеров, чтобы достичь оптимальной производительности.
Павел Молчанов отметил, что ключевым фактором ускорения стало использование broadcast-переменной для справочника полигонов, так как он относительно небольшой — около 100 тысяч записей. Sedona позволяет использовать broadcast-индекс, который сериализуется и рассылается по воркерам, что исключает необходимость в shuffle на этапе джойна.
Какие настройки Spark и Sedona дали ускорение в 4 раза
Команда МТС Web Services провела серию экспериментов, чтобы найти оптимальные настройки. Первоначально джойн выполнялся за 5 часов, но после настройки Spark-конфигурации и использования Sedona удалось сократить время до 1 часа 20 минут. Это ускорение в 4 раза было достигнуто за счет нескольких факторов.
Во-первых, была правильно настроена сериализация — использовался KryoSerializer, который работает быстрее стандартного Java-сериализатора. Во-вторых, были оптимизированы партиции: команда увеличила количество партиций до 2000, чтобы лучше распределить нагрузку по кластеру. В-третьих, был использован broadcast-индекс для полигонов, что позволило избежать shuffle.
Кроме того, команда использовала функцию STGeomFromWKT для преобразования координат в геометрические объекты, что позволило Sedona корректно обрабатывать данные. Важно было также правильно задать систему координат — использовалась EPSG:4326, которая является стандартной для GPS-координат.
Какие еще факторы влияют на производительность пространственного джойна?
Помимо перечисленных настроек, на производительность влияют такие аспекты, как выбор типа индекса (R-tree или Quad-Tree), настройка количества исполнителей и памяти, а также формат хранения данных (например, Parquet с сортировкой по геохэшу). В случае МТС Web Services, использование broadcast-индекса оказалось решающим, но для других сценариев может потребоваться более сложная настройка.
Также стоит учитывать, что Sedona требует корректного определения геометрии: точки должны быть представлены как Point, а полигоны — как Polygon. Неправильное преобразование может привести к ошибкам или снижению производительности. Команда МТС Web Services использовала WKT (Well-Known Text) для описания геометрий, что является стандартом в геоинформационных системах.
Кому будет полезен этот опыт
Опыт МТС Web Services будет полезен всем, кто работает с геоданными в Spark: аналитикам, Data Engineer-ам, разработчикам геоинформационных систем. Если вы сталкиваетесь с задачей обогащения больших объемов геоданных, Apache Sedona может стать вашим инструментом. Особенно актуально это для телеком-компаний, ритейла, логистики и других отраслей, где требуется анализировать перемещения клиентов и объектов.
Для российского рынка это особенно важно, так как многие компании сталкиваются с необходимостью обработки геоданных в масштабах страны. Решение МТС Web Services показывает, что даже с использованием opensource-инструментов можно добиться высокой производительности без покупки дорогостоящего коммерческого ПО.
Перспективы развития
Команда МТС Web Services планирует продолжать оптимизацию своих пайплайнов и, вероятно, перейдет на Data LakeHouse в ближайшем будущем. Apache Sedona продолжает развиваться, и можно ожидать улучшения производительности и новых функций. Также стоит отметить, что Sedona поддерживает не только Spark, но и другие фреймворки, такие как Flink, что расширяет возможности ее применения.
Итог
Использование Apache Sedona позволило МТС Web Services значительно ускорить обработку геоданных, сократив время джойна с 5 часов до 1 часа 20 минут. Это наглядный пример того, как правильно подобранные инструменты и настройки могут решить сложные задачи Big Data. Если вы работаете с геоданными в Spark, стоит присмотреться к Sedona — она может стать вашим ключом к скорости.