Conteúdo


Detecte eventos complexos em um fluxo de dados em tempo real

Desenvolva facilmente um aplicativo de detecção de eventos com o IBM Bluemix e o Streaming Analytics

Comments

Este artigo foi escrito usando a interface clássica do Bluemix. Dada a rápida evolução da tecnologia, algumas etapas e ilustrações podem ter mudado.

Deseja executar a detecção de eventos complexos em informações de fontes de dados em tempo real e agir rapidamente quando os eventos forem encontrados? É mais fácil do que você imagina, usando o IBM® Bluemix® e o Streaming Analytics . Para mostrar quão fácil é, construí um aplicativo Starter, que:

  • Usa o serviço Streaming Analytics em um aplicativo Node.js do Bluemix
  • Insere um fluxo de dados no Streaming Analytics
  • Reconhece padrões e detecta eventos no fluxo de dados
  • Envia os resultados da análise para o aplicativo do Bluemix

Esse tutorial explica como obter, executar e ampliar esse aplicativo Starter, chamado EventDetection. Aqui está uma visão geral gráfica dos componentes da solução:

Overview diagram of the event-detection solution
Overview diagram of the event-detection solution

O aplicativo EventDetection é implementado através do SDK para Node.js . O aplicativo fornece uma IU da web simples, para exibir o status e os resultados da análise. O aplicativo Node.js é vinculado a uma instância do serviço Streaming Analytics. O aplicativo controla o serviço através da API de REST do Streaming Analytics.

A analytics é realizada por um aplicativo IBM Streams , que implementa a detecção de eventos com relação a um fluxo de dados meteorológicos. Um pacote configurável de aplicativo Streams é enviado pelo aplicativo Node.js, para implementar o aplicativo Streams na instância do Streaming Analytics, à qual o aplicativo está vinculado.

Os dados analisados são dados meteorológicos, disponíveis na Internet pública da Administração Oceânica e Atmosférica Nacional (NOAA). Depois de o aplicativo Streams ser implementado na instância do Streaming Analytics, ele insere e analisa continuamente dados meteorológicos até que o aplicativo Streams seja interrompido.

Quando o aplicativo Streams detecta eventos, eles são enviados para o aplicativo Node.js, para exibição na IU da web do aplicativo.

É possível modificar o código-fonte do aplicativo Starter para customizá-lo ou ampliá-lo de diversas maneiras interessantes.

O que será necessário para desenvolver o aplicativo

Execute o aplicativoObtenha o código

Etapa 1. Crie um aplicativo do Bluemix e vincule ao serviço Streaming Analytics

  1. Efetue login no Bluemix. No painel, clique no botão CRIAR APLICATIVO . Escolha WEB quando solicitado um tipo de aplicativo a ser criado.
  2. Selecione SDK para Node.js a partir dos tempos de execução disponíveis no catálogo e clique em CONTINUAR. Insira um nome desejado e clique em CONCLUIR. Aguarde a conclusão da preparação de seu aplicativo.
  3. Retorne ao Painel e clique no nome do aplicativo. Na página de visão geral do aplicativo, clique no botão INCLUIR UM SERVIÇO OU UMA API .
  4. Clique no serviço Streaming Analytics na categoria Dados e Análise do catálogo e clique em CRIAR para ligá-lo ao aplicativo. Remonte o aplicativo quando solicitado.

Etapa 2. Obtenha sua própria cópia do código-fonte

O código para o aplicativo EventDetection está armazenado no projeto GitHub IBMStreams/samples . Para obter sua própria cópia do código-fonte, siga as etapas abaixo:

  1. Faça download do arquivo EventDetection.zip .
  2. Salve o arquivo ZIP localmente e extraia seus conteúdos.
  3. Renomeie o diretório que contém os arquivos extraídos para corresponder ao nome do aplicativo criado na Etapa 1.

Etapa 3. Implemente e visualize seu aplicativo

Agora, implemente o aplicativo Starter no estado em que se encontra, sem mudanças de código, e explore a IU. Mais adiante no tutorial, você terá uma chance de customizar o aplicativo e reimplementá-lo.

  1. A partir da linha de comandos do S.O., mude para o diretório que contém o aplicativo extraído.
  2. Conecte-se à instância do Bluemix do Cloud Foundry:

    cf api https://api.ng.bluemix.net

    cf login

  3. Implemente seu app:

    cf push yourapp

  4. No Bluemix, clique na rota do aplicativo para abrir o app. Você verá uma página da web básica com o título Bem-vindo ao Aplicativo Event Detection Sample! : Screenshot of the running EventDetection app
    Screenshot of the running EventDetection app

    A seção Fluxo do aplicativo lista as etapas sendo executadas pelo aplicativo e seu status.

    A seção Tipos de Evento define os tipos de eventos detectados pelo aplicativo.

    A seção Resultados do Aplicativo exibe os eventos conforme são detectados. Também exibe as temperaturas mais alta e mais baixa relatadas atualmente.

Etapa 4. Explore o aplicativo Streams em execução

  1. De volta ao Bluemix, acesse o painel de serviço de seu serviço Streaming Analytics. É possível acessar o painel de diversas maneiras, inclusive clicando no ícone do Streaming Analytics em seu aplicativo: Screenshot of the Streaming Analytics service icon
    O painel do Streaming Analytics, mostrado aqui, oferece tarefas para controlar sua instância e os links para informações relevantes: Screenshot of the Streaming Analytics service icon
    Screenshot of the Streaming Analytics service icon

    Também é possível usar o painel para iniciar o console do Streaming Analytics, que mostra informações sobre sua instância do Streaming Analytics.
  2. Clique no botão ATIVAR no painel para exibir o console do Streaming Analytics. Nesta captura de tela, o console mostra uma tarefa executando o — aplicativo Streams, que está realizando a detecção complexa de eventos: Screenshot of the Streaming Analystics console
    Screenshot of the Streaming Analystics console
  3. Maximize o painel Gráfico do Streams na parte superior direita do console, para mostrar o gráfico de fluxo do aplicativo Streams. Use os controles de zoom de seu navegador para obter uma visualização do gráfico inteiro. O gráfico mostra o status em tempo real do seu aplicativo Streams, à medida que ele é executado. É possível passar o mouse sobre os operadores no gráfico ou sobre as conexões entre eles, para obter informações mais detalhadas. Na captura de tela a seguir, ao passar o mouse sobre uma conexão no gráfico, são exibidas informações, como o número de tuplas que fluíram entre os dois primeiros operadores no gráfico: Screenshot of a connection in the Streams Graph
    Screenshot of a connection in the Streams Graph

Etapa 5. Revise o código do Node.js

O EventDetection é um aplicativo completo, embora simples, que não requer customização para ser executado. Para entender o aplicativo, examine seu código:

  1. Abra o arquivo app.js para visualizar a lógica de aplicativo. O código no app.js é organizado em torno de seis etapas principais:
    1. Extraia as informações de ambiente necessárias para usar a API de REST do Streaming Analytics.
    2. Verifique se a instância do Streams está em execução e inicie a instância, se necessário, através da API de REST do Streaming Analytics.
    3. Se a instância já estava em execução, verifique se uma tarefa de detecção de eventos do Streams já está sendo executada. Se uma tarefa estiver em execução, cancele-a.
    4. Implemente um pacote configurável de aplicativo Streams no serviço Streaming Analytics usando a API de REST do Streaming Analytics. O pacote configurável contém um aplicativo Streams, que analisa os dados meteorológicos e executa a detecção de eventos.
    5. Processe eventos detectados pelo aplicativo Streams e exiba-os nesta página da web.
    6. Cancele a tarefa correspondente ao aplicativo Streams após 3.000 eventos serem processados.

Verifique o código para identificar o local de execução dessas etapas. Examine mais detalhadamente algumas etapas no restante dessa seção.

  1. Examine o código para a implementação do item 1(d) — do pacote configurável de aplicativo Streams no serviço Streaming Analytics:
          ...
          // -----New form-----
          var form = new FormData();
    
          // -----File part-----
          form.append('file', fs.createReadStream('EventDetection.sab'), {
            contentType: 'application/octet-stream'
          });
    
          // -----JSON Part-----
    
          jsonObject = JSON.stringify({
            "jobName" :  "EventDetectionSample",
            "submissionParameters" :
            {
                "route" : app_uri,
            },
          });
          console.info('JSON object part: ' + jsonObject);
    
          var buffer = new Buffer(jsonObject);
          form.append('my_buffer', buffer, {
            contentType: 'application/json',
            // The line below is not an actual file.  The name with the .json
            // extension is needed for the data in the buffer to be recognized
            // as json.
            "filename": "jparams.json"
          });
    
          // -----POST Params-----
          var uri_string = sa_props.jobs_path + '?bundle_id=EventDetection.sab';
    
          // -----SUBMIT POST-----
          var jsonPostRes = {};
    
          form.submit({
            protocol: 'https:',
            host: sa_props.rest_host,
            path: uri_string,
            headers: {'Authorization' : authbuf}
          }, function(err, res) {
             ...

    O código anterior executa um POST de HTTP para a API de REST do Streaming Analytics, usando o pacote de dados de formulário para enviar um formulário de diversas partes:
    • Uma parte do formulário é um arquivo chamado EventDetection.sab. Um arquivo .sab é um pacote configurável de aplicativo Streams, produto da compilação de um aplicativo Streams em um ambiente de desenvolvimento Streams. O EventDetection.sab contém o aplicativo Streams, que executa a detecção de eventos.
    • A outra parte é um objeto JSON, que contém outras informações para a implementação dos pacotes configuráveis, como o nome desejado para a tarefa que será executada na instância do Streaming Analytics e os parâmetros de tempo de envio para esse aplicativo. O aplicativo Streams possui somente um parâmetro de tempo de envio. Transmita a rota para seu aplicativo Node.js, para que o aplicativo Streams possa enviar eventos de volta ao aplicativo Node.js, conforme eles são detectados.
  2. Agora, examine o código do item 1(e), que processa os eventos detectados pelo aplicativo Streams. Esse código aparece perto do início do arquivo app.js e não na sequência de etapas, pois é chamado de forma assíncrona sempre que um evento é enviado do aplicativo Streams. O aplicativo Streams executa um POST de HTTP no aplicativo Node.js, para enviar um evento ao aplicativo. O código a seguir processa a carga útil JSON do evento e toma as medidas apropriadas.
    // POST handler for the events being sent back from the Streams application
    app.post('/', function(req, res){
        status_step[4] = "Processing Events";
    
        if (!cancelling) {
          console.info("In POST function");
          var jsonString = req.body.jsonString;
          console.info("POST message is: " + jsonString);
          var payload = JSON.parse(jsonString);
        
          if (payload.eventType == 'MaxMin Temp') {
            // Max or min temperature change
            maxmin = payload;
          }
          else {
            // Regular event
            eventCount++;
            console.info("Event total = " + eventCount);
    
            // Add event to the array used by the web user interface
            events.push(new Event(eventCount, payload));
         
            // Cancel the Streams job if we've reached the event target
            if (eventCount == eventTarget) {
              cancelling = true;
              console.info("EVENT TARGET REACHED...");
              console.info("STREAMS JOB WILL BE CANCELLED.");
              finalCancel(jobNumber.toString());
            }
          }
        }
        res.send();
    });

Etapa 6. Revise o código do aplicativo Streams

O aplicativo Streams usado é um aplicativo Streams completo, que não exige nenhuma customização para ser executado. O código-fonte transferido por download (ou clonado ou bifurcado) contém o código-fonte do aplicativo, assim como seu arquivo .sab pré-construído. Para entender o aplicativo Streams, examine seu código:

  1. Abra o arquivo EventDetection.spl (localizado no subdiretório spl do projeto). O código-fonte do aplicativo está escrito em SPL, uma linguagem orientada para fluxos de dados e operadores que atuam sobre eles.
  2. Verifique o código para localizar as declarações do operador e compare-as ao gráfico de fluxo visto no console do Streaming Analytics. Examine mais detalhadamente alguns dos operadores no restante dessa seção.
  3. Examine o código de um dos operadores, que detecta um evento complexo. O fragmento de código abaixo mostra um operador chamado MatchRegex, que é usado para detectar padrões em uma série de tuplas de dados em um fluxo. Os comentários do código descrevem a natureza do padrão M-shape que será detectado pelo operador:
      //
      // The first complex event is called "M-shape".  It triggers when the graph of the 
      // temperature for a weather station form's an M shape over a period of time.
      //
      // Detecting M shape patterns in weather data is not that useful, but recognizing an M shape in
      // financial trading is valuable and is referred to as a "double-top" stock pattern.
      //
      // See http://hirzels.com/martin/papers/debs12-cep.pdf for more information on this complex event
      // detection method, the double-top pattern and other patterns.
      //
      stream<WeatherSummary weatherValues, rstring event> TempMEvent = MatchRegex(WeatherSummary)
      {
        param
          pattern     : ". rise+ drop+ rise+ drop* deep";
          partitionBy : stationCode;    
          predicates  : {
    	rise = tempInF>First(tempInF)  && tempInF>=Last(tempInF),
    	drop = tempInF>=First(tempInF) && tempInF<Last(tempInF),
    	deep = tempInF<First(tempInF)	&& tempInF<Last(tempInF) };
        output
          TempMEvent : weatherValues=WeatherSummary, event="M-Shape Temp";
      }

    A declaração do operador define o padrão que você está tentando detectar usando a sintaxe de expressão regular, com um conjunto de predicados que também são definidos na declaração do operador. O operador procura a M-shape da temperatura em uma estação meteorológica, com base no conjunto de valores relatados por essa estação. Esse operador MatchRegex consome o fluxo WeatherSummary definido anteriormente no código SPL e produz um fluxo chamado TempMEvent. O operador divide as leituras da estação meteorológica em agrupamentos separados, pelo ID da estação meteorológica, e mantém o estado necessário para detectar o evento para cada estação meteorológica.

  4. Examine uma sequência de dois operadores, usados para enviar eventos de volta ao aplicativo Node.js:
      //
      // Send events to the application user interface by converting them to json and HTTPPost-ing
      // to the Node.js app
      //
      stream <rstring jsonString> JSONOutput = com.ibm.streamsx.json::TupleToJSON(OutputEvents)
      {
      }
      
      () as HttpEvents = HTTPPost(JSONOutput) {
        param
          headerContentType : "application/json";
          url : ((rstring) getSubmissionTimeValue("route"));
      }

    O primeiro operador no fragmento anterior converte uma tupla no fluxo em uma sequência JSON. Esse operador consome um fluxo chamado OutputEvents definido anteriormente no código SPL e produz um fluxo chamado JSONOutput. O próximo operador, chamado HTTPPost, consome o fluxo JSONOutput e envia a sequência JSON à rota para o aplicativo Node.js, através de um HTTP POST.

Etapa 7. Customize ou amplie o aplicativo

Agora que você está familiarizado com o aplicativo de introdução, é possível modificar o código-fonte do aplicativo para customização ou ampliação, de diversas maneiras interessantes:

  • Para fazer com que o aplicativo se mantenha em execução por mais tempo, modifique o código do Node.js em app.js, para mudar o valor de variável event_target de 3000 para um número mais alto.
  • Para definir um novo evento complexo a ser detectado pelo aplicativo Streams:
    1. Atualize o código SPL para incluir outro operador MatchRegex ao fluxo, para detectar um padrão a ser procurado.
    2. Atualize os operadores após seu novo operador MatchRegex no código SPL, para que seu novo tipo de evento seja enviado de volta ao aplicativo Node.js.

Para modificar o aplicativo:

  1. Planeje suas modificações.
  2. Mude o Node.js e/ou o código-fonte SPL para refletir suas customizações desejadas.
  3. Se você modificou o código SPL, será necessário recompilá-lo em um ambiente de desenvolvimento Streams e substituir o arquivo .sab transferido por download por essa versão atualizada.
  4. Implemente (envie por push) o aplicativo modificado ao Bluemix.

Conclusão

A detecção de eventos complexos com relação a um fluxo de dados em tempo real é simples de executar no Bluemix através do serviço Streaming Analytics. O aplicativo usado nesse tutorial irá ajudá-lo a começar. É possível mudar para os fluxos de dados que deseja analisar, definir os eventos que deseja detectar e atuar sobre esses eventos para atingir seus objetivos.


Recursos para download


Temas relacionados


Comentários

Acesse ou registre-se para adicionar e acompanhar os comentários.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Big data e análise de dados, Cloud computing
ArticleID=1057740
ArticleTitle=Detecte eventos complexos em um fluxo de dados em tempo real
publish-date=08082017