Загрузил Михаил Жабицкий

2019 Инфраструктурные решения систем (3)

реклама
НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ
ЯДЕРНЫЙ УНИВЕРСИТЕТ «МИФИ»
К.С. Зайцев, А.А. Колычев,
С.А. Саматов, М.Е. Дунаев,
А.С. Бушин, А.С. Бондаренко
ИНФРАСТРУКТУРНЫЕ РЕШЕНИЯ
СИСТЕМ ОБРАБОТКИ
БОЛЬШИХ ДАННЫХ
Москва 2019
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ
РОССИЙСКОЙ ФЕДЕРАЦИИ
НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ
ЯДЕРНЫЙ УНИВЕРСИТЕТ «МИФИ»
К.С. Зайцев, А.А. Колычев, С.А. Саматов,
М.Е. Дунаев, А.С. Бушин, А.С. Бондаренко
Инфраструктурные решения систем обработки
больших данных
Лабораторный практикум
Москва 2019
УДК [004.6:004.9](076)
ББК 32.973.26-018.2я7
И74
Инфраструктурные решения систем обработки больших данных: Лабораторный практикум / К.С. Зайцев, А.А. Колычев, С.А. Саматов, М.Е. Дунаев,
А.С. Бушин, А.С. Бондаренко. – М.: НИЯУ МИФИ, 2019. – 56 с.
Лабораторный практикум ориентирован на бакалавров и магистров, специализирующихся по направлениям «Информатика и вычислительная техника», «Программная инженерия», «Информационная безопасность» и «Бизнес-информатика», в части практического применения современных технологий хранения и поиска данных во внешней и оперативной памяти, анализа данных, обмена сообщениями при интеграции корпоративных приложений.
В практикуме по каждой описанной технологии работы с данными представлены популярные Open Source программные продукты, используемые в информационных системах государственных служб и крупных корпораций:
движок Hive для распределенного хранения и поиска структурированных данных,
платформа Apache Ignite (GridGain) для распределённых in-memory вычислений и обработки данных,
фреймворк Apache Spark для анализа последовательных шаблонов данных и
построения ассоциативных правил,
распределенный брокер Apache Kafka для передачи и получения сообщений.
Рецензент канд. техн. наук, доц. М.В. Сергиевский
ISBN 978-5-7262-2519-7
©
©
Национальный исследовательский
ядерный университет «МИФИ», 2019
К.С. Зайцев, 2019
Редактор Н.Н. Антонова
Подписано в печать 12.12.2018. Формат 60х84 1/16
П.л. 3,5. Уч.-изд.л. 3,5. Тираж 50 экз.
Изд. № 034-1. Заказ № 109
Национальный исследовательский ядерный университет «МИФИ».
Типография НИЯУ МИФИ.
115409, Москва, Каширское шоссе, 31
ОГЛАВЛЕНИЕ
Введение ……………………………………………………………………………… 4
1. Лабораторная работа № 1. Установка виртуальной машины
для работы с экосистемой Hadoop………………………………………………………. 5
1.1. Установка VirtualBox…………………………………………………………………… 5
1.2. Установка виртуальной машины с Hadoop от Cloudera………………………… 6
1.3. Подготовка к работе с проектом Hive………………………………………………. 11
1.4. Контрольные вопросы………………………………………………………….. 13
2. Лабораторная работа № 2. Использование Apache Hive
для создания Data WareHouse из текстовых файлов ……………………………. 14
2.1. Типы данных и основные операции Apache Hive………………………………… 14
2.2. Подготовка текстовых файлов и загрузка их в Apache Hive…………………… 16
2.3. Формирование запросов к базе данных……………………………………….. 21
2.4. Контрольные вопросы………………………………………………………….. 24
3. Лабораторная работа № 3. Использование Apache Ignite и
JBoss (RedHat) Infinispan для работы в оперативной памяти…………………….. 25
3.1. Средства для работы в оперативной памяти…………………………………. 25
3.2. Программное обеспечение, необходимое для работы……………………….. 28
3.3. Создание проекта для Apache Ignite………………………………………………… 29
3.4. Выполнение простейших операций с использованием Apache Ignite……….. 32
3.5. Создание проекта для Infinispan……………………………………………………... 33
3.6. Выполнение простейших операций с использованием Infinispan…………….. 34
3.7. Контрольные вопросы………………………………………………………….. 35
4. Лабораторная работа № 4. Поиск последовательных шаблонов
и построение ассоциативных правил в проекте Apache Spark…………………….. 36
4.1. Поиск ассоциативных правил………………………………………………….. 36
4.2. Работа с алгоритмами FP-growth и PrefixSpan……………………………………. 38
4.3. Сравнение алгоритмов………………………………………………………….. 44
4.4. Контрольные вопросы………………………………………………………….. 44
5. Лабораторная работа № 5. Управление очередями
сообщений. Введение в Apache Kafka…………………………………………………... 45
5.1. Теоретическая часть……………………………………………………………. 45
5.2. Практическая часть…………………………………………………………….. 46
5.3. Заключение……………………………………………………………………… 54
5.4. Контрольные вопросы………………………………………………………….. 54
Список литературы………………………………………………………………….. 56
3
Введение
Современные цифровые методы управления порождают огромные
объемы данных, которые приводят к проблеме использования, т.н.
больших данных (BigData) [1]. В работе [2] приводятся характерные
показатели: ежедневно в мире датчики выдают более 1 млрд. показаний
и производится около 2,5 петабайт (1015 байт) данных. Первичные данные требуют обработки, в ряде случаев с привлечением сложной аналитики и ранее накопленной информации. Такая обработка не всегда
может быть выполнена вблизи источника данных, например, вследствие отсутствия необходимых вычислительных и/или программных
ресурсов. Поэтому в последнее время широко применяются технологии
облачных вычислений, реализующие услуги типа «Программное обеспечение как услуга» (SaaS), или при необходимости «Сеть как услуга»
(NaaS).
Работа с большими данными не похожа на обычный процесс бизнес-аналитики, где простое сложение известных значений приносит
результаты, и требует специальной инфраструктуры, включающей и
современные технические средства и программные инструменты [3].
Интерес к инструментам сбора, обработки, управления и анализа
больших данных проявляют все ведущие IT–компании мира, что
вполне закономерно. Во–первых, они непосредственно сталкиваются с
этим феноменом в собственном бизнесе, во-вторых, большие данные
открывают отличные возможности для освоения новых ниш рынка и
привлечения новых заказчиков в условиях цифровизации экономики.
Одной из таких ниш является интернет вещей (Internet of Things,
IoT). Решения IoT активно внедряются во все отрасли производства и
сферы жизнедеятельности. Основные из них на данный момент – это
решения для умных дома и города, энергетики, транспорта и логистики,
строительства, добычи и переработки полезных ископаемых, комплексной безопасности и т.д.
Кроме того, увеличение процессорной мощности, необходимой
для анализа постоянно увеличивающихся объемов данных, может потребовать значительных инвестиций в устаревшую IT–инфраструктуру
организации, а также дополнительных ресурсов для сопровождения,
которые можно было бы использовать для разработки новых приложений и сервисов. По мнению исполнительного директора компании
TmaxSoft Россия, эти факторы приведут к тому, что организации, которые продолжают использовать унаследованную устаревшую инфра4
структуру, в будущем будут вынуждены заплатить намного больше за
переход на актуальные технологии цифровой экономики либо не смогут получить никакого эффекта от революции больших данных [4].
Феномен больших данных заставил многие предприятия осознать
необходимость сбора, анализа и хранения структурированных и неструктурированных данных. Однако для внедрения этих процессов в
операционный контур нужен план действий и правильные программные инструменты, позволяющие рационально обрабатывать данные.
Реально получать ощутимый эффект от больших данных многие компании не в состоянии из-за использования унаследованных СУБД, в
которых не хватает функциональности и масштабируемости, и в результате революция больших данных никак не поможет их бизнесу.
Среди множества существующих на сегодняшний день программных инструментов, реализующих технологии обработки больших данных в крупных государственных и корпоративных системах, наибольший интерес в силу их значимости представляют следующие:
организация хранилищ больших данных, их поиск и обработка с
учетом технологий Blockchain и умения работать в оперативной памяти
(IMDG, IMDB);
применение методов машинного обучения при анализе данных;
интеграция корпоративных приложений на основе управления потоками сообщений.
Поэтому в настоящем лабораторном практикуме изучаются наиболее распространенные программные продукты, реализующие именно
эти перечисленные информационные технологии работы с большими
данными.
1. Лабораторная работа № 1. Установка виртуальной машины для
работы с экосистемой Hadoop
Цель работы: изучение процесса установки на лабораторном компьютере проекта верхнего уровня Hadoop и проектов его экосистемы
для надежной, масштабируемой и распределенной обработки больших
данных.
1.1. Установка VirtualBox
Наиболее быстро познакомиться с распределенной системой Hadoop и ее окружением можно при помощи средств виртуализации,
например, VirtualBox.
5
В настоящей работе описан процесс установки виртуальной машины с использованием программного продукта Oracle VM VirtualBox
(далее VirtualBox). Если кто-то предпочитает другую программу для
виртуализации, то можно выполнить те же действия и с иным программным продуктом.
VirtualBox — программный продукт виртуализации для
операционных систем Microsoft Windows, Linux, FreeBSD, macOS,
Solaris/OpenSolaris, ReactOS, DOS и др.
Виртуализация - это предоставление набора вычислительных
ресурсов или их логического объединения, абстрагированное от
аппаратной реализации, и обеспечивающее при этом логическую
изоляцию друг от друга вычислительных процессов, выполняемых на
одном физическом ресурсе.
Примером использования виртуализации является возможность
запуска нескольких операционных систем в облаке на одном
компьютере: при том каждый из экземпляров таких гостевых
операционных систем работает со своим набором логических ресурсов
(процессорных,
оперативной
памяти,
устройств
хранения),
предоставлением которых из общего пула, доступного на уровне
оборудования, управляет хостовая операционная система —
гипервизор. Также могут быть подвергнуты виртуализации сети
передачи данных, сети хранения данных, платформенное и прикладное
программное обеспечение (об этом подробнее см. эмуляция).
Для установки Oracle VM VirtualBox для своей операционной системы скачиваем дистрибутив с сайта:
https://www.virtualbox.org/wiki/Downloads и устанавливаем его. Если
возникают какие-то сложности, то по запросу в Google «Установка
VirtualBox» можно найти десятки подробных инструкций (например:
https://faqpc.ru/kak-ustanovit-virtualbox/), поэтому нет смысла описывать
это здесь подробно.
1.2. Установка виртуальной машины с Hadoop от Cloudera
А) Переходим по ссылке:
https://www.cloudera.com/downloads/quickstart_vms/5-12.html
и выбираем в окне (рис. 1.1) платформу VirtualBox (возможно к
моменту выполнения работы, версия обновится, и вас переадресуют на
более свежую версию образа, скачивайте его и выполняйте те же самые
шаги).
Б) Заполняем форму на рис. 1.2 (писать лучше что-то понятное).
6
Рис. 1.1. Выбор платформы.
Рис.1.2. Форма для заполнения.
В) Соглашаемся с лицензией (рис. 1.3). После нажатия кнопки SUBMIT
автоматически начнется скачивание, нужно дождаться его завершения.
Г) После окончания загрузки, необходимо разархивировать скачанный
архив куда-нибудь и запомнить это место.
7
Рис. 1.3.Форма подтверждения согласия.
Д) Запускаем VirtualBox. Далее нажимаем Файл->Импорт конфигураций. Должно открыться окно (рис. 1.4).
Рис. 1.4. Окно выбора конфигурации.
Далее нажимаем на значок папки
(желтый с зеленой стрелкой)
и выбираем папку, в которую мы ранее разархивировали скачанный
8
архив. В этой папке должен быть виден (рис. 1.5) только один файл.
Открываем его.
Рис.1.5. Папка с архивом.
То же самое можно сделать непосредственно из графического интерфейса VirtualBox Файл->Импорт конфигураций. Нажимаем клавишу
«Вперед» (рис.1.6). Должно открыться окно (рис. 1.7).
Рис.1.6. Окно импорта конфигураций.
9
По возможности в этом окне (рис. 1.7) необходимо установить наибольшее возможное значение ОЗУ, но не более ¾ всей доступной памяти.
Рис.1.7. Окно параметров импорта.
Тогда виртуальная машина будет работать быстрее. Также рекомендуется сменить путь к виртуальному образу диска, так как он довольно объемный: 64 Гб, выберите тот диск, где у вас достаточно места. Для этого
необходимо два раза щелкнуть по полю с путем к виртуальному образу
диска (рис. 1.8).
Рис.1.8. Смена пути к образу диска.
10
Далее нужно указать необходимую папку и дополнительно оставить
название диска, то есть: C:\Users\Kolychev\VirtualBox VMs\clouderaquickstart-vm-5.12.0-0-virtualbox\cloudera-quickstart-vm-5.12.0-0virtualbox-disk1.vmdk
То, что выделено жирным черным шрифтом, оставляется неизменным,
остальное меняется на то, что вам удобно.
После нажатия кнопки «Импорт» запустится процесс импорта конфигурации (рис. 1.9), который займет около 10 минут.
Рис.1.9.Импорт конфигурации.
После окончания импорта виртуальная машина будет готова к использованию. Запускаться виртуальная машина будет довольно долго (510 минут), это абсолютно нормально, так как со стартом ОС Linux запускаются все демоны Hadoop, в т.ч. Hive, HBase, Impala, Spark и др. программные продукты экосистемы, включенные в данный дистрибутив
Hadoop.
Для удобства работы рекомендуется включить двунаправленный
буфер, для того чтобы можно было копировать и вставлять из гостевой
ОС в основную и наоборот:
Устройства->Общий буфер обмена -> Двунаправленный
1.3. Подготовка к работе с проектом Hive
После того как запустится виртуальная машина и загрузится гостевая ОС, автоматически откроется браузер (если этого не произойдет,
запустите его самостоятельно). Для начала работы с Hive (рис. 1.10)
необходимо нажать на закладку Hue (выделено в левом верхнем углу).
Логин/пароль cloudera/cloudera.
Далее нужно выбрать (рис. 1.11) Query Editor -> Hive и Вы у цели.
Для того чтобы перенести какой-нибудь ранее сформированный
файл в хранилище Hive для начала работы с ним, необходимо предварительно создать в Hive директорию командой:
hadoop fs -mkdir /user/hive/warehouse/<имя директории>/
Эта команда запускается в терминале (рис. 1.12).
11
Рис.1.10. Выбор закладки Hue.
Рис.1.11. Выбор Hive.
12
Для копирования файла из локальной файловой системы в хранилище Hive используется команда:
hadoop fs -copyFromLocal <путь к файлу в локальной файловой системе> <путь к каталогу созданному в Hive>
Пример:
hadoop fs -copyFromLocal /home/cloudera/Desktop/price
/user/hive/warehouse/price/
Здесь файл, расположенный на рабочем столе, скопируется в каталог
price в хранилище Hive.
Рис.1.12. Запуск команд в терминале Hive.
1.4. Контрольные вопросы
1. Для каких целей предназначены Hadoop и проекты его экосистемы?
2. Что такое виртуализация?
3. Для чего используется Oracle VM VirtualBox?
4. На каких операционных системах возможна установка Oracle
VM VirtualBox?
5. В чем основные преимущества виртуализации?
6. Как вы думаете в чем основные недостатки виртуализации?
7. Что может быть подвергнуто виртуализации?
13
8. Какую долю оперативной памяти рекомендуется выделять гостевой ОС?
9. Какие шаги необходимо предпринять для разворачивания гостевой ОС из образа в программном продукте Oracle VM VirtualBox?
10. Какую настройку в Oracle VM VirtualBox необходимо включить
для обеспечения возможности копирования текста из гостевой ОС в
хостовую ОС и обратно?
2. Лабораторная работа №2. Использование Apache Hive для создания Data WareHouse из текстовых файлов
Цель работы: изучение возможностей системы Apache Hive для
создания и использования хранилища данных (базы данных с ограниченной поддержкой операции удаления и исправления хранимой информации), а также для трансляции SQL-запросов в mapreduce-задачи.
2.1. Типы данных и основные операции Apache Hive
Apache Hive - это система управления базами данных на основе
платформы Hadoop. Она позволяет выполнять запросы, агрегировать и
анализировать данные, хранящиеся в Hadoop.
Apache Hive был создан корпорацией Facebook, и передан под открытой лицензией в собственность фонду Apache Software Foundation.
Hive обладает возможностями:
работы с данными используя SQL-подобный язык запросов;
поддержки различных форматов хранения данных;
работы напрямую с файловой системой HDFS и Apache HBase;
В создании таблиц Hive могут участвовать следующие типы данных: столбцы; литералы; нулевые значения; сложные типы.
Столбцы. Тип столбца используется в качестве типа данных.
Целые. Данные целого типа могут быть определены с помощью интегральных типов данных, INT. Когда диапазон данных превышает диапазон INT, нужно использовать BIGINT, и если диапазон данных меньше, чем INT, нужно использовать SMALLINT. TINYINT меньше
SMALLINT. В таблице 2.1 представлены различные типы INT данных.
Таблица 2.1 Целые типы.
Тип
Постфикс
TINYINT
Y
SMALLINT
S
Пример
10Y
10S
14
INT
BIGINT
L
10
10L
Строки
Строковые типы можно задать с помощью одиночных (' ') или двойных
кавычек (" "). В него входят три формата: Strings, VARCHAR и CHAR.
В таблице 2.2 представлены различные строковые типы данных.
Таблица 2.2 Строковые типы.
Тип данных
Длина
STRING
Произвольная
VARCHAR
От 1 до 65355
CHAR
255
Время и даты (TIMESTAMP)
Этот тип поддерживает традиционную UNIX метку времени с дополнительной точностью до наносекунды в формате java.sql.Timestamp
"YYYY-MM-DD HH: MM: SS.fffffffff" и "формат гггг-мм-дд чч: мм:
ss.ffffffffff".
DATE:
Значения ДАТА описаны в год / месяц / день формат в виде {{YYYYMM-ДД}}.
INTERVAL
Интервал времени в различных форматах.
Десятичные знаки
Тип DECIMAL в Hive такой же, как и формат Big Десятичный в Java.
Он используется для представления произвольной точности. Его синтаксис и пример выглядят так:
DECIMAL(precision, scale)
decimal(10,0)
Union
Тип UNION представляет собой совокупность разнородных типов данных. Можно создать экземпляр с помощью объединения нескольких
разных типов. Синтаксис и пример использования приведены ниже:
UNIONTYPE<int, double, array<string>,
struct<a:int,b:string>>
{0:1}
{1:2.0}
15
{2:["three","four"]}
{3:{"a":5,"b":"five"}}
{2:["six","seven"]}
{3:{"a":8,"b":"eight"}}
{0:9}
{1:10.0}
Литералы. В Hive используются следующие литералы: c плавающей
точкой; десятичного типа (от -10-308 до 10308);
Нулевое значение. Отсутствующие значения представляются специальным значением NULL.
Сложные. Следующие типы сложных данных имеются в Hive:
Массивы. Массивы в Hive используются так же, как они используются в Java.
Syntax: ARRAY<data_type>
Карты. Карты в Hive похожи на Java Maps.
Syntax: MAP<primitive_type, data_type>
Структуры. В Hive структуры используются по аналогии со сложными данными с комментариями.
Syntax: STRUCT<col_name : data_type [COMMENT
col_comment], ...>
Подробнее о типах данных в Hive можно прочитать в энциклопедии
HIVE по адресу, https://cwiki.apache.org/confluence/display/Hive/Home ,
поиск по сайту «LanguageManual Types»
Основные операции Hive
Операции над данными в Hive на языке HQL схожи с аналогичными
операциями в SQL системах:
CREATE EXTERNAL TABLE - создать внешнюю таблицу,
SELECT FROM WHERE - выбрать (что?) из (таблицы) где (условие),
JOIN - соединить две или более таблиц.
2.2. Подготовка текстовых файлов и загрузка их в Apache Hive
В соответствии со схемой базы данных (рис. 2.1), для выполнения
16
дальнейшей работы необходимо подготовить три текстовых файла, по
одному на каждую таблицу.
Рис. 2.1. Схема (структура) базы данных для работы в Hive.
В этих файлах будут храниться данные в формате: <значение поля>|<
значение поля >|< значение поля >|< значение поля >. Текстовые файлы
удобно создать в «простом» текстовом редакторе (например, notepad++
или WordPad (MFC), чтобы при сохранении текстовый файл не содержал дополнительной информации. Также лучше подготавливать файлы
с данными непосредственно в виртуальной машине, так как в ОС семейств Windows и Linux отличаются символы переноса строк. Для
данной лабораторной работы использовались тестовые файлы с данными (табл. 2.3), которые необходимо скачать из веб-сервиса GitHub
(по ссылке https://github.com/kolychev1995/HiveLab) клавишей
, выбрав опцию Download ZIP.
Clone or download
Таблица 2.3 Фрагменты файлов с данными для работы.
phone_number
price
room
1|4585|Ivanov
2|8896|Sidorov
3|8596|Orlov
1|1|3000
1|2|2000
1|3|1000
2|1|3200
1|1|1|10|5
1|1|2|15|14
1|1|3|20|18
2|2|1|14|13
17
Установка HDFS и Hive
Для начала работы с Hive (рис. 2.2) необходимо нажать на закладку Hue
(так же, как мы делали на предыдущей лабораторной работе), логин/пароль здесь cloudera/cloudera.
Рис.2.2. Выбор закладки Hue.
Далее выбираем (см. рис. 2.3) Query Editor -> Hive.
Рис.2.3. Выбор Query Editor.
Закачка текстовых файлов описаний таблиц PRICE, ROOM и
PHONE_NUMBER должна быть выполнена заранее.
18
Отметим, что система Hadoop имеет собственную файловую систему
HDFS, которая создана специально для работы с большими данными, поэтому для начала работы с данными их нужно скопировать из локальной файловой системы, где развернут Hadoop, в
HDFS. Команды создания директории в HDFS и копирование из локальной файловой системы файлов с данными в директорию HDFS
выполняются в терминале.
Создание таблиц
Создаем директорию в HDFS, где будут расположены данные для
таблицы PRICE (команды выполняются в терминале):
hadoop fs -mkdir /user/hive/warehouse/price/
Копируем данные из локальной файловой системы в HDFS (первый
путь в локальной ФС, второй в HDFS):
hadoop fs -copyFromLocal /home/cloudera/Desktop/price
/user/hive/warehouse/price/
Создадим таблицу PRICE «над» каталогом, в который скопированы
данные из локальной файловой системы (выполняется в редакторе
запросов, рис.2.3):
DROP TABLE IF EXISTS price;
CREATE EXTERNAL TABLE PRICE (
area tinyint,
class tinyint,
price smallint
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
LOCATION '/user/hive/warehouse/price/';
Далее по аналогии создадим таблицу ROOM «над» каталогом, в который скопированы данные из локальной файловой системы
hadoop fs -mkdir /user/hive/warehouse/room/
hadoop fs -copyFromLocal /home/cloudera/Desktop/room
/user/hive/warehouse/room/
DROP TABLE IF EXISTS room;
CREATE EXTERNAL TABLE ROOM (
level tinyint,
area tinyint,
class tinyint,
quantity smallint,
19
quantity_taken_room smallint
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
LOCATION '/user/hive/warehouse/room/';
И, наконец, создадим таблицу PHONE_NUMBER «над» каталогом, в
который скопированы данные из локальной файловой системы
hadoop fs -mkdir /user/hive/warehouse/phone_number/
hadoop fs -copyFromLocal /home/cloudera/Desktop/phone_number
/user/hive/warehouse/phone_number/
drop TABLE IF EXISTS PHONE_NUMBER;
CREATE EXTERNAL TABLE PHONE_NUMBER (
level tinyint,
phone_number int,
admin_name string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
LOCATION '/user/hive/warehouse/phone_number/';
Теперь база данных создана, и информация в нее загружена. Обратите
внимание, что в отличие от создания базы данных в традиционных
реляционных базах данных, в Hive не указываются ни первичные
ключи таблиц, ни связи между сущностями, ни ограничения.
Просмотреть каталоги и файлы в HDFS можно в меню редактора
запросов, для этого необходимо нажать на вкладку HDFS слева от
окна редактирования запросов (рис.2.4). Там доступны обычные действия с файлами и каталогами: просмотр, изменение, удаление и т.п.
Рис.2.4. Просмотр каталогов и файлов в HDFS.
20
2.3. Формирование запросов к базе данных
Простые запросы на поиск
1. Вывести список цен проживания в двухместных номерах разного
класса:
SELECT *
FROM price
WHERE area=2;
2. Вывести телефон и фамилию администратора первого этажа
SELECT phone_number, admin_name
FROM phone_number
WHERE level=1;
3. Вывести количество одноместных номеров первого класса по этажам.
SELECT level, quantity
FROM room
WHERE area = 1 and class = 1;
Более сложные запросы с операцией Join
4. Вывести фамилии администраторов и номера телефонов этажей, на
которых есть незанятые одноместные номера:
SELECT DISTINCT phone_number.admin_name,
phone_number.phone_number
21
FROM phone_number INNER JOIN room ON phone_number.level
= room.level
WHERE room.area = 1 And room.quantity >
room.quantity_taken_room;
5. Вывести фамилии администраторов и номера телефонов этажей, на
которых есть больше девяти свободных двуместных номеров:
SELECT DISTINCT phone_number.admin_name,
phone_number.phone_number
FROM phone_number INNER JOIN room ON phone_number.level
= room.level
WHERE room.area = 2 And (room.quantity room.quantity_taken_room) > 9;
6. Вывести фамилию администратора и номера телефонов этажа, на
котором больше всего трехместных номеров
SELECT DISTINCT phone_number.admin_name,
phone_number.phone_number
FROM phone_number INNER JOIN room ON phone_number.level
= room.level
WHERE room.area = 3 And room.quantity = (
select max(quantity)
from room
where area = 3
);
Этот запрос может не заработать в текущей версии Hive, хотя здесь
используется совсем несложный подзапрос.
Запросы на поиск с условием в одной таблице
7. Сформировать количественное распределение незанятых номеров
по местности и классу:
22
SELECT area, class, Sum(quantityquantity_taken_room) AS free_room
FROM room
GROUP BY area, class;
8. Сформировать количественное распределение номеров заданного
класса по этажам:
SELECT level, class, SUM(quantity) AS some_class_room
FROM room
WHERE class=1
GROUP BY level, class;
Более сложный поиск с операцией Join (выполнять по желанию)
9. Вывести телефоны этажей, на которых расположены одноместные
номера люкс:
SELECT DISTINCT phone_number.level,
phone_number.phone_number
23
FROM phone_number INNER JOIN room ON phone_number.level
= room.level
WHERE area=1 AND class=1;
10. Вывести телефоны этажей, на которых расположены двуместные
номера второго класса:
SELECT DISTINCT phone_number.level,
phone_number.phone_number
FROM phone_number INNER JOIN room ON phone_number.level
= room.level
WHERE area=2 AND class=2
11. Вывести телефоны этажей, на которых расположены трехместные
номера второго класса или третьего класса:
SELECT DISTINCT phone_number.level,
phone_number.phone_number
FROM phone_number INNER JOIN room ON phone_number.level
= room.level
WHERE area=3 AND (class=2 OR class=3);
2.4. Контрольные вопросы
1. Во что Hive преобразует запросы?
2. Перечислите целые типы данных Hive. В чем их отличия?
24
3. Перечислите строковый типы данных Hive. В чем их отличия?
4. Какие типы данных используются для задания времени и дат?
5. Каким значением представляются отсутствующие значения?
6. Перечислите сложные типы данных Hive. В чем их отличия?
7. В чем особенность типа данных UNION?
8. Как называется язык запросов, используемый в Hive?
9. Каковы основные операции над данными доступные в Hive?
10. Какие шаги выполняются для создания таблицы в Hive?
11. В чём состоят основные отличия при создании БД в Hive и традиционных СУБД?
12. Какие типы запросов не поддерживает Hive?
13. Каким образом можно соединить две таблицы в Hive?
3. Лабораторная работа №3. Использование Apache Ignite и JBoss
(RedHat) Infinispan для работы в оперативной памяти
Цель работы: изучение процесса установки на рабочей станции
двух решений In Memory Data Grids (IMDG): Apache Ignite (GridGain)
(далее просто Ignite) и JBoss (RedHat) Infinispan (далее просто
Infinispan), а также выполнения простейших действий в оперативной
памяти компьютера с применением этих решений.
3.1. Средства для работы в оперативной памяти
Вычисления в оперативной памяти (In-Memory Computing - IMC)
востребованы во многих областях деятельности: в финтехе и в eCom,
в телекоме и интернете вещей (IoT), т.к. позволяют значительно сократить время выполнения заданий. Обычно все продукты IMC разделяют на:
- базы данных в оперативной памяти (In-Memory Data Base, IMDB);
- гриды данных в памяти (In-Memory Data Grids, IMDG);
- In-Memory-платформы.
В чем отличие IMDB и IMDG? IMDB по своей архитектуре ближе к
традиционным реляционным базам данных, в свою очередь IMDG –
это распределенное хранилище объектов, схожее с многопоточной
хэш-таблицей. Главное преимущество IMDG заключается в возможности работать с объектами из бизнес-модели напрямую. Если в классической реляционной СУБД нам позволено хранить строго типизи25
рованные данные, то в IMDG можно хранить любой вид данных,
например, класс из .NET, описывающий покупателя. Данный подход
позволяет существенно сократить временные затраты на сериализацию и десериализацию данных на стороне клиента. Другим важным
моментом IMDG архитектуры является то, что если используется
кластер из нескольких IMDG узлов, то данные следует обрабатывать
на том же сервере (узле) где они расположены, что практически исключает их перемещение внутри кластера. Тем самым снижается
вычислительная нагрузка на сеть и повышается безопасность системы.
IMDG за счет своих особенностей является более гибкой технологией,
нежели IMDB. Однако IMDG накладывает необходимость строго
контролировать процесс разработки решения, так как достаточно
легко создать продукт, который будет крайне сложно поддерживать в
дальнейшем.
Среди крупных игроков на этом рынке можно выделить SAP с реляционной IMDB HANA, Oracle с IMDB TimesTen, а также IMDB от
MemSQL и IMDG от GridGain. Подробнее: https://ecmjournal.ru/post/In-Memory-Baza-dannykh-v-operativnojj-pamjati.aspx
Нас в этой лабораторной работе интересуют решения IMDG. Основными частями IMDG являются кэши (иногда еще называется регионами). Кэш (cache) — промежуточный буфер в оперативной памяти с
быстрым доступом, содержащий информацию, которая может быть
запрошена с наибольшей вероятностью. Доступ к данным в кэше
осуществляется быстрее, чем выборка данных из более медленной
внешней памяти или удаленного источника, однако её объём существенно ограничен по сравнению с хранилищем исходных данных.
Кэш в IMDG — это распределенный ассоциативный массив (т.е. кэш
реализует интерфейс Map языка Java на Java Virtual Machine, JVM),
обеспечивающий быстрый конкурентный доступ к данным с любого
узла кластера. Кэш также позволяет производить обработку этих
данных распределенно, т.е. модификация любых данных может быть
произведена с любого узла кластера, при этом не обязательно доставать данные из кэша, изменять их, а потом класть обратно. Практически во всех IMDG кэши поддерживают транзакции.
Данные в кэшах хранятся в сериализованном виде (т.е. в виде массива
байтов) в партициях (частях), и эти партиции равномерно распределены по кластеру, а каждая партиция реплицируется на некоторое коли26
чество узлов в зависимости от конфигурации кластера и от требований к надежности хранения данных (рис. 3.1).
Рис. 3.1. Схема распределения партиций по кэшу.
Попадание объекта в ту или иную партицию однозначно определяется
некоторой хэш-функцией.
IMDG можно использовать не только как самостоятельное хранилище, но и как узел системы, снимающий нагрузку с трудномасштабируемой реляционной БД. Для чтения и записи из/в БД для каждого
кэша в конфигурации указывается загрузчик (Loader), который будет
отвечать за чтение/запись объектов в БД.
В случае использования IMDG как узла, который берет на себя
всю нагрузку по чтению/записи/
распределенной обработке данных,
мы продолжаем иметь в БД актуальные данные, низкую нагрузку
на саму базу и, что важно, корпоративные приложения, использующие БД для сбора статистики,
составления отчетов и пр. продолжают работать в прежнем режиме.
Ignite — это универсальная
платформа для распределённых inmemory вычислений. Первыми ее
компонентами, появившимися около 10 лет назад, были распределённый кэш (data grid) и mapreduce (compute grid). На тот моРис. 3.2. Схема совместной
мент все разработчики подобных
работы IMDG и DB.
продуктов позиционировали свои
27
решения как «distributed cache». Со временем требования бизнеса
росли, и приходилось добавлять новые модули. Среди основных:
поддержка ANSI SQL'99, потоковая загрузка данных (streaming), развёртывание пользовательских приложений в кластере (service grid),
возможность сохранять объекты, не имея их Java-классов на сервере
(binary objects), интеграция с большим количеством сторонних интерфейсов и платформ (Web sessions, Spring cache, Hibernate L2 cache,
Hadoop, Spark, Kafka, JDBC, ODBC, и т.д.).
Infinispan - это распределенное хранилище данных в оперативной памяти (in memory) типа «key-value» с дополнительной схемой,
доступное под лицензией Apache 2.0. Это программное средство может использоваться как встроенная библиотека Java или как независимая от языка служба, доступная удаленно по различным протоколам (Hot Rod, REST, Memcached и WebSockets). Его можно использовать как кэш или сеть данных с расширенным набором функций,
таких как транзакции, события, запросы, распределенная обработка,
автономная работа и географический переход на другой ресурс.
Мониторинг и управление хранилищем возможны через JMX, CLI
и веб-консоль. Оно интегрируется с JPA, JCache, Spring, Spark и мн.
др. проектами и работает на облачных платформах Amazon Web
Services (AWS), Azure от Microsoft, Google Cloud и Red Hat OpenShift.
3.2. Программное обеспечение, необходимое для работы
Сначала на компьютере проверяем версию VirtualBox (VB). Она
должна быть не ниже 5.2.0. Ссылка на скачивание VB
https://www.virtualbox.org/wiki/Downloads . Далее для работы должна
быть установлена виртуальная машина по ссылке IE8 - Win7.ova
Для запуска решений IMDG на персональном компьютере (без
виртуальной машины) необходимо выполнить ниже перечисленные
подготовительные действия. Если виртуальная машина установлена,
то эти действия уже выполнены, повторно их выполнять нет необходимости, а нужно сразу переходить к пункту 3.3.
1. Скачать Java. Инструкция: http://java-course.ru/begin/installjdk/
2. Скачать Apache Maven — фреймворк для автоматизации
сборки проектов на основе описания их структуры в файлах на языке
POM — подмножестве XML. Инструкция: http://www.apachemaven.ru/install.html (ссылка на скачивание и инструкция по установке)
28
3. Скачать и установить NetBeans IDE — свободную интегрированную среду разработки приложений (IDE) на языках программирования
Java,
Python,
PHP,
JavaScript
и
др.
https://netbeans.org/downloads/
4. Apache Ignite https://ignite.apache.org/download.cgi (Прим. Binary Releases apache-ignite-fabric-2.2.0-bin.zip)
5. Добавить в системные переменные среду IGNITE_HOME.
Проверим правильность добавления в системные переменные
среды IGNITE_HOME. Для этого нужно запустить через командную
строку
ignite.bat
,
которая
находится
в
разделе
IGNITE_HOME/bin/ignite.bat (рис. 3.3).
Примечание. Возможно придется перезапустить компьютер.
Рис. 3.3. Проверка корректности добавления системных переменных.
Если действия выполнены корректно, то должна быть получена
такая картина (рис. 3.4).
3.3. Создание проекта для Apache Ignite
После того как все необходимые компоненты установлены или
запущена виртуальная машина, запускаем среду разработки NetBeans
и создаем новый Maven проект (см. рис. 3.5, где нужное отмечено
красными галочками или подчеркиваниями).
29
Рис. 3.4. Результат добавления среды IGNITE_HOME.
Рис. 3.5. Создание нового Maven проекта.
Затем нажимаем экранную
имя проекту (рис. 3.6).
клавишу
30
Далее >
и задаем
В пакетах исходных кодов
нужно создать класс c методом main (рис. 3.7).
Рис. 3.6.Именование нового
Maven проекта.
Рис. 3.7. Создание класса c методом main.
Для работы с Apache Ignite
далее добавим в файл pom.xml
зависимости, которые подгрузят необходимые библиотеки.
Пример Pom файла находится в
виртуальной машине на рабочем столе в папке Files/ignite
(рис. 3.8).
Рис. 3.8. Местонахождение «pom» файла в проекте.
31
В нем должны быть следующие настройки:
<dependencies>
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-core</artifactId>
<version>2.2.0<version>
</dependency>
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-spring</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-cassandra-store</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
3.4. Выполнение простейших операций с использованием Apache
Ignite
Задание 1. Запишем в кэш, расположенный в оперативной памяти, ключ и значение для этого ключа, а затем прочитаем это значение.
Таким образом, можно вставлять и/или получать данные в/из кэша.
package com.mycompany.ignite_test2;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
public class HelloIgnite {
public static void main(String[] args) {
try (Ignite ignite = Ignition.start()) { // создание
нода Ignite
32
IgniteCache<Integer, String> cache = ignite.getOrCreateCache("myCacheName"); //создание кэша
структуры ключ значение
for (int i = 0; i < 100; i++);
cache.put(i, Integer.toString(i)); //заполняем
кэш данными где ключ от 0 до 100 и значение те же самое что
и ключи только переводим из Integer в String.
for (int i = 0; i < 100; i++)
System.out.println("Got [key=" + i + ", val=" +
cache.get(i) + ']');
//выводим на экран записанные значения
в кэш
}
}
}
3.5. Создание проекта для Infinispan
Создаем новый Maven проект также как описано в пункте
3.3, только добавляем в pom.xml зависимости для Infinispan (так
же pom файл лежит в виртуальной машине на рабочем столе в
папке Files/infinispan), которые подгрузят необходимые библиотеки:
<dependencies>
<dependency>
<groupId>org.infinispan</groupId>
<artifactId>infinispan-embedded</artifactId>
<version>9.0.1.Final</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
33
</dependencies>
3.6. Выполнение простейших операций с использованием
Infinispan
Задание 2. Запишем в кэш, расположенный в оперативной
памяти, ключ и значение для этого ключа, а затем прочитаем
это значение. Таким образом, можно вставлять и/или получать
данные в/из кэша.
package com.mycompany.mvncasheclaster;
import org.infinispan.Cache;
import org.infinispan.configuration.cache.CacheMode;
import
org.infinispan.configuration.cache.ConfigurationBuilder;
import
org.infinispan.configuration.global.GlobalConfigurationBuild
er;
import org.infinispan.manager.DefaultCacheManager;
public class setup {
public static void main(String[] args) throws
NotSupportedException, RollbackException, SystemException,
HeuristicMixedException, HeuristicRollbackException {
// Создаем объект класса GlobalConfigurationBuilder
для настройки кластерного менеджера кешей
GlobalConfigurationBuilder global =
GlobalConfigurationBuilder.defaultClusteredBuilder();
// Сделать кеш-память (по умолчанию распределенной
синхронной)
ConfigurationBuilder builder = new
34
ConfigurationBuilder();
builder.clustering().cacheMode(CacheMode.DIST_SYNC);
// Установка менеджера кеша по умолчанию
DefaultCacheManager cacheManager = new
DefaultCacheManager(global.build(), builder.build());
// Инициализация диспетчера кеша
Cache<Integer, String> cache =
cacheManager.getCache();
// Сохранять текущий адрес узла в ключах от 0 до 10
for(int i=0; i < 10; i++) {
cache.put(i, cacheManager.getNodeAddress());
}
// Отображение текущего содержимого кэша для всего
кластера
cache.entrySet().forEach(entry ->
System.out.printf("%s = %s\n", entry.getKey(),
entry.getValue()));
//Остановка менеджера
cacheManager.stop();
}
}
3.7. Контрольные вопросы
1. Какая задача у In-Memory Data Grid?
2. Как хранятся данные в Data Grid?
3. Можно ли использовать собственные объекты в ключе или в значении?
4. Преимущества технологии IMDG?
5. В каком виде хранится информация в кэше Data Grid?
6. Как можно использовать IMDG?
7. Поддерживает ли IMDG транзакции?
8. Что такое Apache Ignite?
9. Основные модули Apache Ignite?
35
10. Что такое Infinispan?
11. Команда для записи и получения в/из кэша?
4. Лабораторная работа №4. Поиск последовательных шаблонов
(Sequential Pattern Mining) и построение ассоциативных правил в
проекте Apache Spark
Цель работы: изучение методов поиска последовательных шаблонов (Sequential Pattern Mining, SPM) на примере алгоритмов FPgrowth (Frequent Pattern-Growth, FPG) и PrefixSpan при работе в рамках проекта Apache Spark.
4.1. Поиск ассоциативных правил
При создании современных рекомендательных систем одной из
задач является поиск ассоциативных правил, позволяющих при анализе корзин покупок рекомендовать очередные, вероятно необходимые покупателю, товары. Аналогично, при анализе последовательностей изученных курсов или запрошенных компьютерной программой
массивов данных можно рекомендовать очередные курсы или массивы данных для обработки или анализа.
Для поиска подобных ассоциативных правил необходимо сначала
находить последовательные шаблоны (Sequential Pattern Mining) –
цепочки купленных товаров или запрошенных файлов, и затем, исследуя их, строить устойчивые ассоциации.
К настоящему времени для решения этой задачи разработано несколько алгоритмов, с разной степенью эффективности анализирующих различные типы последовательности товаров и услуг.
Одним из наиболее эффективных алгоритмов поиска ассоциативных
правил
является
алгоритм
FP-growth
(https://basegroup.ru/community/articles/fpg). Его название можно перевести как «выращивание популярных (часто встречающихся) предметных наборов». Этот алгоритм (см. рис. 4.1) позволяет не только
избежать затратной процедуры генерации кандидатов, но и уменьшить необходимое число проходов по базе данных предметных наборов до двух.
В основе метода лежит предобработка базы транзакций, путем
преобразования ее в компактную древовидную структуру, называемую Frequent-Pattern Tree – дерево популярных предметных наборов
36
(откуда и название алгоритма). В дальнейшем для краткости будем
называть эту структуру FP-дерево. К
основным преимуществам данного
метода относятся:
1. Сжатие БД транзакций в компактную структуру, что обеспечивает
очень эффективное и полное извлечение
частых предметных наборов;
2. При построении FP-дерева используется технология разделения и
захвата (divide & conquer), которая позволяет выполнить декомпозицию одной
сложной задачи на множество более
простых;
3. Позволяет избежать затратной
процедуры генерации кандидатов, характерной, например, для алгоритма
Рис. 4.1. Дерево популярных
«a priori».
наборов FP-growth.
Идея алгоритма PrefixSpan
(http://ijaiem.org/Volume2Issue2/IJAIEM-2013-02-20-024.pdf)
заключается в том, чтобы найти в заданной базе предметных наборов
все часто встречающиеся предметы и добавить их к текущему шаблону, получая новые частые последовательности. После этого можно
искать частые последовательности большей длины на основе проецированных баз данных. Создание проецированных баз может сильно
ухудшить производительность при работе с большими объемами
данных, поэтому вместо физического создания проекций, используется псевдопроецирование (pseudoprojection).
При рекурсивном вызове метода PrefixSpan вместо созданной
проекции ему передаются указатели на минимальные позиции возможных вхождений предметов в клиентские последовательности
после текущего шаблона. В качестве указателя рассматривается
набор, состоящий из идентификатора клиента, номера транзакции в
клиентской последовательности и позиции в транзакции. Благодаря
псевдопроекции, скорость работы алгоритма значительно повышается. Кроме того, для работы алгоритма требуется значительно меньше
памяти.
37
4.2. Работа с алгоритмами FP-growth и PrefixSpan
Действия:
А) Скачиваем предоставленные тестовые файлы из веб-сервиса GitHub
(по ссылке https://github.com/tpo9hbi4/SparkSPMLab) клавишей
, выбрав опцию Download ZIP.
Clone or download
Немного о выборках:
Имеем шесть выборок с разными параметрами (см. рис. 4.2):
- среднее число транзакций (T) для неоднородных баз или точное
число транзакций для однородных баз (С) в клиентских
последовательностях,
- среднее число предметов в транзакциях (I),
- количество клиентских последовательностей (D).
Рис. 4.2. Пример обрабатываемых выборок.
Копируем файлы с выборками в hadoop. Делаем так же, как уже
делали ранее, например, в лабораторной работе № 2 (пункт 2.2.->
Создание таблиц):
hadoop
fs
-copyFromLocal
/home/cloudera/Desktop/название_документа_с_выборкой/us
er/cloudera/
получаем:
Рис. 4.3. Результат копирования файлов с выборками.
38
Б) Тестируем алгоритм FP-growth. Запускаем Apache Spark командой
spark–shell (в разных версиях Spark разные команды, ещё одна из
них: spark2–shell) в терминале системы и ждём пока появится
строка scala> (в нижней части экрана на рис. 4.4)
Рис. 4.4. Результат запуска Spark.
В терминал системы можем ввести код заранее написанной
программы и выполнять его построчно:
import org.apache.spark.mllib.fpm.FPGrowth
import org.apache.spark.rdd.RDD //импортируем библиотеки
val data =
sc.textFile("/user/cloudera/название_документа_с_выборкой
")//загружаем датасеты
39
val transactions: RDD[Array[String]] = data.map(s =>
s.trim.split(' '))/ /преобразовываем датасеты в нужный
формат
val fpg = new FPGrowth()//заводим переменную, отвечающую
за работу алгоритма
.setMinSupport(0.2)
//Изменяемое
значение
параметра
MinSupp
.setNumPartitions(10) FP-growth где указываем MinSupp и
NumPartitions
val model = fpg.run(transactions)//запускаем алгоритм FPgrowh с указанными выше параметрами
model.freqItemsets.collect().foreach { itemset =>
println(itemset.items.mkString("[", ",", "]") + ", " +
itemset.freq)
}
//Печатаем найденные последовательности
val minConfidence = 0.8 //задаём MinConf
model.generateAssociationRules(minConfidence).collect().fore
ach { rule =>
println(
rule.antecedent.mkString("[", ",", "]")
+ " => " + rule.consequent .mkString("[", ",", "]")
+ ", " + rule.confidence)
}//Для полученных последовательностей ищем ассоциативные
правила и выводим их.
Но, учитывая, что в дальнейшем нужно будет редактировать код
этой программы, сделаем по-другому. Создадим пустой файл на рабочем столе, скопируем в него текст программы и запустим ее
:load /home/cloudera/Desktop/название_файла_с_программой
Код этой программы дан без комментариев, чтобы просто “копипастнуть” в файл. Этот же код можно скачать из веб-сервиса GitHub (по
ссылке https://github.com/tpo9hbi4/SparkSPMLab).
import org.apache.spark.mllib.fpm.FPGrowth
import org.apache.spark.rdd.RDD
40
val data = sc.textFile("/user/cloudera/c10d1k ")
val transactions:
s.trim.split(' '))
RDD[Array[String]]
=
data.map(s
=>
val fpg = new FPGrowth().setMinSupport(0.05)
val model = fpg.run(transactions)
model.freqItemsets.collect().foreach { itemset =>
println(itemset.items.mkString("[", ",", "]") + ", " +
itemset.freq)
}
val minConfidence = 0.5
model.generateAssociationRules(minConfidence).collect().fore
ach { rule =>
println(
rule.antecedent.mkString("[", ",", "]")
+ " => " + rule.consequent .mkString("[", ",", "]")
+ ", " + rule.confidence)
}
В результате выполнения получаем (рис. 4.5).
Оцениваем результат. Для этого необходимо измерить время работы программы для различных исходных данных. Это делаем с помощью функции System.currentTimeMillis()).
Для этого в самое начало выполнения программы (после import)
пишем команду: val t0 = System.currentTimeMillis() и получаем время, которое было на момент запуска программы. Далее перед
строчкой val minConfidence = 0.5 так же пишем команду:
val t1 = System.currentTimeMillis()
и в конце программы (до вывода результатов) выполняем команду:
println(t1 – t0). Изменяем минимальные поддержку
(MinSupp) и достоверность (MinConf), получаем результаты для разных случаев и заносим в заранее созданную для этого Excel–таблицу
(рис. 4.6), где в одной колонке содержатся значение MinSup, а в другой - время работы программы.
41
Рис. 4.5. Результат запуска программы с алгоритмом FPGrowth.
Рис. 4.6. Время работы алгоритма FPGrowth.
42
Если еще осталось время, можно, изменяя минимальные поддержку
(MinSupp) и достоверность (MinConf), получить результаты для разных случаев.
В) Тестируем алгоритм PrefixSpan
Вводим код программы в терминал системы:
import org.apache.spark.mllib.fpm.PrefixSpan
//импортируем библиотеки
val sequences = sc.parallelize(Seq(
Array(Array(1, 2), Array(3)),
Array(Array(1), Array(3, 2), Array(1, 2)),
Array(Array(1, 2), Array(5)),
Array(Array(6))
), 2).cache() //задаём последовательности
val prefixSpan = new PrefixSpan()
.setMinSupport(0.5) //Изменяемое значение параметра
MinSupp
.setMaxPatternLength(5)
//заводим переменную, отвечающую за работу алгоритма PrefixSpan, где указываем MinSupp и MaxPatternLength
val model = prefixSpan.run(sequences) )//запускаем
алгоритм PrefixSpan с указанными выше параметрами
model.freqSequences.collect().foreach { freqSequence =>
println(
freqSequence.sequence.map(_.mkString("[", ", ",
"]")).mkString("[", ", ", "]") +
", " + freqSequence.freq)
}//Печатаем найденные последовательности
Выборки приходится вставлять непосредственно в код (3-я строчка)
после команды: val sequences = sc.parallelize (Seq(.
Чтобы не работать руками, пишем на любом языке программирования
парсер для стандартных форматов. Если есть трудности с написанием,
то пишем этот парсер в любом текстовом редакторе, например,
NotePad++.
Можно распарсить выборку самостоятельно.
Формат входных данных для алгоритма
JavaRDD<List<List<Integer>>>
43
Пример. Есть выборка:
123
456
789
Открываем файл с выборкой в Notepad++. Открываем замену
символов. Заменяем пробелы на запятые. Заменяем начало строки на
“Array(Array(“. Конец строки заменяем на “ )),”. Копируем
полученное в код программы и запускаем.
Результаты так же заносим в excel-таблицу и файл.
Здесь можно также изменять минимальную поддержку (MinSupp).
4.3. Сравнение алгоритмов
Сравниваем время работы алгоритмов на одних и тех же выборках.
Находим отличия.
4.4. Контрольные вопросы
1. В чём идея алгоритма FP-growth?
2. Важен ли порядок предметов в транзакции для алгоритма FPgrowth?
3. В чём идея алгоритма PrefixSpan?
4. Важен ли порядок предметов в транзакции для алгоритма PrefixSpan?
5. В чём сходство и отличие FP-growth и PrefixSpan?
6. С какими типами структур выборок могут работать алгоритмы
PrefixSpan и FP-growth?
7. Как загружать программу из файла?
8. С помощью какой функции можно измерять время работы программы?
9. Что за параметры MinConf и MinSupport?
10. На каком из файлов будет работать лучше FP-growth?
11. На каком из файлов будет работать лучше PrefixSpan?
12. В каких случаях корректно сравнение алгоритмов?
44
5. Лабораторная работа №5. Управление очередями сообщений.
Введение в Apache Kafka
Цель работы: изучение процессов установки и запуска Apache
Kafka-сервера и работы с ним при передаче и получении тестовых
сообщений, чтобы на личном опыте убедиться в главных преимуществах распределенного программного брокера сообщений Kafka, таких как масштабируемость и отказоустойчивость.
5.1. Теоретическая часть
Введение
Apache Kafka, как известно с официального сайта программного
продукта, - это распределенная система передачи сообщений с открытым исходным кодом, которая позволяет разрабатывать приложения, использующие потоковые данные в режиме реального времени. Само по себе определение не раскрывает, что же такое Kafka,
и, чем она лучше других брокеров. На самом деле идея Kafka очень
проста. В большой распределенной системе обычно много сервисов,
которые генерируют разные события: логи, данные мониторинга,
замеченные попытки доступа к секретным ресурсам, и т. п. С другой
стороны, есть сервисы, которым эти данные очень нужны. И, тут
появляется Kafka: он находится (см. рис. 5.1) между продюсерами и
консьюмерами данных (producer & consumer): собирает данные у
первых, хранит их у себя в распределенном хранилище по топикам,
и раздаёт вторым по подписке. Другими словами, Kafka — это гибрид распределенной базы данных и очереди сообщений.
Рис. 5.1. Структура взаимодействия источников и
потребителей информации.
Основные преимущества брокера Kafka
1. В отличие от обычных брокеров, которые удаляют сообщения
сразу же после успешной доставки, Kafka хранит их столько, сколь
45
ко скажут. По умолчанию — неделю. Это удобно, потому что, подписываясь на топик в Kafka можно получить и те сообщения, которые публиковались позавчера.
2. Цифры попадаются разные, но Kafka превосходит по производительности многие популярные брокеры, например, такие как
ActiveMQ и RabbitMQ. По некоторым источникам зафиксированная
пропускная способность Kafka: 100K сообщений в секунду, а у
RabbitMQ всего 20К.
3. Кластеризация. Тут всё очень просто: даже один Kafkaброкер — это кластер. Для того чтобы добавить ему второй, никаких
особых настроек делать не надо. В тех брокерах, которые поддерживают кластеризацию, обычно нужны дополнительные настройки.
4. Kafka всегда сохраняет сообщения на диск. Очереди сообщений, которые это умеют делать, обычно требуют подобное сохранение явно включать (те же MSMQ, RabbitMQ).
5. Доступность. Топики с сообщениями можно разбить на разделы (partition) и распределить внутри кластера, а затем еще включить и репликацию. На выходе вырастет пропускная способность,
ведь один топик теперь хранится и обслуживается несколькими брокерами, и, даже если один из брокеров «умрёт», где-то останется
реплика его данных, и всё обойдётся без потерь. Хотя некоторые
очереди сообщений тоже умеют делать репликацию, из них нет ни
одной, которая умеет дробить свои очереди на части и распределять
по кластеру.
5.2. Практическая часть
Для начала необходимо открыть виртуальную машину и запустить
Cloudera, как мы делали в предыдущих лабораторных работах.
ВАЖНО! Если вы запустили VM, а она оказалось пустой не отчаивайтесь. Откройте проводник. Войдите на диск D (у кого-то E). Перейдите в папку VM и найдите файл как показано на рис. 5.2.
После этого кликните правой кнопкой мыши → открыть с помощью
→ vmware player. Дальше можно спокойно выполнять лабораторную
работу.
46
Рис. 5.2. Выбор файла виртуальной машины.
Как запустить Kafka
Kafka нужен вспомогательный сервис для того, чтобы координировать работу всех своих брокеров в кластере, и имя этому сервису —
ZooKeeper (рис. 5.3).
Рис. 5.3. Взаимодействие ZooKeeper и Kafka.
Когда создаётся новый топик, добавляется новый брокер или удаля47
ется старый, ZooKeeper — это тот программный продукт, который
будет со всем этим разбирается. Он решит, куда поместить новый
топик, чем загрузить нового брокера, и даже как сбалансировать
набор реплик, если часть из них ушла вместе с упавшим сервисом.
ZooKeeper является надсмотрщиком и координатором, и, поэтому
его необходимо запускать первым.
Шаг 1
Скачиваем архив с Kafka (на почте или по этой ссылке
http://kafka.apache.org/downloads.html )
Перекидываем его на рабочий стол. (Версия может отличаться).
После чего открываем консоль, и переходим в директорию с Kafka,
указав до нее путь.
cd /HOME/DESKTOP/Kafka/kafka_2.11-0.10.0.0
Данную команду можно заменить, если кликнуть правой кнопкой
мыши по тому расположению, в котором нужно открыть консоль, и
выбрать пункт Open in Terminal. После чего консоль откроется с уже
заданным путем, и нужно будет только ввести команду.
Запуск ZooKeeper
./bin/zookeeper-server-start.sh
fig/zookeeper.properties
con-
Запуск Kafka сервера
./bin/kafka-server-start.sh
fig/server.properties
con-
Запускайте и брокер и ZooKeeper в отдельной консоли. После чего
сворачивайте ее. И все остальные команды выполняйте в новых консолях.
48
Шаг 2
Создаем топик
./bin/kafka-topics.sh --zookeeper localhost:2181 -create --topic MyTopic --partitions 1 -replication-factor 1
Немного пояснений по операции:
--replication-factor 1. «Один» означает, что будет только одна копия
топика, и если хранящий его хост уйдёт в никуда, данные пойдут
следом. С другой стороны, если бы у нас было два хоста, и коэффициент тоже выбрали «2», то каждый хост получил бы свою копию
топика.
-- partitions 1 — тоже единица. То есть наш топик будет храниться в
одном монолитном хранилище. Если вдруг топик будет большим —
больше, чем позволяет файловая система, и/или хост, который его
держит, может и справиться со всеми входящими запросами, то его
можно разбить на несколько разделов, которые, скорее всего, окажутся на разных хостах. Если еще включить репликацию, то получится кластер удивительной надежности.
Можно проверить свой топик
./bin/kafka-topics.sh --zookeeper localhost:2181 -list
test-topic
./bin/kafka-topics.sh --zookeeper localhost:2181 -describe --topic MyTopic
Topic:test-topic
PartitionCount:1
tionFactor:1 Configs:
Topic: test-topic
Replicas: 0 Isr: 0
Partition: 0
49
ReplicaLeader: 0
Шаг 3
Запуск потребителя (consumer):
./bin/kafka-console-consumer.sh --bootstrapserver localhost:9092 --topic MyTopic
На другом терминале запустите производителя (producer) и отправьте несколько сообщений. По умолчанию инструмент отправляет каждую строку в виде отдельного сообщения для брокера без
специальной кодировки. Напишите несколько строк и выйдите с помощью CTRL + D или CTRL + C:
./bin/kafka-console-producer.sh --broker-list
localhost:9092 --topic MyTopic
a message
another message
^D
Сообщения должны появляться в потребительском термине.
Останавливаем Kafka и Zookeeper
./bin/kafka-server-stop.sh
./bin/zookeeper-server-stop.sh
Шаг 4
Запустить кластер с несколькими брокерами
Чтобы избежать столкновения, мы создаем файл server properties для
каждого брокера, и изменяем свойства конфигурации id port и
logfile.
Копирование:
cp config/server.properties config/server1.properties
50
cp config/server.properties config/server2.properties
После этого в вашей папке с Kafka появится два файла server1.properties и server-2.properties. Откройте их любым текстовым редактором и отредактируйте как на картинке
broker.id=1
listeners=PLAINTEXT://:9093
log.dirs=/usr/local/var/lib/kafka-logs-1
broker.id=2
listeners=PLAINTEXT://:9094
log.dirs=/usr/local/var/lib/kafka-logs-2
Замечание:
1) Когда будете редактировать log.dirs путь может не совпадать с
тем, что указан на приведенной картинке. В этом нет ничего страшного, просто теперь необходимо добавить к уже существующему
пути -1 или -2 в зависимости от номера файла который редактируете.
2) При редактирование listeners уберите знак # (комментарий) перед
ним.
Запустите трех брокеров: (Откройте новую консоль, запустите
ZooKeeper из Шага 1 и, затем выполните команды, расположенные
ниже).
./bin/kafka-server-start.sh config/server.properties &
./bin/kafka-server-start.sh config/server1.properties &
./bin/kafka-server-start.sh config/server2.properties &
51
Создание реплицированной темы
./bin/kafka-topics.sh --zookeeper localhost:2181 -create --replication-factor 3 --partitions 1 --topic
replicated-topic
./bin/kafka-topics.sh --zookeeper localhost:2181 -describe --topic replicated-topic
Topic:replicated-topic
Factor:3 Configs:
PartitionCount:1
Topic: replicated-topic Partition: 0
licas: 1,2,0 Isr: 1,2,0
ReplicationLeader: 1
Rep-
На этот раз есть дополнительная информация:
 «Leader» - это узел, ответственный за все чтения и записи для
данного раздела. Каждый узел будет лидером для случайно выбранной части разделов.
 «Replicas» - это список узлов, которые реплицируют журнал для
этого раздела независимо от того, являются ли они лидером или даже если они в настоящее время живы.
 «Isr» - это набор реплик «in-sync». Это подмножество списка
реплик, которое в настоящее время живо и подхвачено лидером.
Обратите внимание, что ранее созданный раздел остается неизменным.
Если не получилось запустить брокеры, можно перейти к Шагу 6.
Шаг 5
Проверка отказоустойчивости
Опубликуйте сообщение в новой теме:
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic replicated-topic
hello 1
hello 2
^C
52
Убейте лидера (1 в нашем примере).
ps aux | grep server-1.properties
kill -9 <PID>
Оцените результат
./bin/kafka-topics.sh --zookeeper localhost:2181 -describe --topic replicated-topic
Topic:replicated-topic
Factor:3 Configs:
PartitionCount:1
Topic: replicated-topic Partition: 0
licas: 1,2,0 Isr: 2,0
ReplicationLeader: 2
Rep-
Руководство сильнее переключилось с брокера-лидера 1 на брокерлидер 2 (сравнить с последней строкой последней картинки п.4), а
брокер 1 стал несинхронным. Но сообщения все еще существуют
(используйте потребитель для проверки самостоятельно).
Очистка
Удалите две темы, используя:
./bin/kafka-topics.sh --zookeeper localhost:2181 -delete --topic test-topic
./bin/kafka-topics.sh --zookeeper localhost:2181 -delete --topic replicated-topic
Шаг 6
В общем случае, в Kafka отправитель отсылает сообщения в формате
“ключ-значение”, до этого мы отправляли сообщения, содержащие
текст без указания ключа, который проставлялся как null. Попробуем самостоятельно отправить сообщения с явным указанием ключа.
Отправлять сообщения с ключом:
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test-topic \
--property parse.key=true \
53
--property key.separator=,
key 1, message 1
key 2, message 2
null, message 3
^D
Отправлять сообщения из файла:
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test_topic < file.log
5.3. Заключение
Apache Kafka очень производительный инструмент, который нужен
для перенаправления потоков данных из одного места в другое, с
обработкой и без. Проект достаточно зрелый, и среди тех, кто его
активно использует, много гигантов IT индустрии: LinkedIn, Netflix,
Yahoo, Twitter, Pinterest, и др. Проект стал невероятно популярным
во многом благодаря своим неоспоримым преимуществам: легкость
настройки, масштабируемость, высокая пропускная способность и
надежность.
5.4. Контрольные вопросы
1. В чем основное отличие Apache Kafka от традиционных систем
обмена сообщениями?
2. Каким образом осуществляется координация работы брокеров в
Kafka?
3. Чем отличается потребитель от поставщика?
4. Какое количество времени брокер Kafka хранит сообщения?
5. Какова задокументированная пропускная способность Kafka?
6. Куда Apache Kafka сохраняет сообщения?
7. Почему настроить кластеризацию в Kafka проще, чем в классических службах обмена сообщениями?
8. Что такое топик в терминах Kafka? Можно ли привязать несколько брокеров к одному топику?
9. Что такое партиция (partition) в терминах Kafka?
54
10. Каким образом обеспечивается механизм репликации в Apache
Kafka?
11. Что такое Apache Zookeeper, как он связан с Apache Kafka?
12. Что будет, если запустить Kafka без Zookeeper? Что необходимо
запускать первым?
13. Какие параметры должны быть уникальным для каждого брокера в кластере Kafka?
14. Что означает ISR при выводе команды kafka-topics --describe?
15. Что задает параметр replication-factor при создании топика?
16. Чем отличается узел-лидер от других узлов в кластере?
17. Каким способом можно увеличить пропускную способность у
Kafka?
55
Список литературы
(жирным шрифтом выделена рекомендованная литература)
1. Чехарин Е.Е. Большие данные: большие проблемы // Перспективы науки и
образования. — 2016. — №3. — С. 7-11.
2. The Internet of Things. Режим доступа
https://www.cisco.com/web/offer/emear/38586/images/Presentations/P11.pdf (дата обращения 06.11.2018).
3. TAdviser. Большие данные (Big Data)
http://www.tadviser.ru/index.php/%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D1
%8F:%D0%91%D0%BE%D0%BB%D1%8C%D1%88%D0%B8%D0%B5_%D0%B4%
D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_(Big_Data)
4. TmaxSoft Россия: организации с устаревшей IT-инфраструктурой не смогут
использовать Большие Данные. http://lib.tssonline.ru/newstext.php?news_id=119362
(дата обращения 04.12.2018).
5. Обзор Apache Hive и HiveQL в Azure HDInsight, 23.04.2018
https://docs.microsoft.com/ru-ru/azure/hdinsight/hadoop/hdinsight-use-hive (дата обращения 04.12.2018).
6. Как не сломать кластер Apache Ignite с самого начала, 04.07.2018
https://habr.com/company/gridgain/blog/415973/ (дата обращения 04.12.2018).
7. Apache Ignite — кеш для баз данных, 25.02.2018 https://habr.com/post/349358/
8. Технологии анализа данных. Поиск последовательных шаблонов. Части 1
и 2. – Base Group Labs (дата обращения 04.12.2018).
https://basegroup.ru/community/articles/sequential-patterns-1
https://basegroup.ru/community/articles/sequential-patterns-2 .
9. Apache Kafka и миллионы сообщений в секунду, 22.11.2017
https://habr.com/company/tinkoff/blog/342892/ (дата обращения 04.12.2018).
10. Apache Kafka: обзор, 06.04.2018 https://habr.com/company/piter/blog/352978/
(дата обращения 04.12.2018).
11. Как быстро начать работу с Kafka https://zaleslaw.gitbooks.io/data-processingbook/content/intro-kak-bystro-nachat-rabotu-s-kafka.html (дата обращения 04.12.2018).
12. Виктор Бородаенко, Александр Ермаков Универсальная платформа обработки больших данных, - Открытые системы 03/2017
https://www.osp.ru/os/2017/03/13052699/ (дата обращения 04.12.2018).
56
Скачать