SlideShare a Scribd company logo
1 of 50
Download to read offline
Aleksandr Chermenin
October 26, 2017
КТО ЗДЕСЬ?
2
АЛЕКСАНДР
ЧЕРМЕНИН
aleksandr_chermenin@epam.com
Big Data Engineer
alex@chermenin.ru
▪ почти 20 лет пишу код
▪ 7 лет пишу код за деньги
▪ последние 5 лет – на Java
▪ около 2 лет – в Big Data
▪ больше года помогаю делать
Apache Flink лучше
ОБРАБОТКА ПОТОКОВЫХ ДАННЫХ
3
▪ Минимальные задержки
▪ Пакетная обработка?
• Пакет – всего лишь конечный поток
▪ Требования к обработчику
• Высокая пропускная способность
• Семантика exactly-once (желательно)
• Поддержка «времени событий»
ОБРАБОТКА СЛОЖНЫХ СОБЫТИЙ
Обработка сложных событий (Complex Event Processing, CEP) –
это метод отслеживания и обработки потоковых данных
из множества источников событий,
метод идентификации наиболее
значимых событий или их комбинации,
и последующей выработки соответствующих заключений,
а также способ быстрой реакции на эти события.
4
ОБРАБОТКА СЛОЖНЫХ СОБЫТИЙ
▪ Исходные события:
• Звонят колокола в церкви
• Мужчина в смокинге
• Женщина в белом платье
• Бросают рис
• Пролетают голуби
▪ Вывод: свадьба
5
(но это не точно)
ОБРАБОТКА СЛОЖНЫХ СОБЫТИЙ
6
2 часа
на
0.1
кгс/см²
3 сек
на
1.0
кгс/см²
ОБРАБОТКА СЛОЖНЫХ СОБЫТИЙ
7
▪ Анализ потока данных и формирование выводов
• поиск и сопоставление шаблонов
• создание новых событий
▪ Применение
• выявление мошенничества (Fraud detection)
• мониторинги
• алгоритмический трейдинг
▪ Требования к обработчику
• минимальные задержки
• семантика exactly-once и поддержка «времени событий»
APACHE FLINK
8
▪ Открытая система для распределённой обработки
в первую очередь потоковых данных
▪ Полностью соответствует требованиям
• высокая пропускная способность
• семантика exactly-once
• поддержка «времени событий» и различных «окон»
▪ DataStream API доступен на Java и Scala
▪ Flink CEP – с версии 1.0
РАБОТА С FLINK CEP
9
Формирование шаблона1
Применение шаблона к потоку данных2
Получение результата3
МОНИТОРИНГ
ПРИМЕР
ИСХОДНЫЕ ДАННЫЕ
11
▪ Поток данных мониторинга
• Температура
• Напряжение
▪ Ограничения
• Предел температуры
▪ Сложные события
• Предупреждения о превышении
предела температуры
КЛАССЫ СОБЫТИЙ
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
public class TemperatureWarning {
private int rackID;
private double averageTemperature;
…
}
public class TemperatureAlert {
private int rackID;
…
}
ШАБЛОН #1
14
Pattern<MonitoringEvent, ?> warningPattern =
Pattern.<MonitoringEvent>begin("First Event")
.subtype(TemperatureEvent.class)
.where(evt -> evt.getTemperature() >=
TEMPERATURE_THRESHOLD)
.followBy("Second Event")
.subtype(TemperatureEvent.class)
.where(evt -> evt.getTemperature() >=
TEMPERATURE_THRESHOLD)
.within(Time.seconds(10));
ПРИМЕНЕНИЕ ШАБЛОНА К ПОТОКУ
15
PatternStream<MonitoringEvent> tempPatternStream =
CEP.pattern(
inputEventStream.keyBy("rackID"),
warningPattern
);
ГЕНЕРАЦИЯ ПРЕДУПРЕЖДЕНИЙ
16
DataStream<TemperatureWarning> warnings = tempPatternStream.select(
(Map<String, MonitoringEvent> pattern) -> {
TemperatureEvent first = (TemperatureEvent) pattern.get("First Event");
TemperatureEvent second = (TemperatureEvent) pattern.get("Second Event");
return new TemperatureWarning(first.getRackID(),
(first.getTemperature() + second.getTemperature()) / 2);
});
ШАБЛОН #2
17
Pattern<TemperatureWarning, ?> alertPattern =
Pattern.<TemperatureWarning>begin("First Event")
.next("Second Event")
.within(Time.seconds(20));
PatternStream<TemperatureWarning> alertPatternStream =
CEP.pattern(
warnings.keyBy("rackID"),
alertPattern
);
ОТПРАВКА «ОЙ-ОЙ-ОЙ!!»
18
DataStream<TemperatureAlert> alerts = alertPatternStream.flatSelect(
(Map<String, TemperatureWarning> pattern, Collector<TemperatureAlert> out) -> {
TemperatureWarning first = pattern.get("First Event");
TemperatureWarning second = pattern.get("Second Event");
if (first.getAverageTemperature() < second.getAverageTemperature()) {
out.collect(new TemperatureAlert(first.getRackID()));
}
}
);
ДЕМО #1
20
А тут вышел
Apache Flink 1.3...
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)
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
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));
CEP PATTERN API (с версии 1.3)
24
subtype(subClass) pattern.subtype(SubEvent.class);
oneOrMore() pattern.oneOrMore();
times(#ofTimes) pattern.times(2);
optional() pattern.oneOrMore().optional();
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
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
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
}
});
ДЕМО #2
НЕСКОЛЬКО ПОТОКОВ?
29
30
Шаблон-то
типизирован!
ДЕМО #3
32
А скоро будет 1.4!
НОВОЕ В 1.4 –GROUP PATTERNS
33
Pattern<Event, ?> strict = start.next(
Pattern.<Event>begin("next_start").where(...)
.followedBy("next_middle").where(...)
).times(3);
Pattern<Event, ?> relaxed = start.followedBy(
Pattern.<Event>begin("followedby_start").where(...)
.followedBy("followedby_middle").where(...)
).oneOrMore();
НОВОЕ В 1.4 –GREEDY QUANTIFIER
34
▪ start.times(2, 4).greedy();
▪ start.times(2, 4).optional().greedy();
▪ start.oneOrMore().greedy();
▪ start.timesOrMore(2).greedy();
Не применимо к группам (GroupPattern)
НОВОЕ В 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);
НОВОЕ В 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
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
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
Поможет медитация...
39
...или немного магии
SIDDHI CEP
40
▪ Библиотека и платформа для обработки
сложных событий от компании WSO2
▪ Полностью открытый исходный код
• https://github.com/wso2/siddhi
▪ Написана на Java
▪ Легко расширяема
SIDDHI CEP
41
ПРИМЕР ЗАПРОСА
42
FROM
SymbolStream#window.lenght(1)
UNIDIRECTIONAL JOIN
StockExchangeStream#window.unique(symbol)[price > 100]
SELECT
StockExchangeStream.symbol as symbol,
StockExchangeStream.price as lastTradedPrice
INSERT INTO StockQuote
ПРИКРУТИМ FLINK
43
<dependencies>
<dependency>
<groupId>com.github.haoch</groupId>
<artifactId>flink-siddhi_2.10<artifactId>
<version>1.2-SNAPSHOT</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>clojars</id>
<url>http://clojars.org/repo/</url>
</repository>
</repositories>
• https://github.com/haoch/flink-siddhi
• https://github.com/chermenin/flink-siddhi
ПРИКРУТИМ FLINK
44
▪ Инициализация
• SiddhiCEP.getSiddhiEnvironment(env)
• SiddhiCEP.getExtendedSiddhiEnvironment(env)*
▪ Регистрация потока
• cep.registerStream(
"tempEvents", tempEvents, "rackID", "temperature«
);
ПРИКРУТИМ FLINK
45
▪ Запрос
cep.from("tempEvents").cql(
"from every e1 = tempEvents[temperature > 100] -> " +
"e2 = tempEvents[temperature > 100 and rackID == e1.rackID] " +
"within 10 seconds select e1.rackID, " +
"(e1.temperature + e2.temperature) / 2 as temperature " +
"insert into output")
.returns("output");
ДЕМО #4
ССЫЛКИ
Apache Flink Homepage
• http://flink.apache.org
Documentation
• https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/libs/cep.html
• https://docs.wso2.com/display/CEP420/SiddhiQL+Guide+3.1
Flink Siddhi
• https://github.com/chermenin/flink-siddhi
• https://github.com/haoch/flink-siddhi
47
ВОПРОСЫ?
По всем вопросам пишите: alex@chermenin.ru
По работе и проектам: aleksandr_chermenin@epam.com
Или в Telegram: @chermenin
https://github.com/chermenin/cep-monitoring
48
THE END…
СПАСИБО ЗА ВНИМАНИЕ!

More Related Content

What's hot

Аскетичная разработка браузера
Аскетичная разработка браузераАскетичная разработка браузера
Аскетичная разработка браузераPlatonov Sergey
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияAlexey Paznikov
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаAndrey Karpov
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Alexander Granin
 
Диаграммы состояний и c++
Диаграммы состояний и c++Диаграммы состояний и c++
Диаграммы состояний и c++corehard_by
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыPlatonov Sergey
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерSergey Platonov
 
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...Alexey Paznikov
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияPlatonov Sergey
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...Alexey Paznikov
 
Пояснения к статье про Copy-Paste
Пояснения к статье про Copy-PasteПояснения к статье про Copy-Paste
Пояснения к статье про Copy-PasteTatyanazaxarova
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 
Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!RAMBLER&Co
 
Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Andrey Karpov
 

What's hot (20)

C++ exceptions
C++ exceptionsC++ exceptions
C++ exceptions
 
Аскетичная разработка браузера
Аскетичная разработка браузераАскетичная разработка браузера
Аскетичная разработка браузера
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кода
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++
 
Диаграммы состояний и c++
Диаграммы состояний и c++Диаграммы состояний и c++
Диаграммы состояний и c++
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансы
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
 
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
 
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
 
Zagursky
ZagurskyZagursky
Zagursky
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
 
Пояснения к статье про Copy-Paste
Пояснения к статье про Copy-PasteПояснения к статье про Copy-Paste
Пояснения к статье про Copy-Paste
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!
 
Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?
 

Similar to Flink CEP и немного магии...

Finite State Machines and C++
Finite State Machines and C++Finite State Machines and C++
Finite State Machines and C++Klika Tech, Inc
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Ivan Tsyganov
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Googleyaevents
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Sigma Software
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...Alexey Paznikov
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Ivan Muratov
 
Сложности микробенчмаркинга
Сложности микробенчмаркингаСложности микробенчмаркинга
Сложности микробенчмаркингаAndrey Akinshin
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...solit
 
алгоритмизация
алгоритмизацияалгоритмизация
алгоритмизацияisva69
 
"FRP — делаем жизнь проще", Трдат Мкртчян, MoscowJS 19
"FRP — делаем жизнь проще", Трдат Мкртчян, MoscowJS 19"FRP — делаем жизнь проще", Трдат Мкртчян, MoscowJS 19
"FRP — делаем жизнь проще", Трдат Мкртчян, MoscowJS 19MoscowJS
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.sharikdp
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest
 

Similar to Flink CEP и немного магии... (20)

Finite State Machines and C++
Finite State Machines and C++Finite State Machines and C++
Finite State Machines and C++
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
 
Intro to Swift techitout
Intro to Swift techitoutIntro to Swift techitout
Intro to Swift techitout
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Java 8 puzzlers
Java 8 puzzlersJava 8 puzzlers
Java 8 puzzlers
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
 
Сложности микробенчмаркинга
Сложности микробенчмаркингаСложности микробенчмаркинга
Сложности микробенчмаркинга
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
 
алгоритмизация
алгоритмизацияалгоритмизация
алгоритмизация
 
"FRP — делаем жизнь проще", Трдат Мкртчян, MoscowJS 19
"FRP — делаем жизнь проще", Трдат Мкртчян, MoscowJS 19"FRP — делаем жизнь проще", Трдат Мкртчян, MoscowJS 19
"FRP — делаем жизнь проще", Трдат Мкртчян, MoscowJS 19
 
JavaDay'14
JavaDay'14JavaDay'14
JavaDay'14
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
 

Flink CEP и немного магии...

  • 2. КТО ЗДЕСЬ? 2 АЛЕКСАНДР ЧЕРМЕНИН aleksandr_chermenin@epam.com Big Data Engineer alex@chermenin.ru ▪ почти 20 лет пишу код ▪ 7 лет пишу код за деньги ▪ последние 5 лет – на Java ▪ около 2 лет – в Big Data ▪ больше года помогаю делать Apache Flink лучше
  • 3. ОБРАБОТКА ПОТОКОВЫХ ДАННЫХ 3 ▪ Минимальные задержки ▪ Пакетная обработка? • Пакет – всего лишь конечный поток ▪ Требования к обработчику • Высокая пропускная способность • Семантика exactly-once (желательно) • Поддержка «времени событий»
  • 4. ОБРАБОТКА СЛОЖНЫХ СОБЫТИЙ Обработка сложных событий (Complex Event Processing, CEP) – это метод отслеживания и обработки потоковых данных из множества источников событий, метод идентификации наиболее значимых событий или их комбинации, и последующей выработки соответствующих заключений, а также способ быстрой реакции на эти события. 4
  • 5. ОБРАБОТКА СЛОЖНЫХ СОБЫТИЙ ▪ Исходные события: • Звонят колокола в церкви • Мужчина в смокинге • Женщина в белом платье • Бросают рис • Пролетают голуби ▪ Вывод: свадьба 5 (но это не точно)
  • 6. ОБРАБОТКА СЛОЖНЫХ СОБЫТИЙ 6 2 часа на 0.1 кгс/см² 3 сек на 1.0 кгс/см²
  • 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; … }
  • 14. ШАБЛОН #1 14 Pattern<MonitoringEvent, ?> warningPattern = Pattern.<MonitoringEvent>begin("First Event") .subtype(TemperatureEvent.class) .where(evt -> evt.getTemperature() >= TEMPERATURE_THRESHOLD) .followBy("Second Event") .subtype(TemperatureEvent.class) .where(evt -> evt.getTemperature() >= TEMPERATURE_THRESHOLD) .within(Time.seconds(10));
  • 15. ПРИМЕНЕНИЕ ШАБЛОНА К ПОТОКУ 15 PatternStream<MonitoringEvent> tempPatternStream = CEP.pattern( inputEventStream.keyBy("rackID"), warningPattern );
  • 16. ГЕНЕРАЦИЯ ПРЕДУПРЕЖДЕНИЙ 16 DataStream<TemperatureWarning> warnings = tempPatternStream.select( (Map<String, MonitoringEvent> pattern) -> { TemperatureEvent first = (TemperatureEvent) pattern.get("First Event"); TemperatureEvent second = (TemperatureEvent) pattern.get("Second Event"); return new TemperatureWarning(first.getRackID(), (first.getTemperature() + second.getTemperature()) / 2); });
  • 17. ШАБЛОН #2 17 Pattern<TemperatureWarning, ?> alertPattern = Pattern.<TemperatureWarning>begin("First Event") .next("Second Event") .within(Time.seconds(20)); PatternStream<TemperatureWarning> alertPatternStream = CEP.pattern( warnings.keyBy("rackID"), alertPattern );
  • 18. ОТПРАВКА «ОЙ-ОЙ-ОЙ!!» 18 DataStream<TemperatureAlert> alerts = alertPatternStream.flatSelect( (Map<String, TemperatureWarning> pattern, Collector<TemperatureAlert> out) -> { TemperatureWarning first = pattern.get("First Event"); TemperatureWarning second = pattern.get("Second Event"); if (first.getAverageTemperature() < second.getAverageTemperature()) { out.collect(new TemperatureAlert(first.getRackID())); } } );
  • 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 } });
  • 33. НОВОЕ В 1.4 –GROUP PATTERNS 33 Pattern<Event, ?> strict = start.next( Pattern.<Event>begin("next_start").where(...) .followedBy("next_middle").where(...) ).times(3); Pattern<Event, ?> relaxed = start.followedBy( Pattern.<Event>begin("followedby_start").where(...) .followedBy("followedby_middle").where(...) ).oneOrMore();
  • 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 ▪ Легко расширяема
  • 42. ПРИМЕР ЗАПРОСА 42 FROM SymbolStream#window.lenght(1) UNIDIRECTIONAL JOIN StockExchangeStream#window.unique(symbol)[price > 100] SELECT StockExchangeStream.symbol as symbol, StockExchangeStream.price as lastTradedPrice INSERT INTO StockQuote
  • 44. ПРИКРУТИМ FLINK 44 ▪ Инициализация • SiddhiCEP.getSiddhiEnvironment(env) • SiddhiCEP.getExtendedSiddhiEnvironment(env)* ▪ Регистрация потока • cep.registerStream( "tempEvents", tempEvents, "rackID", "temperature« );
  • 45. ПРИКРУТИМ FLINK 45 ▪ Запрос cep.from("tempEvents").cql( "from every e1 = tempEvents[temperature > 100] -> " + "e2 = tempEvents[temperature > 100 and rackID == e1.rackID] " + "within 10 seconds select e1.rackID, " + "(e1.temperature + e2.temperature) / 2 as temperature " + "insert into output") .returns("output");
  • 47. ССЫЛКИ Apache Flink Homepage • http://flink.apache.org Documentation • https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/libs/cep.html • https://docs.wso2.com/display/CEP420/SiddhiQL+Guide+3.1 Flink Siddhi • https://github.com/chermenin/flink-siddhi • https://github.com/haoch/flink-siddhi 47
  • 48. ВОПРОСЫ? По всем вопросам пишите: alex@chermenin.ru По работе и проектам: aleksandr_chermenin@epam.com Или в Telegram: @chermenin https://github.com/chermenin/cep-monitoring 48