Существует много мифов и заблуждений о том, для чего R не подходит как инструмент анализа данных и разработки аналитических приложений. Согласно одному из таких заблуждений, в R сложно или даже невозможно работать с "большими данными". Это совершенно не так. В экосистеме R есть множество пакетов, позволяющих пользователям работать с удаленными базами данных и выполнять масштабируемые распределенные вычисления с помощью предназначенных для этого программных платформ, или фреймворков. Сегодня я начинаю новую серию статей, посвященную особенностям работы с одной из таких платформ - Apache Spark.

Большие данные

Согласно Википедии, "Большие данные (англ. big data) - обозначение структурированных и неструктурированных данных огромных объёмов и значительного многообразия, эффективно обрабатываемых горизонтально масштабируемыми программными инструментами, появившимися в конце 2000-х годов и альтернативных традиционным системам управления базами данных и решениям класса Business Intelligence". 

Для пояснения этого определения часто используют следующие четыре характеристики больших данных:
  • огромный физический объем;
  • большая скорость прироста объема, а также потребность в быстрой обработке данных и получении результатов;
  • большое многообразие источников и типов данных (структурированные и неструктурированные, хранящиеся в базах данных и в т.н. "озерах данных");
  • большой разброс в достоверности, или качестве данных, поступающих из разных источников.
Перечисленные характеристики известны как "четыре V больших данных" (от англ. volume, velocity, variety и veracity). Существуют и другие списки определяющих характеристик больших данных. Однако вне зависимости от принятого определения, важно помнить, что понятие "большие данные" не сводится только к их большому объему.

Стратегии работы с большими данными в R

Все вычисления в системе R выполняются в оперативной памяти компьютера. К счастью, даже персональные компьютеры сегодня имеют достаточно оперативной памяти для обработки данных объемом в несколько гигабайт, и этого вполне может оказаться достаточно для решения широкого круга практических задач. Однако объем многих современных наборов данных (например, собираемых высоконагруженными веб-приложениями и промышленными системами) намного превышает размер оперативной памяти, доступный на отдельном компьютере. Как было отмечено выше, такие данные обычно хранятся в удаленной базе данных или в хранилище какого-то другого типа.  В зависимости от стоящей задачи, для обработки подобных данных с помощью R можно воспользоваться одной из перечисленных ниже стратегий.

1. Создание репрезентативной выборки ограниченного размера

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

Такой подход особенно хорошо подойдет на начальных стадиях проекта, когда нужно быстро ознакомиться со свойствами данных или создать прототип предсказательной модели. При этом пользователю будет доступно все разнообразие существующих для R дополнительных пакетов. Недостаток этого подхода в том, что иногда создать репрезентативную выборку бывает сложнее, чем кажется. Работая же со смещенной выборкой, исследователь рискует сделать неверные выводы относительно свойств генеральной совокупности.

2. Разбиение данных на части

Решение ряда задач предполагает обработку логически разделимых наборов данных,  например соответствующих определенным временным периодам, отдельным географическим областям, компаниям, пользователям и т.п. Такие наборы можно легко извлечь из базы данных и далее последовательно (а иногда даже параллельно) обработать с помощью R на локальном компьютере исследователя.

Эта стратегия хороша тем, что анализу подвергаются все имеющиеся данные. Однако эти данные должны быть разделимы на отдельные части, что не всегда возможно или не всегда имеет смысл. Более того, в зависимости от объема данных, такой подход может занять слишком много времени и вычислительных ресурсов.

3. Выполнение ресурсоемких вычислений на стороне базы данных

Часто перед выполнением статистического анализа или построением предсказательной модели к данным необходимо применить такие операции, как фильтрация, группирование, агрегирование и т.п. Большинство баз данных превосходно справляются с такими операциями и поэтому имеет смысл сначала сделать подобные вычисления именно на стороне базы, а затем уже загрузить полученный набор данных меньшего размера на компьютер пользователя и провести его дальнейшую обработку с помощью R.

К этой стратегии стоит отнести также возможность построения некоторых предсказательных моделей с использованием вычислительных ресурсов базы данных. Например,  пакет modeldb позволяет таким образом создавать модели линейной регрессии и k ближайших соседей. Здесь же стоит упомянуть и попытки некоторых компаний реализовать возможность выполнения R-скриптов полностью на стороне базы данных. В частности, такая возможность имеется в Microsoft SQL Server.

В зависимости от используемой базы данных, необходимый пользователю функционал иногда может быть недоступен. Более того, не все базы данных одинаково эффективны: выполнение ресурсоемких запросов может привести к существенному замедлению некоторых из них, что в свою очередь может вызвать и другие нежелательные последствия (например, замедление веб-сайта, который обслуживается подобной базой данных).

4. Использование специализированных программных платформ для работы с большими данными

Если описанные выше стратегии по тем или иным причинам не подходят, стоит обратиться к специализированным программным платформам, предназначенным для организации и выполнения распределенных вычислений над большими данными.  Наиболее известными и широко используемыми среди таких платформ являются Hadoop и Spark (обе входят в состав проектов фонда Apache Software Foundation и поэтому их также часто называют Apache Hadoop и Apache Spark). В R есть несколько пакетов (в частности, sparklyr - см. ниже), предоставляющих удобный интерфейс для работы с этими платформами.

Немного истории

Впервые необходимость в обработке огромных объемов данных возникла с появлением Интернета, а именно с необходимостью индексирования миллионов веб-страниц и разработкой эффективных поисковых систем. В 2003 г. исследователи из компании Google опубликовали общие принципы построения Google File System (GFS) - файловой системы, в которой данные разбиваются на отдельные блоки, хранящиеся в нескольких копиях на разных компьютерах (Ghemawat et al. 2013).

Годом спустя той же группой исследователей был представлен метод MapReduce для выполнения распределенных вычислений над данными в GFS (Dean & Ghemawat 2004). Этот метод включает два шага. На первом из них (map) входные данные вычислительной задачи разбиваются на отдельные блоки, которые распределяются между несколькими компьютерами для выполнения необходимой обработки. На втором шаге (reduce) происходит объединение результатов обработки отдельных блоков данных и формирование итогового результата. Главным преимуществом этого подхода является возможность одновременной (параллельной) обработки данных на большом количестве компьютеров, чем достигается быстродействие вычислений.

Вскоре после публикации идей GFS и MapReduce группа инженеров и исследователей из компании Yahoo! приступила к их практической реализации в рамках проекта с открытым исходным кодом, который впоследствии (2006 г.) стал известен миру как Hadoop. Вариант GFS, созданный в рамках этой программной платформы, получил название Hadoop Distributed Files System (HDFS). 

Хотя платформа Hadoop позволила многим компаниям успешно применять парадигму MapReduce для распределенных вычислений над огромными объемами данных, каждый раз при возникновении новой задачи требовалось написание нового кода для операций map и reduce, что было неудобно и трудоемко. Для решения этой проблемы в 2008 г. инженеры из Facebook создали Hive - систему управления базами данных на основе Hadoop. Главной особенностью Hive стала поддержка SQL-подобных запросов к данным, хранящимся в HDFS (этот новый диалект SQL получил название  Hive Query Language, HQL).

В 2009 г. в Калифорнийском университете в Беркли был запущен исследовательский проект Spark с целью повысить эффективность распределенных вычислений методом MapReduce и создать универсальную платформу для таких вычислений. В 2010 г. Spark был опубликован как проект с открытым кодом, а в 2013 г. передан фонду Apache Software Foundation.

Сегодня Spark является одной из наиболее широко используемых платформ для работы с большими данными и характеризуется следующими особенностями:
  • непревзойденное быстродействие, достигаемое за счет выполнения вычислений в оперативной памяти большого количества компьютеров, объединенных в один кластер, а также благодаря эффективным протоколам передачи данных по сети;
  • универсальность: Spark поддерживает многие технологии кластерных вычислений и имеет несколько библиотек-надстроек для решения распространенных аналитических задач, включая Spark SQL (SQL-подобные запросы к данным), MLlib (алгоритмы машинного обучения), GraphX (анализ графов) и Spark Streaming (обработка потоковых данных).

Пакет sparklyr

Пакет sparklyr предоставляет удобный интерфейс для работы со Spark-кластерами из среды R. В частности, с его помощью можно:
  • устанавливать соединение с кластером;
  • выполнять обычные операции преобразования, фильтрации и агрегирования данных с использованием синтаксиса dplyr;
  • строить предсказательные модели с использованием алгоритмов машинного обучения, реализованных в библиотеке MLlib для Spark;
  • работать с другими R-пакетами, которые используют Spark для выполнения распределенных вычислений (например, rsparkling для работы с фреймворком h2o).
В следующем сообщении я расскажу о том, как установить Spark и sparklyr на локальном компьютере, запустить локальный Spark-кластер и подключиться к этому кластеру из R.

4 Комментарии

Unknown написал(а)…
Интереcно, ждем продолжения.
Анонимный написал(а)…
Супер!
edvardoss написал(а)…
отлично, спасибо!
Jüri Kuusik написал(а)…
Spasibo za statju. Interesno b6lo b6 polutchit primer b6chislenija prizrakov is vremenn6x rjadov s pomochju Spark (s pomochju "Distributed R" - spark_apply)
Новые Старые