Министерство образования и науки Российской Федерации
Министерство образования Саратовской области
Национальный исследовательский Саратовский государственный университет имени Н.Г. Чернышевского
Саратовский областной институт развития образования
Комитет по информатизации Саратовской области
Комитет по образованию администрации муниципального образования «Город Саратов»
Автономная некоммерческая организация «Информационные технологии в образовании»
Автономная некоммерческая организация «Научно-исследовательский центр «Образование. Качество. Отрасль»»
IX Всероссийская (с международным участием) научно-практическая конференция
«Информационные технологии в образовании»
«ИТО-Саратов-2017»
2-3 ноября 2017 года, г. Саратов

Современные технологии использования кэшированных данных для ускорения их обработки

Авторы: Храпченко Марина Валерьевна, Мартишин Сергей Анатольевич, Кандидат физико-математических наук
Институт системного программирования РАН
Рассмотрены технологии распределенной обработки и хранения больших массивов неструктурированных данных - Hadoop MapReduce и HDFS, а также быстрая кластерная вычислительная система для обработки больших данных (Apache Spark), обеспечивающая параллельную обработку данных и позволяющая за счет их кэширования повысить отказоустойчивость и увеличить скорость обработки.

В работе[1] рассмотрены основные аспекты технологий распределенной обработки данных и показана необходимость постоянного совершенствования программ подготовки и переподготовки специалистов.

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

В настоящее время в качестве одной из наиболее часто используемых технологий для распределенной обработки больших массивов неструктурированных данных является СПО Hadoop. Hadoop – это фреймворк, архитектура которого основана на кластерах (состоящих из большого числа машин) и предполагает горизонтальное масштабирование, а также принцип приближения кода к данным, то есть обработка данных по возможности происходит на том же кластере, на котором они находятся. Hadoop был разработан Apache Software Foundation, поэтому основным дистрибутивом является Apache Hadoop.

Для работы с данными большого объема в Hadoopимеется распределённая файловая система Hadoop Distributed File System (HDFS). Также в качестве основных модулей вHadoop входятHadoop Common - утилиты для поддержки модулей, фреймворк Hadoop YARN для управления заданиями и ресурсами кластера и система, основанная на YARN, для параллельной обработки больших объемов данныхHadoop MapReduce [1,2].

При использовании HDFS для обеспечения распределенной обработки исходные файлы большого объёма разбиваются на файлы меньшего объёма (по умолчанию – 64 мегабайта). Эти файлы хранятся на различных кластерах, причем для надёжности HDFS реплицирует все поступающие данные (по умолчанию в тройном объёме). Такая избыточность делает возможным восстановление после отказа одного узла.

Поскольку HDFS предназначена для хранения данных, но не для их обработки, то необходим некий инструмент, позволяющий это делать. Apache Hadoop имеет встроенный движок HadoopMapReduce, написанный на Java и основанный на модели распределённых вычислений MapReduce, который позволяет эффективно работать с HDFS. Заметим, что для работы с HDFS могут применяться и иные движки, равно как и технология MapReduce может применяться при иной организации данных.

Технология MapReduce предназначена для работы с большими данными и состоит из двух шагов: Map (предварительная обработка данных) и Reduce (свёртка предварительно обработанных данных). Функция Map получает исходные данные (ключ и связанные с ним данные) и производит их предварительную обработку – генерирует пары (ключ, значение). На каждом узле кластера производится обработка своей части данных (заметим, что на одном и том же узле одновременно может выполняться несколько Map-процессов). Функция Reduce используя выходные данные функции Map производит свёртку и возвращает итоговый список значений.

Фреймворк Spark (ApacheSpark) –это фреймворк с открытым кодом, в котором имеется механизм распределения программ по кластеру машин. То есть - Spark это быстрая кластерная вычислительная система для обработки больших данных. Spark обладает линейной масштабируемостью и обеспечивает отказоустойчивость [3]. Он предоставляет высокоуровневые API-интерфейсы со Scala, Java, Python, R для анализа данных. Он также поддерживает широкий набор инструментов более высокого уровня, включая Spark SQL для SQL и DataFrames, MLlib для машинного обучения, GraphX для обработки графов и Spark Streaming для потоковой обработки [4]. Кроме того, Spark обладает новыми возможностями работы с оперативной памятью за счет введения понятия (абстракции) RDD(ResilientDistributedDataset– устойчивого распределенного набора данных). Такой набор данных позволяет выполнять обработку данных параллельно. RDDраспределяется по кластеру в виде совокупности секций, содержащих подмножество данных. Sparkобрабатывает секции параллельно, а данные внутри секций последовательно. Таким образом, как правило, в приложении для Spark работа с данными происходит через операции над RDD и в этом ключе Spark можно рассматривать как среду параллельной обработки.

Создание RDDне приводит к автоматическому выполнению распределенных вычислений на кластере поскольку такого рода вычисления запускаются при вызове действий для RDD, а сами по себе RDDопределяют логические наборы данных, которые являются объектами дальнейшей обработки

Каждый RDDхарактеризуется наличием списка секций (как произведено разделение по кластерам), функцией вычисления каждого разбиения, списком взаимосвязей с другими RDD. Если распределение выполняется для RDDвида «ключ-значение» (например, для распределения RDDпо кластерам с использованием хэша) также имеется список секций. Иногда имеется список предпочтительного распределения RDDпо кластерам для вычисления каждой секции (например, распределение блоков для файла HDFS) [4].

Существует два способа создания RDD. Первый способ создания RDDиз локальной программы с помощью метода .parallelize(data) объекта SparkContextс локальной коллекцией объектов в качестве параметра [3]. Объект SparkContextотвечает за реализацию низкоуровневых операций с кластером, создается автоматически при запуске spark-shell. Доступен как sc. Элементы коллекции копируются в формируемый распределенный набор данных, который может работать параллельно. Одним из важных параметров для параллельных коллекций является количество секций, на которые необходимо разрезать набор данных. Как правило, Sparkпытается автоматически установить количество секций на основе характеристик используемого кластера. Однако его можно установить вручную, передав в качестве второго параметра для распараллеливания (например, sc.parallelize(data, 10)) [4].

Второй способ связан с созданием RDDиз любого источника хранения, поддерживаемого Hadoop, включая локальную файловую систему, HDFS, Cassandra, HBase и т.д.

RDD поддерживают два типа операций: преобразования (transformations), которые создают новый набор данных из уже существующего, и действия (actions), которые возвращают значение после выполнения вычислений в наборе данных. Так, например, map(func) - это преобразование, которое передает каждый элемент набора данных через функцию func и возвращает новый RDD, представляющий результаты. С другой стороны, reduce(func) - это действие, которое объединяет все элементы RDD, используя некоторую функцию func(которая принимает два аргумента и возвращает один), и возвращает окончательный результат (хотя существует также параллельный метод reduceByKey, который возвращает распределенный набор данных). Заметим, что функция должна быть коммутативной и ассоциативной, чтобы ее можно было правильно вычислить параллельно.

Заметим, что метод reduceByKey работает только для RDD, которые содержат элементы, представленные в виде пары (ключ, значение).

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

Заметим, что по умолчанию содержимое RDDносит временный характер. Тем не менее, для экономии ресурсов кластера, чтобы не было необходимости производить каждый раз одни и те же вычисления над одними и теми же данными, RDD после его генерации можно сохранить в памяти с помощью методов persist или cache. В этом случае RDDбудет сохранен таким образом, чтобы обеспечить наиболее быстрый доступ и при следующем запросе данные будут возвращены из закэшированных секций. Кэш в Spark является отказоустойчивым, поскольку если какая-либо секция RDD будет потеряна, она автоматически будет перевычислена при помощи преобразований, которые изначально ее создали.

Кроме того, каждый RDD можно сохранить на выбранном уровне на диске, в памяти в качестве сериализованных объектов Java (для экономии места), реплицировать его по узлам. Эти уровни устанавливаются передачей объекта StorageLevel (в языках Scala, Java, Python) для метода persist(). Метод cache() является сокращением для использования уровня хранения по умолчанию, который является StorageLevel.MEMORY_ONLY (сохранение десериализованных объектов в памяти). Полный набор уровней хранения можно посмотреть в[4].

Кэширование является ключевым инструментом для выполнения итеративных алгоритмов.

Spark автоматически контролирует кэш каждого узла и удаляет старые секции в при помощи алгоритма LRU (least recently used), который определяет наименее часто используемые данные. Также кэш может быть удален вручную с помощью метода RDD.unpersist().

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



[1] Работа выполнена при финансовой поддержке РФФИ, проект № 17-07-01006 А

Список использованных источников
  1. Лам Ч. Hadoop в действии/ Ч. Лам - М: ДМК Пресс, 2015. – 423с.
  2. Hadoop [Электронный ресурс] / Режим доступа: http://hadoop.apache.org, свободный. (Дата обращения: 11.09.2017.)
  3. Лезерсон У. Spark для профессионалов. Современные паттерны обработки больших данных/ У. Лезерсон, С. Риза. - Изд-во Питер, 2017.- 272 с.
  4. Apache Spark [Электронный ресурс] / Режим доступа: http://spark.apache.org, свободный. (Дата обращения: 11.09.2017.).
Вид представления доклада  Публикация
Ключевые слова  Распределенная обработка данных, кэширование, кластер, Hadoop, MapReduce, HDFS, Apache Spark, RDD, Scala

В статусе «Черновик» Вы можете производить с тезисами любые действия.

В статусе «Отправлено в Оргкомитет» тезисы проходят проверку в Оргкомитете. Статус «Черновик» может быть возвращен тезисам либо если есть замечания рецензента, либо тезисы превышают требуемый объем, либо по запросу участника.

В статусе «Рекомендован к публикации» тезис публикуется на сайте. Статус «Черновик» может быть возвращен либо по запросу участника, либо при неоплате публикации, если она предусмотрена, либо если тезисы превышают требуемый объем.

Статус «Опубликован» означает, что издана бумажная версия тезиса и тезис изменить нельзя. В некоторых крайне редких ситуацих участник может договориться с Оргкомитетом о переводе тезисов в статус «Черновик».

Статус «Отклонен» означает, что по ряду причин, которые указаны в комментариях к тезису, Оргкомитет не может принять тезисы к публикации. Из отклоненных тезис в «Черновики» может вернуть только Председатель программного или председатель оргкомитета.