Использования библиотеки CEP для обработки событий с использованием Apache Flink, а также расширений возможностей по аналитике путём подключения Siddhi CEP.
3. ОБРАБОТКА ПОТОКОВЫХ ДАННЫХ
3
▪ Минимальные задержки
▪ Пакетная обработка?
• Пакет – всего лишь конечный поток
▪ Требования к обработчику
• Высокая пропускная способность
• Семантика exactly-once (желательно)
• Поддержка «времени событий»
4. ОБРАБОТКА СЛОЖНЫХ СОБЫТИЙ
Обработка сложных событий (Complex Event Processing, CEP) –
это метод отслеживания и обработки потоковых данных
из множества источников событий,
метод идентификации наиболее
значимых событий или их комбинации,
и последующей выработки соответствующих заключений,
а также способ быстрой реакции на эти события.
4
5. ОБРАБОТКА СЛОЖНЫХ СОБЫТИЙ
▪ Исходные события:
• Звонят колокола в церкви
• Мужчина в смокинге
• Женщина в белом платье
• Бросают рис
• Пролетают голуби
▪ Вывод: свадьба
5
(но это не точно)
7. ОБРАБОТКА СЛОЖНЫХ СОБЫТИЙ
7
▪ Анализ потока данных и формирование выводов
• поиск и сопоставление шаблонов
• создание новых событий
▪ Применение
• выявление мошенничества (Fraud detection)
• мониторинги
• алгоритмический трейдинг
▪ Требования к обработчику
• минимальные задержки
• семантика exactly-once и поддержка «времени событий»
8. APACHE FLINK
8
▪ Открытая система для распределённой обработки
в первую очередь потоковых данных
▪ Полностью соответствует требованиям
• высокая пропускная способность
• семантика exactly-once
• поддержка «времени событий» и различных «окон»
▪ DataStream API доступен на Java и Scala
▪ Flink CEP – с версии 1.0
9. РАБОТА С FLINK CEP
9
Формирование шаблона1
Применение шаблона к потоку данных2
Получение результата3
11. ИСХОДНЫЕ ДАННЫЕ
11
▪ Поток данных мониторинга
• Температура
• Напряжение
▪ Ограничения
• Предел температуры
▪ Сложные события
• Предупреждения о превышении
предела температуры
12. КЛАССЫ СОБЫТИЙ
12
public abstract class MonitoringEvent {
private int rackID;
…
}
public class TemperatureEvent extends MonitoringEvent {
private double temperature;
…
}
public class PowerEvent extends MonitoringEvent {
private double voltage;
…
}
13. КЛАССЫ СЛОЖНЫХ СОБЫТИЙ
13
public class TemperatureWarning {
private int rackID;
private double averageTemperature;
…
}
public class TemperatureAlert {
private int rackID;
…
}
21. CEP PATTERN API (с версии 1.3)
21
begin() Pattern<Event, ?> start = Pattern.<Event>begin("start");
next() Pattern<Event, ?> next = start.next("middle");
followedBy() Pattern<Event, ?> followedBy = start.followedBy("middle");
followedByAny() * Pattern<Event, ?> followedByAny =
start.followedByAny("middle");
* followedByAny (>=1.3) == followedBy (<= 1.2)
22. CEP PATTERN API (following)
22
▪ Исходный поток данных: C → D1 → A1 → B1 → D2 → A2 → B2
▪ Шаблон #1: C . followBy ( A ) . followBy ( B )
• C → A1 → B1
▪ Шаблон #2: C . followByAny ( A ) . followBy ( B )
• C → A1 → B1
• C → A2 → B2
23. CEP PATTERN API (с версии 1.3)
23
notNext() Pattern<...> notNext = start.notNext("not");
notFollowedBy() Pattern<...> notFollowedBy = start.notFllowedBy("not");
within(time) pattern.within(Time.seconds(10));
24. CEP PATTERN API (с версии 1.3)
24
subtype(subClass) pattern.subtype(SubEvent.class);
oneOrMore() pattern.oneOrMore();
times(#ofTimes) pattern.times(2);
optional() pattern.oneOrMore().optional();
25. CEP PATTERN API (с версии 1.3)
25
consecutive() pattern.oneOrMore().consecutive();
▪ input: C → D → A1 → A2 → A3 → D → A4 → B
▪ with:
• C → A1 → B
• C → A1 → A2 → B
• C → A1 → A2 → A3 → B
▪ without:
• C → A1 → B
• C → A1 → A2 → B
• C → A1 → A2 → A3 → B
• C → A1 → A2 → A3 → A4 → B
26. CEP PATTERN API (с версии 1.3)
26
allowCombinations() pattern.oneOrMore().allowCombinations();
▪ input: C → D → A1 → A2 → A3 → D → A4 → B
▪ with:
• C → A1 → B
• C → A1 → A2 → B
• C → A1 → A3 → B
• C → A1 → A4 → B
• C → A1 → A2 → A3 → B
• C → A1 → A2 → A4 → B
• C → A1 → A3 → A4 → B
• C → A1 → A2 → A3 → A4 → B
▪ without:
• C → A1 → B
• C → A1 → A2 → B
• C → A1 → A2 → A3 → B
• C → A1 → A2 → A3 → A4 → B
27. CEP PATTERN API (с версии 1.3)
27
where(condition) * pattern.where(new IterativeCondition<Event>() {
@Override
public boolean filter(Event value, Context ctx) {
context.getEventsForPattern("...") ...
return ... // some condition
}
});
34. НОВОЕ В 1.4 –GREEDY QUANTIFIER
34
▪ start.times(2, 4).greedy();
▪ start.times(2, 4).optional().greedy();
▪ start.oneOrMore().greedy();
▪ start.timesOrMore(2).greedy();
Не применимо к группам (GroupPattern)
35. НОВОЕ В 1.4 –AFTER MATCH SKIP STRATEGY
35
Исходные данные: A → B → C → D → E → F → G Шаблон: x{2} → y{2}
▪ NO_SKIP: A → B → C → D, B → C → D → E, C → D → E → F, D → E → F → G
▪ SKIP_PAST_LAST_EVENT: A → B → C → D
▪ SKIP_TO_FIRST[y]: A → B → C → D, C → D → E → F
▪ SKIP_TO_LAST[y]: A → B → C → D, D → E → F → G
AfterMatchSkipStrategy skipStrategy = ...
Pattern.begin("patternName", skipStrategy);
36. НОВОЕ В 1.4 –SIDE OUTPUT
36
OutputTag<String> outputTag = new OutputTag<String>("side-output"){};
DataStream<ComplexEvent> flatResult =
patternStream.flatSelect(
outputTag,
new PatternFlatTimeoutFunction<Event, TimeoutEvent>() {...},
new PatternFlatSelectFunction<Event, ComplexEvent>() {...}
);
DataStream<TimeoutEvent> timeoutFlatResult =
flatResult.getSideOutput(outputTag);
37. А ХОТЕЛОСЬ БЫ ТАК...
37
SELECT
MAX(temperature) as temperature
AVG(duration) as duration
FROM (
// CEP pattern
SELECT (b.tStamp - a.tStamp) as duration, b.temperature as temperature
FROM inputs
PATTERN
a FOLLOW BY b PARTITION BY rackId ORDER BY tStamp
WITHIN INTERVAL '10' SECONDS
WHERE a.temperature > THRESHOLD
AND b.temperature > THRESHOLD
)
GROUP BY
TUMBLE(tStamp, INTERVAL '10' MINUTES)
38. ...ИЛИ ТАК
38
SELECT *
FROM Ticker MATCH_RECOGNIZE (
PARTITION BY symbol
ORDER BY tstamp
MEASURES
STRT.tstamp AS start_tstamp,
LAST(DOWN.tstamp) AS bottom_tstamp,
LAST(UP.tstamp) AS end_tstamp
ONE ROW PER MATCH
AFTER MATCH SKIP TO LAST UP
PATTERN (STRT DOWN+ UP+)
DEFINE
DOWN AS DOWN.price < PREV(DOWN.price),
UP AS UP.price > PREV(UP.price)
) MR
ORDER BY MR.symbol, MR.start_tstamp;
FLIP-20
40. SIDDHI CEP
40
▪ Библиотека и платформа для обработки
сложных событий от компании WSO2
▪ Полностью открытый исходный код
• https://github.com/wso2/siddhi
▪ Написана на Java
▪ Легко расширяема
48. ВОПРОСЫ?
По всем вопросам пишите: alex@chermenin.ru
По работе и проектам: aleksandr_chermenin@epam.com
Или в Telegram: @chermenin
https://github.com/chermenin/cep-monitoring
48