Анализ потока данных в реальном времени с помощью Azure Stream Analytics

в 9:00, , рубрики: azure, cloud, Microsoft Azure, Stream, Блог компании Microsoft, облако, Облачные вычисления, поток

Анализ потока данных в реальном времени с помощью Azure Stream Analytics - 1

Месяц назад 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 Stream Analytics - 2

И как же здорово смотреть на подобные графики Azure Event Hubs:

Анализ потока данных в реальном времени с помощью Azure Stream Analytics - 3

Azure Event Hubs, миллионы сообщений. Только подумайте, сколько времени заняло бы у нас создание локальной тестовой лаборатории, для того чтобы обработать такой объем данных?

Ниже перечислены некоторые наиболее важные ограничения и известные проблемы Stream Analytics:

  • Географическая доступность предварительной версии сервиса (Центральный регион США и Западная Европа)
  • Квота потоковой единицы (12 потоковых единиц на azure на регион на подписку)
  • UTF-8 единственная поддерживаемая кодировка для входных источников данных CSV и JSON.
  • В предварительной версии недоступны некоторые классные счетчики производительности, например, считающие задержки.

Глядя на полученные результаты, я убежден, что Azure Event Hubs действительно может обеспечить пропускную способность в миллионы событий в секунду, а Stream Analytics действительно может обработать такое количество данных.

Полезные ссылки

Автор: maria_gore

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js