[Перевод] Анализ потока данных в реальном времени с помощью Azure Stream Analytics
Месяц назад Microsoft анонсировала предварительную версию нового сервиса — Azure Stream Analytics, созданного для потоковой обработки данных в режиме близкого к реальному времени.
Текущая версия Azure Stream Analytics подключается к Azure Event Hub и Azure Blob Storage для получения потока данных (носят название Inputs), а также к Event Hubs, Blob Storage, Azure SQL Database для записи результатов (Outputs). Обработчик потока (stream processor) проектируется с использованием языка похожего на SQL, что позволяет задавать обработку и преобразование потоковых данных в достоверную информацию в реальном времени.И здесь на передний план выходит мощь облака. Всего лишь за несколько шагов и пару часов вы сможете поднять надежную инфраструктуру, которая сможет обрабатывать десятки тысяч событий или сообщений в секунду.
Мне было очень любопытно узнать, как много можно добиться с помощью этого сервиса. Поэтому я составил тестовый сценарий. Основой для моего эксперимента стало руководство, которое можно найти по этой ссылке.
В руководстве есть небольшая неточность на шаге «Start the Job». Там написано, что вы должны перейти в раздел «configure» вашей задачи (Job) для того, чтобы настроить время начала работы задачи (job output). Однако, эта настройка находится не в разделе Configure. Этот параметр конфигурируется в окне где вы стартуете свою задачу.
Для того, чтоб сделать тест интереснее, я поменял следующие настройки:
Установил шкалу Event Hub на 10 единиц. Таким образом, потенциально можно достигнуть 10000 событий в секунду. Изменил код Event Hub для увеличения количества сообщений. Создал небольшой скрипт PowerShell для того, чтобы запустить N одновременных экземпляров приложения командной строки Все это сделал на виртуальной машине в том же датацентре Azure (Западная Европа), где работает Event Hub и Stream Analytics Изменения в исходном демо-коде Service Bus Event HubЯ удалил весь ненужный код (например, создание Event Hub). В итоге, мой файл Program.cs выглядит так:
static void Main (string[] args) { System.Net.ServicePointManager.DefaultConnectionLimit = 1024; eventHubName = «salhub»; Console.WriteLine («Start sending …»); Stopwatch sw = new Stopwatch (); sw.Start (); Paralelize (); sw.Stop (); Console.WriteLine («Completed in {0} ms», sw.ElapsedMilliseconds); Console.WriteLine («Press enter key to stop worker.»); Console.ReadLine (); }
static void Paralelize () { Task[] tasks = new Task[25]; for (int i = 0; i < 25; i++) { tasks[i] = new Task(()=>Send (2000)); } Parallel.ForEach (tasks, (t) => { t.Start (); }); Task.WaitAll (tasks); }
public static void Send (int eventCount) { Sender s = new Sender (eventHubName, eventCount); s.SendEvents (); } Теперь с помощью этого приложения командной строки я параллельно отправляю 25×2 000, или 50 000 сообщений. Чтобы сделать все еще веселее, я запущу приложение псевдо-параллельно, просто стартуя его 20 раз с помощью следующего скрипта PowerShell: for ($i=1; $i -le 20; $i++) { start .\BasicEventHubSample.exe } Таким образом, я запускаю процессы почти одновременно. И жду до конца, то есть пока все процессы не отправят свои сообщения. Двадцать раз по 50 000 сообщений сформируют 1 000 000 сообщений. Затем просто получу результат самой медленной операции. Конечно, все эти показатели немного приблизительны, но достаточны, чтобы дать мне представление о возможностях, которые у меня есть. Без необходимости вкладывать в дорогое оборудование и разработку сложных решений.Еще один момент — я запустил свою задачу stream analytics перед запуском приложений командной строки, качающих данные, просто чтобы убедиться, что процессор потока уже запущен до того, как я забросаю его данными.
Обратите внимание на некоторые моменты. В первую очередь сервис Stream Analytics пока еще в стадии предварительной версии, поэтому там могут быть сбои. Но конечный результат все равно просто поразительный.
Посмотрите на графики Event Hub и Stream Analytics — это просто потрясающе. Кстати, еще я убедился в том, что новые уровни производительности Azure SQL Database тоже потрясающие.
При таком объеме данных в Stream Analytics, у сервиса не возникло проблем записи результатов в единую базу данных уровня Basic (5 DTUs)! Я начал получать результаты в таблице моей базы данных SQL сразу, как только перешел от запуска программы в мою SQL Server Management Studio и смог увидеть результаты, поступающие в реальном времени.
И напоследок, я накачал 1 000 000 событий в Event Hub всего за 75 секунд! Это означает более чем 13 000 событий в секунду! Всего с помощью пары строк кода.
Как же здорово смотреть на графики, вроде этого:
И как же здорово смотреть на подобные графики Azure Event Hubs:
Azure Event Hubs, миллионы сообщений. Только подумайте, сколько времени заняло бы у нас создание локальной тестовой лаборатории, для того чтобы обработать такой объем данных?
Ниже перечислены некоторые наиболее важные ограничения и известные проблемы Stream Analytics:
Географическая доступность предварительной версии сервиса (Центральный регион США и Западная Европа) Квота потоковой единицы (12 потоковых единиц на azure на регион на подписку) UTF-8 единственная поддерживаемая кодировка для входных источников данных CSV и JSON. В предварительной версии недоступны некоторые классные счетчики производительности, например, считающие задержки. Глядя на полученные результаты, я убежден, что Azure Event Hubs действительно может обеспечить пропускную способность в миллионы событий в секунду, а Stream Analytics действительно может обработать такое количество данных.Полезные ссылки