Microsoft HDInsight. «Облачное» (и не только) будущее Hadoop
Объем данных, генерируемый и собираемый современными научно-исследовательским центрами, финансовыми институтами, социальными сетями, уже привычно измеряется петабайтами. Так в дата-центрах Facebook хранится уже более 15 млрд. изображений, нью-йоркская фондовая биржа NYSE создает и реплицирует ежедневно около 1 Тб данных, Большой адронный коллайдер получает около 1 Пб данных в секунду.
Очевидно, что задачи обработки больших объемов данных все чаще становятся не только перед крупными компаниями, но перед стартапами и небольшими исследовательскими группами.
Платформа Hadoop, которая, в принципе, успешно решает проблему Big Data для полу- и неструктурированных данных, в своем «чистом» виде предъявляет значительные требования как к квалификации администраторов Hadoop-кластера, так и к первоначальным финансовым затратам на аппаратное обеспечение такого кластера.
В такой ситуации симбиоз облачных технологий и платформы Hadoop все чаще представляется как крайне перспективный способ решения проблемы «Больших данных», имеющий крайне невысокий уровень входа (квалификация + затраты на запуск).
На сегодняшний день крупнейшие облачные провайдеры, с разной степенью близости к release-версии, предоставляют «Cloud Computing + Hadoop»-сервисы. Так Amazon в 2009 анонсировал Amazon Elastic MapReduce, Google в 2010 – Google MapperAPI, Microsoft в 2011 году – Windows Azure HDInsight.
Сервис от Microsoft в этом году показал высокую динамику развития и, в целом, предоставляет широкий спектр возможностей, связанных как с управлением, так и с разработкой и интеграцией с облачными сервисами Windows Azure и другими продуктами Microsoft.
1. HDInsight. Обзор, история, экосистема.
HDInsight – это решение Microsoft для развертывание платформы Hadoop на ОС семейства Windows Server и в облачной платформе Windows Azure.
HDInsight доступен в двух вариантах:
- как облачный сервис на Windows Azure – Windows Azure HDInsight (для доступа нужен инвайт);
- как локальный кластер на Windows Server 2008/2012 – Microsoft HDInsight to Windows Server (CTP) (установка доступна через WebPI, в том числе и на desktop-версиях Windows).
2011
О партнерстве Microsoft с Hortonworks, направленного на интеграцию платформы Hadoop в продукты Microsoft, было объявлено в октябре 2011 года на конференции Professional Association for SQL Server (PASS).
14 декабря того же года был представлен облачный сервис «Hadoop on Azure» (CTP), доступный по ограниченному количеству инвайтов.
2012
29 июня 2012 года вышло обновление сервиса Hadoop on Azure (Service Update 2). Самым заметным изменением по сравнению с прошлой версией сервиса стало увеличение мощности кластера в 2,5 раза.
Уже через 2 месяца (21 августа) было выпущено третье обновление Service Update 3, в числе нововведений которого были:
- REST API для постановки заданий (Job), запросов статуса выполнения и снятия заданий;
- возможность прямого доступа к кластеру через браузер;
- C# SDK v1.0;
- PowerShell cmdlets.
25 октября на конференции Strata Conference-Hadoop World было представлено решение HDInsight (развитие сервиса, ранее известного как «Hadoop on Azure»), которое позволяет разворачивать платформу Hadoop как на предприятиях (on-premise), так и по требованию (on-demand).
В октябре того же года запущен проект Microsoft .NET SDK for Hadoop, среди светлых целей которого создание Linq-to-Hive, Job Submission API и WebHDFS клиента.
На декабрь 2012 года HDInsight находится в стадии тестирования и, помимо Hadoop v1.0.1, включает в себя следующие компоненты*:
- Pig версии 0.9.3: высокоуровневый язык обработки данных и фреймворк исполнения этих запросов;
- Hive 0.9.0: инфраструктура распределенного хранения данных, поддерживающая запросы к данным;
- Mahout 0.5: машинное обучение;
- HCatalog 0.4.0: управление метаданными;
- Sqoop 1.4.2: перемещение больших объемов данных между Hadoop и хранилищами структурированных данных;
- Pegasus 2: анализ графов;
- Flume: распределенный высокодоступный сервис сбора, агрегации и перемещения данных логов в HDFS.
- Business intelligence tools, в т.ч.
- Hive ODBC Driver;
- Hive Add-in for Excel (доступен для скачивания через HDInsight Dashboard).
Разработку под HDInsight можно вести на C#, Java, JavaScript, Python.
HDInsight имеет возможность интеграции:
- с Active Directory для управления безопасностью и контроля доступа;
- с System Center для целей управления кластером;
- с облачными сервисами хранения Azure Blob Storage и Amazon S3 как с источниками данных.
Для Microsoft SQL Server 2012 Parallel Data Warehouse в 2013 году ожидается коннектор для SQL Server (для обмена данными), интеграция с SQL Server Integration Services (для загрузки данных) и с SQL Server Analysis Services (аналитика).
В последующей части статьи будет рассмотрен практический пример написания Hadoop-задания (Hadoop Job) подсчета слов на локально установленном решении HDInsight for Windows Server.
2. HDInsight. Практикум
Подготовка
Для начала установим через Web Platform Installer решение «Microsoft HDInsight for Windows Server CTP». После успешного завершения инсталляции решения, у нас появиться новый веб-узлы на локальном IIS и полезные ярлыки на рабочем столе.
WordCounter на JavaScript
Один из таких ярлыков, указывающий на веб-узел с говорящим названием «HadoopDashboard», нам и понадобиться. При переходе по этому ярлыку открывается контрольная панель HDInsight.
Перейдя по плитке «Interactive JavaScript», приступаем к созданию задания (Job) для нашего локального кластера. Начнем с задачи классического подсчета слов.
Для этого нам нужны будут несколько файлов с текстом (я взял речь одного из выступлений Мартина Лютера Кинга) и непосредственно сама javascript-логика подсчета в фазах map и reduce (листинг 1). По этой логике слова мы будем разделять при нахождении небуквенного символа (очевидно, что это не всегда так), кроме того, чтобы избавиться от «шума», не будем учитывать слова короче 3 символов.
Листинг 1. Файл wordCountJob.js
var map = function(key, value, context) {
var words = value.split(/[^a-zA-Z]/);
for (var i = 0; i < words.lenght; i++) {
if (words[i] !== "" && words[i].lenght > 3) {
context.write(words[i].toLowerCase(), 1);
}
}
};
var reduce = function (key, values, context) {
var sum = 0;
while (values.hasNext()) {
sum += parseInt(values.next());
}
context.write(key, sum);
};
Созданные для анализа текстовые файлы и javascript, сохраненный в файле wordCountJob.js, необходимо перенести в HDFS (листинг 2).
Листинг 2.
#mkdir wordcount // создаем директорию wordcount
fs.put("wordcount") // копируем в созданную директорию файлы с локального диска
fs.put("wordcount")
#ls wordcount // запрашивает листинг директории с анализируемыми данными
fs.put() // копируем в HDFS файл wordCountJob.js
#cat wordCountJob.js // просматриваем wordCountob.js
Проделанное выглядит приблизительно так:
Составляем запрос на получение первых 10 результатов, упорядоченных по убыванию:
pig.from("wordcount").mapReduce("wordCountJob.js", "word, count:long").orderBy("count DESC").take(49).to("output");
а так бы он выглядело для облачного хранилища Amazon S3:
pig.from("s3n://HDinsightTest/MartinLutherKing").mapReduce("wordCountJob.js", "word,
count:long").orderBy("count DESC").take(49).to("output");
Запускаем и в конце получаем что-то типа:
[main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher
- Success! (View Log)
Просмотрим результат в виде текстового вывода, а потом и графического.
js> #ls output // получаем список файлов в выходной директории
Found 3 items
-rw-r--r-- 1 hadoop supergroup 0 2012-12-12 08:47 /user/hadoop/output/_SUCCESS
drwxr-xr-x - hadoop supergroup 0 2012-12-12 08:47 /user/hadoop/output/_logs
-rw-r--r-- 1 hadoop supergroup 0 2012-12-12 08:47 /user/hadoop/output/part-r-00000
js> #cat output/part-r-00000 // просматриваем результат
Результат (слово / кол-во вхождений)
that 115they 65
this 57
their 50
must 50
have 48
with 39
will 38
vietnam 38
them 33
nation 27
from 26
when 23
world 23
which 22
america 22
speak 21
there 20
were 17
into 16
life 15
against 15
those 14
american 14
revolution 14
been 14
make 13
people 13
land 13
government 13
these 13
about 13
what 12
such 12
love 12
peace 12
more 11
over 11
even 11
than 11
great 11
only 10
being 10
violence 10
every 10
some 10
without 10
would 10
choice 10
js> file = fs.read("output")
js> data = parse(file.data, "word, count:long")
js> graph.bar(data) // строим график
Отрадно отметить, что Мартин Лютер Кинг так часто употреблял такие слова, как «любовь», «свобода», «выбор», «жизнь».
3. А что дальше?
По субъективному мнению автора задача подсчета частоты слов в текстовом фрагменте
(если обойтись без подключения морфологического разбора) не отличается сложностью
предметной области. И, как следствие, не вызывает замирания сердца дикого интереса ни у меня, ни у ИТ-сообщества.
Наиболее типичные «Big Data»-кейсы - это исследования, целью которых является:
- выявления сложных зависимостей в социальных сетях;
- антифрод-системы (выявление мошеннических действий) в финансовом секторе;
- исследования генома;
- анализ логов, etc.
Не буду углубляться дальше, так как это является темой отдельной статьи. Скажу лишь, что кейсы, решаемые на платформе Hadoop, в общем случае, обладают следующими свойствами:
- решаемая задача сводится к задаче параллельной по данным (с появлением YARN выполнение данного условия не критично);
- входные данные не помещаются в оперативную память;
- входные данные являются не- и/или полуструктурированными;
- входные данные не являются потоковыми данными;
- результат не является realtime-sensitive.
Поэтому, отвечая на вопрос, представленный в подзаголоке («что дальше?»), я поставил первой задачей сменить предметную область. Мой взгляд пал на финансовый сектор, в частности, на высокочастотный трейдинг** (High Frequency Trading, HFT).
Второй аспект, на который нужно взглянуть способом, отличным от предыдущего примера - это автоматизация вычислений.
Связка Javascript + Pig, доступная из HDInsight Dashboard, безусловно является мощным инструментом в руках аналитика, знакомого с предметной областью и программированием. Но все же это «человек посередине» и это ручной ввод. Для торгового робота такой подход очевидно является неприемлемым.
Справедливости ради, повторюсь, что HDInsight поддерживает выполнение задач через командную строку, что может здорово автоматизировать решение любой задачи анализа данных. Но для меня это скорее количественное улучшение, чем качественное.
А качественное улучшение – это разработка на одном из высокоуровневых языков программирования, поддерживаемых HDInsight. Среди таковых: Java, Python и C#.
Итак, мы определились с тем, что нужно изменить, чтобы о пользе от использования HDInsight, не стыдно было и начальнику показать, и на ИТ-конференции рассказать.
К сожалению, описание задач компонента анализа биржевых тиков и реализация этих задач (с приведением исходного кода) кроме того, что далеко до окончательной стадии, так еще и выходит за рамки темы и объемы статьи (но, уверяю, это дело времени).
Заключение
HDInsight – гибкое решение, позволяющее разработчику за довольно короткий срок развернуть Hadoop-кластер «on-premises» или заказать как «on-demand»-услугу в облаке, получив при этом на выбор широкий спектр языков программирования и знакомые (для .NET-разработчиков) инструменты разработки.
Тем самым, решение HDInsight беспрецедентно снижает уровень входа в разработку «Data-Intensive»-приложений. Что, в свою очередь, обязательно приведет к еще большей популяризации платформы Hadoop, MPP-приложений и востребованности таких приложений для бизнеса.
Источник вдохновения
- [1] Matt Winkler. Developing Big Data Analytics Applications with JavaScript and .NET for Windows Azure and Windows. Build 2012 Conference, 2012.
* Версии компонентов указаны на декабрь 2012 года
** Автор знает, что это не самый типичный кейс для Hadoop (в первую и единственную очередь, из-за чувствительность к real-time-расчетам). Но глаза боятся, а руки – делают голова - думает.