PIPES: Uma linguagem para processamento distribuído de eventos complexos

82
Uma Linguagem para Processamento Distribuído de Eventos Complexos Juan Lopes 24 de setembro de 2014

description

PIPES: Uma linguagem para processamento distribuído de eventos complexos

Transcript of PIPES: Uma linguagem para processamento distribuído de eventos complexos

Page 1: PIPES: Uma linguagem para processamento distribuído de eventos complexos

Uma Linguagem para Processamento Distribuído de Eventos Complexos

Juan Lopes24 de setembro de 2014

Page 2: PIPES: Uma linguagem para processamento distribuído de eventos complexos

➔ Pai do Miguel➔ Bacharel em Ciência da Computação (UERJ)➔ Mestrando em Ciências Computacionais (UERJ)➔ Viciado em algoritmos e competições de programação➔ Programador na Intelie➔ {github.com,twitter.com}/juanplopes

pipes.intelie.com#qconrio

Quem sou eu?Não que credenciais importem muito, mas esse slide já é tradicional

Page 3: PIPES: Uma linguagem para processamento distribuído de eventos complexos

➔ Pai do Miguel➔ Bacharel em Ciência da Computação (UERJ)➔ Mestrando em Ciências Computacionais (UERJ)➔ Viciado em algoritmos e competições de programação➔ Programador na Intelie➔ {github.com,twitter.com}/juanplopes➔ Aquele que separa vocês do happy hour. Foi mal.

pipes.intelie.com#qconrio

Quem sou eu?Não que credenciais importem muito, mas esse slide já é tradicional

Page 4: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

QConSP 2013Estruturas de dados probabilísticas

Page 5: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

QConSP 2013Estruturas de dados probabilísticas

Slidesjuanlopes.net/qconsp2013

Vídeoinfoq.com/br/presentations/analisando-fluxo-dados-tempo-real

Page 6: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com

Slidesjuanlopes.net/qconsp2013

Vídeoinfoq.com/br/presentations/analisando-fluxo-dados-tempo-real

#qconrio

Set membership

Bloom FiltersBurton H. Bloom (1970)

QConSP 2013Estruturas de dados probabilísticas

Page 7: PIPES: Uma linguagem para processamento distribuído de eventos complexos

Slidesjuanlopes.net/qconsp2013

Vídeoinfoq.com/br/presentations/analisando-fluxo-dados-tempo-real

pipes.intelie.com#qconrio

Multiset sumarization

Count-MinGraham Cormode, et al. (2003)

Set membership

Bloom FiltersBurton H. Bloom (1970)

QConSP 2013Estruturas de dados probabilísticas

Page 8: PIPES: Uma linguagem para processamento distribuído de eventos complexos

Slidesjuanlopes.net/qconsp2013

Vídeoinfoq.com/br/presentations/analisando-fluxo-dados-tempo-real

pipes.intelie.com#qconrio

Multiset sumarization

Count-MinGraham Cormode, et al. (2003)

Set cardinality

HyperLogLogPhilippe Flajolet, et al. (2007)

Set membership

Bloom FiltersBurton H. Bloom (1970)

QConSP 2013Estruturas de dados probabilísticas

Page 9: PIPES: Uma linguagem para processamento distribuído de eventos complexos

➔ Slides

juanlopes.net/qconrio2014

➔ Site e documentação

pipes.intelie.com

➔ Tutorial interativo

pipes.intelie.com/tutorial

pipes.intelie.com#qconrio

LinksNão precisa correr para anotar, esse slide irá voltar

Page 10: PIPES: Uma linguagem para processamento distribuído de eventos complexos

1 PROCESSAMENTO DE EVENTOS 101

2 POR QUE MAIS UMA LINGUAGEM DE CEP?

3 DETALHES DA LINGUAGEM

4 DEMOS

pipes.intelie.com

WHAT?

WHY?

HOW?

WTF?

#qconrio

AgendaPorque ter uma agenda sempre dá uma boa impressão

Page 11: PIPES: Uma linguagem para processamento distribuído de eventos complexos

1 PROCESSAMENTO DE EVENTOS 101

2 POR QUE MAIS UMA LINGUAGEM DE CEP?

3 DETALHES DA LINGUAGEM

4 DEMOS

pipes.intelie.com

WHAT?

WHY?

HOW?

WTF?

#qconrio

AgendaPorque ter uma agenda sempre dá uma boa impressão

1 PROCESSAMENTO DE EVENTOS 101 WHAT?

Page 12: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

An event is a significant change of state at a particular point in time.

Page 13: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

EventosOnde?

➔ Monitoração de infraestrutura➔ Análise de informações de negócio➔ Algorithmic trading➔ Bioinformática➔ Controle de tráfego urbano➔ Orquestração de software embarcardo➔ etc.

Page 14: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

EventosOnde?

➔ Monitoração de infraestrutura➔ Análise de informações de negócio➔ Algorithmic trading➔ Bioinformática➔ Controle de tráfego urbano➔ Orquestração de software embarcardo➔ etc.

Page 15: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

EventosOnde?

➔ Monitoração de infraestrutura➔ Análise de informações de negócio

Não há ferramenta universal.Considerar: Latência × Flexibilidade × Desempenho

Page 16: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

EventosSua infra está repleta deles

Page 17: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

EventosSua infra está repleta deles

eventos de negócio

logs

métricas

user analytics

auditoria

Page 18: PIPES: Uma linguagem para processamento distribuído de eventos complexos

eventos de negócio

logs

métricas

user analytics

auditoria

pipes.intelie.com#qconrio

EventosSua infra está repleta deles

?

Page 19: PIPES: Uma linguagem para processamento distribuído de eventos complexos

➔ Consultas contínuas➔ Primitivas temporais➔ Detecção de padrões➔ Janelas de eventos➔ Controle do output➔ Tudo em memória

pipes.intelie.com#qconrio

Por que não SQL?Por que não!

Page 20: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

Database InvertidoO índice fica nas consultas

dados consultas

consultasresultado

eventosresultados

modelorelacional

modelo baseado em eventos

foco no passadoconsultas sem estado

dados são o estado

foco no presenteconsultas com estado

dados sem estado

Page 21: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

FerramentasTem muita gente fazendo isso

Page 22: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

declare Sale @role( event )end

declare window Ticks Sale() over window:length(5) from entry-point MyEntryPointend

rule "More than 2 sale suceess in 5 events"when Number($cnt : intValue,intValue > 2) from accumulate( Sale (saleHappened == "Y") from window Ticks, count(1) )then System.out.println( "A sale has happened over " + $cnt +" events" );end

var forward = inputStream.AlterEventStartTime( s => s.StartTime.AddSeconds(1));

var query = from evt in inputStream from prev in forward where prev.Value < threshold && evt.Value > threshold select new { Time = evt.Time, Low = prev.Value, High = evt.Value };

Page 23: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

SELECT count(*) as fails, timestamp, local, description,FROM HttpMonitor(type = "error" OR description ="Timeout::Error") .std:groupwin(description) .win:time(15 minutes)

SELECT T.firstc, T.lastc, T.Ac1, T.Bc1, T.avgCc1, T.Dc1 FROM S0 MATCH_RECOGNIZE ( MEASURES first(C.c2) as firstc, last(C.c2) as lastc, avg(C.c1) as avgCc1, A.c1 as Ac1, B.c1 as Bc1, D.c1 as Dc1 PATTERN(A B C* D) DEFINE A as A.c1 = 30, B as B.c2 = 10.0, C as C.c1 = 7, D as D.c1 = 40) as T

Page 24: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

SELECT STREAM "SuspectLoginFailures"."accountNumber", "loginFailureCount", "transactionType", "amount"FROM "SuspectLoginFailures" OVER "lastFew"JOIN "Transactions" OVER "lastFew" ON "SuspectLoginFailures"."accountNumber" = "Transactions"."accountNumber"WHERE ("transactionType" = 'isDebit')WINDOW "lastFew" AS (RANGE INTERVAL '1' MINUTE PRECEDING);

CREATE OUTPUT STREAM TickStats AS SELECT openval() AS StartOfTimeSlice, avg(NumberTicks) AS AvgTicksPerSecond, stdev(NumberTicks) AS StdevTicksPerSecond, lastval(NumberTicks) AS LastTicksPerSecond, FeedName FROM TicksPerSecond [ SIZE 20 ADVANCE 1 ON StartOfTimeSlice PARTITION BY FeedName ] GROUP BY FeedName;

Page 25: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

Page 26: PIPES: Uma linguagem para processamento distribuído de eventos complexos

➔ ECA (Event–Condition–Action)

➔ ESP (Event Stream Processing)

➔ CEP (Complex Event Processing)

pipes.intelie.com#qconrio

NomenclaturaUm pouco de bikeshedding não faz mal a ninguém

Page 27: PIPES: Uma linguagem para processamento distribuído de eventos complexos

➔ ECA (Event–Condition–Action)

➔ ESP (Event Stream Processing)

➔ CEP (Complex Event Processing)

pipes.intelie.com#qconrio

NomenclaturaUm pouco de bikeshedding não faz mal a ninguém

Page 28: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

NomenclaturaPara falar a verdade, não há tanto consenso

CEP

ESP

alto desempenhoagregações complexas

causalidadeinferências complexas

Page 29: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

NomenclaturaPara falar a verdade, não há tanto consenso

detection-oriented

CEP

aggregation-oriented

CEP

Page 30: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

NomenclaturaPara falar a verdade, não há tanto consenso

detection-oriented

CEP

aggregation-oriented

CEP

Page 31: PIPES: Uma linguagem para processamento distribuído de eventos complexos

select count(*) from stream

pipes.intelie.com

EPL

#qconrio

AgregaçõesNo passado é simples

Page 32: PIPES: Uma linguagem para processamento distribuído de eventos complexos

select count(*) from stream

pipes.intelie.com

EPL

#qconrio

AgregaçõesNo passado é simples, mas e em tempo real?

public class AggregatorCount implements AggregationMethod{ protected long numDataPoints;

public void clear() { numDataPoints = 0; }

public void enter(Object object) { numDataPoints++; }

public void leave(Object object) { numDataPoints--; }

public Object getValue() { return numDataPoints; }}

JAVA

Page 33: PIPES: Uma linguagem para processamento distribuído de eventos complexos

public void leave(Object object) { numDataPoints--; sum -= ((Number) object).doubleValue(); }

public Object getValue() { if (numDataPoints == 0) return null; return sum / numDataPoints; }}

select avg(field) from stream

pipes.intelie.com

EPL

#qconrio

AgregaçõesNo passado é simples, mas e em tempo real?

public class AggregatorAvg implements AggregationMethod{ protected double sum; protected long numDataPoints;

public void clear() { sum = 0; numDataPoints = 0; }

public void enter(Object object) { numDataPoints++; sum += ((Number) object).doubleValue(); }

JAVA

Page 34: PIPES: Uma linguagem para processamento distribuído de eventos complexos

count(*) == 6

1 minute

select count(*) from stream.win:time(1 minute)

pipes.intelie.com

EPL

#qconrio

Enter, leave?A lógica em agregações sobre eventos é um pouco diferente

tempo

Page 35: PIPES: Uma linguagem para processamento distribuído de eventos complexos

count(*) == 5

1 minute

select count(*) from stream.win:time(1 minute)

pipes.intelie.com

EPL

#qconrio

Enter, leave?A lógica em agregações sobre eventos é um pouco diferente

tempo

leave enter

Page 36: PIPES: Uma linguagem para processamento distribuído de eventos complexos

➔ Agregações não precisam recalcular novos eventos➔ Algoritmos online são essenciais➔ Estabilidade numérica é importante; exemplo ruim:

pipes.intelie.com#qconrio

Janelas de eventosDefinem o conjunto de eventos sobre os quais a agregação irá executar

public class AggregatorAvg implements AggregationMethod{ //... public Object getValue() { if (numDataPoints == 0) return null; return sum / numDataPoints; } //...}

JAVA

Page 37: PIPES: Uma linguagem para processamento distribuído de eventos complexos

➔ Agregações não precisam recalcular novos eventos➔ Algoritmos online são essenciais➔ Estabilidade numérica é importante; exemplo bom:

pipes.intelie.com#qconrio

Janelas de eventosDefinem o conjunto de eventos sobre os quais a agregação irá executar

Page 38: PIPES: Uma linguagem para processamento distribuído de eventos complexos

select count(*) from stream.win:time(1 day)output last every 1 second

pipes.intelie.com

EPL

#qconrio

Janelas de tempoDifícil prever custo de memória

Page 39: PIPES: Uma linguagem para processamento distribuído de eventos complexos

select count(*) from stream.win:time(1 day)output last every 1 second

pipes.intelie.com

EPL

#qconrio

Janelas de tempoDifícil prever custo de memória

Bilhões de eventos por dia? OOM na certa.

java.lang.OutOfMemoryError: GC overhead limit exceeded

Page 40: PIPES: Uma linguagem para processamento distribuído de eventos complexos

1 PROCESSAMENTO DE EVENTOS 101

2 POR QUE MAIS UMA LINGUAGEM DE CEP?

3 DETALHES DA LINGUAGEM

4 DEMOS

pipes.intelie.com

WHAT?

WHY?

HOW?

WTF?

#qconrio

AgendaPorque ter uma agenda sempre dá uma boa impressão

2 POR QUE MAIS UMA LINGUAGEM DE CEP? WHY?

Page 41: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

Page 42: PIPES: Uma linguagem para processamento distribuído de eventos complexos

➔ Usado na Globo.com➔ Processa bilhões de linhas de log por dia➔ Índice full-text com Lucene modificado➔ Sistema completamente distribuído

Como processar esses logs em tempo real?

pipes.intelie.com#qconrio

Page 43: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

Page 44: PIPES: Uma linguagem para processamento distribuído de eventos complexos

➔ Usado na Globo.com e Walmart.com➔ Processa tanto eventos de infra quanto de negócio➔ Permite criar dashboards, alertas, relatórios, etc.➔ Processa centenas de eventos/segundo tranquilamente➔ Usa Esper como um dos motores de regras

Como escalar?

pipes.intelie.com#qconrio

Page 45: PIPES: Uma linguagem para processamento distribuído de eventos complexos

cluster

pipes.intelie.com#qconrio

LOGSe outros eventos

?

reports

graphs

alerts

Page 46: PIPES: Uma linguagem para processamento distribuído de eventos complexos

cluster

pipes.intelie.com#qconrio

LOGSe outros eventos

reports

graphs

alerts

Page 47: PIPES: Uma linguagem para processamento distribuído de eventos complexos

➔ Processar bilhões de eventos por dia (até 300 mil/s)➔ Suportar milhares de queries simultâneas➔ Permitir processamento distribuído!➔ Não onerar a rede excessivamente➔ Baixo consumo de memória➔ Em apenas uma passagem pelos dados

pipes.intelie.com#qconrio

Objetivos primáriosNão dava para simplesmente jogar o Esper aí

Page 48: PIPES: Uma linguagem para processamento distribuído de eventos complexos

➔ Filtros baseados na sintaxe do Lucene➔ Poder escrever consultas em apenas uma linha➔ Design monádico (esqueça SQL)➔ Mesmo permitindo processamento distribuído, também

fornecer ferramentas para single-node➔ Custo de memória o mais previsível possível

pipes.intelie.com#qconrio

Objetivos secundáriosJá que vamos criar uma linguagem nova...

Page 49: PIPES: Uma linguagem para processamento distribuído de eventos complexos

1 PROCESSAMENTO DE EVENTOS 101

2 POR QUE MAIS UMA LINGUAGEM DE CEP?

3 DETALHES DA LINGUAGEM

4 DEMOS

pipes.intelie.com

WHAT?

WHY?

HOW?

WTF?

#qconrio

AgendaPorque ter uma agenda sempre dá uma boa impressão

3 DETALHES DA LINGUAGEM HOW?

Page 50: PIPES: Uma linguagem para processamento distribuído de eventos complexos

➔ Slides

juanlopes.net/qconrio2014

➔ Site e documentação

pipes.intelie.com

➔ Tutorial interativo

pipes.intelie.com/tutorial

pipes.intelie.com#qconrio

LinksEu disse que voltaria; no final ele aparece de novo

Page 51: PIPES: Uma linguagem para processamento distribuído de eventos complexos

field:value => count() every minute

pipes.intelie.com

PIPES

#qconrio

Exemplo motivadorO mínimo que precisava ser feito

filtro agregação

Page 52: PIPES: Uma linguagem para processamento distribuído de eventos complexos

type:http status:404

pipes.intelie.com

PIPES

#qconrio

FiltrosJá que Lucene não tem real-time, implementamos o nosso

Page 53: PIPES: Uma linguagem para processamento distribuído de eventos complexos

type:http status:404

pipes.intelie.com

PIPES

#qconrio

FiltrosJá que Lucene não tem real-time, implementamos o nosso

type:http status:200 PIPES

type:http status:(2?? | 3??) PIPES

Page 54: PIPES: Uma linguagem para processamento distribuído de eventos complexos

type:http status:404

pipes.intelie.com

PIPES

#qconrio

FiltrosJá que Lucene não tem real-time, implementamos o nosso

type:http status:200 PIPES

type:http status:(2?? | 3??) PIPES

Page 55: PIPES: Uma linguagem para processamento distribuído de eventos complexos

type:http status:404

pipes.intelie.com

PIPES

#qconrio

FiltrosJá que Lucene não tem real-time, implementamos o nosso

type:http status:200 PIPES

type:http status:(2?? | 3??) PIPES

Page 56: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

Autômatos de filtroMinimizam o consumo de CPU dos filtros

??

field: type

field: status

http

2

3

404

??

and

00

and

or and

type:http status:404

type:http status:200

type:http status:(2?? | 3??)

Page 57: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

Autômatos na unhaRegex match em Java é NP-difícil (em Ruby, Python, Perl etc. também)

github.com/juanplopes/pyrex

Page 58: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

Autômatos na unhaEm alguns casos regex nem ajudaria tanto

blog.notdot.net/2010/07/Damn-Cool-Algorithms-Levenshtein-Automata

text:food~2 PIPES

Page 59: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

Tipos de filtro implementadosNem todos os tipos de filtro do Lucene foram implementados

➔ Match all:*

➔ Term: <field>:<term>

➔ Range:<field>:[<lower>, <upper>]

➔ Fuzzy: <field>:<term>~<number>

➔ AND: <filter> & <filter>

➔ OR:<filter> | <filter>

➔ NOT: -<filter>

Page 60: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

Composição de filtrosUm pouco mais poderosa até que a do Lucene

WebAccess PIPES

Page 61: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

Composição de filtrosUm pouco mais poderosa até que a do Lucene

WebAccess PIPES

WebAccess browser:firefox PIPES

Page 62: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

Composição de filtrosUm pouco mais poderosa até que a do Lucene

WebAccess PIPES

WebAccess browser:firefox PIPES

WebAccess browser:(firefox|chrome) PIPES

Page 63: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

Composição de filtrosUm pouco mais poderosa até que a do Lucene

WebAccess PIPES

WebAccess browser:firefox PIPES

WebAccess browser:(firefox|chrome) PIPES

WebAccess browser:(firefox|chrome|(IE* product_id#:[15, 60])) PIPES

Page 64: PIPES: Uma linguagem para processamento distribuído de eventos complexos

➔ Filtros não sabem dizer se um evento dá match ou não➔ Apenas sabem criar o autômato que reconhece um valor➔ Registrar um filtro significa adicionar ao autômato

transições que reconheçam o valor e listeners para estados de aceite

➔ Os eventos são submetidos aos autômatos (um para cada campo) e os matchs são notificados e encadeados

➔ Código complexo (e com alta cobertura)

pipes.intelie.com#qconrio

FiltrosUm pequeno resumo

Page 65: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

FiltrosUm pequeno resumo

??

field: type

field: status

http

2

3

404

??

and

00

and

or and

type:http status:404

type:http status:200

type:http status:(2?? | 3??)

Page 66: PIPES: Uma linguagem para processamento distribuído de eventos complexos

➔ A linguagem não assume nada sobre o tipo dos fluxos➔ Tipos são codificados na consulta, não em um schema

externo➔ Existe apenas um fluxo global e filtros sobre ele➔ Somente 8 tipos são tratados pela linguagem

pipes.intelie.com#qconrio

Tipagem estática, mas sem schemaO máximo para evitar problemas

Page 67: PIPES: Uma linguagem para processamento distribuído de eventos complexos

* => count() every minute

pipes.intelie.com

PIPES

#qconrio

AgregaçõesUma abordagem bem diferente do tradicional

count: 123

count: 456

count: 579

Page 68: PIPES: Uma linguagem para processamento distribuído de eventos complexos

* => avg(field#) every minute

pipes.intelie.com

PIPES

#qconrio

AgregaçõesUma abordagem bem diferente do tradicional

mean: 237.44sumw: 205

mean: 1061.08sumw: 57

mean: 416.63sumw: 262

Page 69: PIPES: Uma linguagem para processamento distribuído de eventos complexos

* => avg(response_time#):describe at the end

> {"sumw":2125.0,"mean":2.420657513400854}

pipes.intelie.com

MIXED

#qconrio

AgregaçõesCada agregação tem uma representação intermediária

* => (variance(response_time#)*count()):describe at the end

> {"trees":[{"sumw":2125.0,"mean":2.420657513400854,"m2":3582.7099512146638},{"value":3481}]}

MIXED

* => median(response_time#):describe at the end

> {"sketch":{"e":4.147768903288338E-5,"width":65536,"M":[...],"mask":65535,"total":2125.0}}

MIXED

Page 70: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

AgregaçõesToda agregação precisa implementar três conceitos

public interface Aggregation<T> extends Expression<T> { State newState(int flips); Merger newMerger(); T eval(Tree tree, WindowBounds bounds);}

public interface State { void yield(Object obj); Tree flip();}

public interface Merger { void add(Tree tree); void remove(Tree tree); void clear(); Tree get();}

JAVA

Page 71: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

AgregaçõesToda agregação precisa implementar três conceitos

intermediate representation

aggregation

window or reducer

tree

merger

event state

reducer

evaluator result

Page 72: PIPES: Uma linguagem para processamento distribuído de eventos complexos

count() == 16

5 minutes

* => count() over last 5 minutes every minute

pipes.intelie.com

PIPES

#qconrio

tempo

Janelas de eventosUsam o mesmo mecanismo para mesclar resultados

Page 73: PIPES: Uma linguagem para processamento distribuído de eventos complexos

count() == 16

5 minutes

3 4 2 2 5 4 2 3

* => count() over last 5 minutes every minute

pipes.intelie.com

PIPES

#qconrio

Janelas de eventosUsam o mesmo mecanismo para mesclar resultados

tempo

Page 74: PIPES: Uma linguagem para processamento distribuído de eventos complexos

➔ Vantagens◆ Quantidade de memória previsível em compile-time◆ Permite janelas muito maiores (mês, ano, etc.)

➔ Desvantagens◆ Output precisa ser compatível com janela◆ Janela precisa ter tamanho múltiplo do output

pipes.intelie.com#qconrio

Janelas de eventosUsam o mesmo mecanismo para mesclar resultados

Page 75: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

Por que o nome é Pipes?Unix pipelines

curl http://example.com | grep somestring | wc -l | xargs echo ‘Result:’ SHELL

curl grep wc xargs

Page 76: PIPES: Uma linguagem para processamento distribuído de eventos complexos

WebAccess=> count() by host over last 2 hours every 5 minutes=> @sort _ desc

pipes.intelie.com

PIPES

#qconrio

Encadeamento de queriesA saída de uma torna-se a entrada de outra

filter count sort

Page 77: PIPES: Uma linguagem para processamento distribuído de eventos complexos

Metric|WebAccess=> [ @filter \Metric kind:memory => avg(value#):bytes as mem by host every hour join on host @filter \Metric kind:'cpu load' => avg(value#):format('0%') as cpu by host every hour join on host @filter \WebAccess => count() as requests by host every hour]=> @sort requests desc

pipes.intelie.com

PIPES

#qconrio

Encadeamento de queriesA saída de uma torna-se a entrada de outra

filter

filter

sortfilter

filter

count

avg

avg

Page 78: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

Encadeamento de queriesA saída de uma torna-se a entrada de outra

single machine

filter safe semi-safe unsafesafe

reducer machine

mapper machine (1)

filter safesemi-safemapper

unsafesemi-safereducer

mapper machine (2)

filter safesemi-safemapper

safe

Page 79: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

Testes, testes e mais testesIsso não deveria ser mais novidade

➔ 17K functional SLOC➔ 21K test SLOC➔ 11K generated SLOC➔ 2260 test cases➔ 100% line coverage➔ 96% branch coverage

Page 80: PIPES: Uma linguagem para processamento distribuído de eventos complexos

1 PROCESSAMENTO DE EVENTOS 101

2 POR QUE MAIS UMA LINGUAGEM DE CEP?

3 DETALHES DA LINGUAGEM

4 DEMOS

pipes.intelie.com

WHAT?

WHY?

HOW?

WTF?

#qconrio

AgendaPorque ter uma agenda sempre dá uma boa impressão

4 DEMOS WTF?

Page 81: PIPES: Uma linguagem para processamento distribuído de eventos complexos

➔ Slides

juanlopes.net/qconrio2014

➔ Site e documentação

pipes.intelie.com

➔ Tutorial interativo

pipes.intelie.com/tutorial

pipes.intelie.com#qconrio

LinksAgora pode anotar

Page 82: PIPES: Uma linguagem para processamento distribuído de eventos complexos

pipes.intelie.com#qconrio

Obrigado!

@juanplopes