Аналіз потоку даних в реальному часі з допомогою Azure Stream Analytics



Місяць тому Microsoft анонсувала попередню версію нового сервісу — Azure Stream Analytics, створеного для потокової обробки даних в режимі близького до реального часу.

Поточна версія Azure Stream Analytics підключається до Azure Event Hub і Azure Blob Storage для отримання потоку даних (носять назву Inputs), а також до Event Hubs, Blob Storage, SQL Azure 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 — це просто приголомшливо. До речі, ще я переконався в тому, що нові рівні продуктивності SQL Azure 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 дійсно може обробити таку кількість даних.

Корисні посилання

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.