Descrever o streaming estruturado do Spark

Concluído

O streaming estruturado do Spark é uma plataforma popular para processamento na memória. Ele tem um paradigma unificado para lote e streaming. Tudo o que você aprende e usa para o lote pode usar para streaming, portanto, é fácil passar de enviar seus dados em lote para realizar o streaming de seus dados. O streaming do Spark é simplesmente um mecanismo executado sobre o Apache Spark.

What is Spark structured streaming

O Streaming Estruturado cria uma consulta de execução longa durante a qual você aplica operações aos dados de entrada, como seleção, projeção, agregação, janelas e junção do DataFrame de streaming com DataFrames de referência. Em seguida, você gera os resultados para o armazenamento de arquivo (Azure Storage Blobs ou Data Lake Storage) ou para qualquer repositório de dados usando código personalizado (como banco de dados SQL ou Power BI). Structured Streaming também fornece a saída para o console para depuração local e para uma tabela na memória para que você possa ver os dados gerados para depuração no HDInsight.

Fluxos como tabelas

O streaming estruturado do Spark representa um fluxo de dados como tabela que não é vinculada em camadas, ou seja, a tabela continuará a crescer conforme novos dados chegam. Essa tabela de entrada é processada continuamente por uma consulta de execução longa e os resultados são enviados a uma tabela de saída:

How Spark structured streaming represents data as tables

No Structured Streaming, os dados chegam ao sistema e são ingeridos imediatamente em uma tabela de entrada. Você grava as consultas (usando as APIs de DataFrame e conjuntos de dados) que executam operações nessa tabela de entrada. O resultado da consulta produz outra tabela, a tabela de resultados. A tabela de resultados contém os resultados da sua consulta, a partir da qual você extrai dados para um armazenamento de dados externo, como um banco de dados relacional. O tempo de quando os dados serão processados a partir da tabela de entrada é controlado pelo intervalo do gatilho. Por padrão, o intervalo do gatilho é zero, para que o Structured Streaming tente processar os dados assim que eles chegam. Na prática, isso significa que assim que o Structured Streaming termina de processar a execução da consulta anterior, ele inicia outro processamento executado quaisquer dados recebidos recentemente. É possível configurar o gatilho para executar em um intervalo, de modo que os dados de streaming sejam processados em lotes baseados em tempo.

Os dados na tabela de resultados podem conter apenas os dados que forem novos desde a última vez que a consulta foi processada (modo de acréscimo) ou a tabela pode ser atualizada a cada vez que houver novos dados, de modo que inclua todos os dados de saída assim que a consulta de streaming tiver iniciado (modo completo).

Modo de acréscimo

No modo de acréscimo, apenas as linhas adicionadas à tabela de resultados, desde a última execução de consulta estão presentes na tabela de resultados e gravadas no armazenamento externo. Por exemplo, a consulta mais simples apenas copia todos os dados da tabela de entrada para a tabela de resultados inalterada. Cada vez que um intervalo do gatilho expira, os novos dados são processados e as linhas que representam os novos dados aparecem na tabela de resultados.

Considere um cenário em que você está processando dados de preço de ação. Suponha que o primeiro gatilho processou um evento no tempo 00:01 para a ação MSFT com um valor de 95 dólares. No primeiro gatilho da consulta, apenas a linha com tempo 00:01 é exibida na tabela de resultados. No tempo 00:02, quando outro evento chega, apenas a nova linha é a linha com tempo 00:02 e, assim, a tabela de resultados só conterá essa linha.

How Spark structured streaming in append mode

Ao usar o modo de acréscimo, sua consulta aplicaria projeções (selecionando as colunas que são importantes), filtragem (separando somente linhas que correspondam a determinadas condições) ou associação (aumentando os dados com dados de uma tabela de pesquisa estática). O modo de acréscimo facilita o envio por push somente de novos pontos de dados relevantes para o armazenamento externo.

Modo completo

Considere o mesmo cenário, desta vez usando o modo completo. No modo completo, a tabela de saída inteira é atualizada em cada gatilho de modo que a tabela inclui dados não apenas da execução de gatilho mais recente, mas de todas as execuções. Você pode usar o modo completo para copiar os dados inalterados da tabela de entrada para a tabela de resultados. Em cada execução disparada, as novas linhas de resultado aparecem junto com todas as linhas anteriores. A tabela de resultados de saída acabará armazenando todos os dados coletados desde o início da consulta e, eventualmente, você ficará sem memória. O modo completo é destinado ao uso com consultas de agregação que resumem os dados de entrada de alguma forma, assim, a cada gatilho, a tabela de resultados é atualizada com um novo resumo.

Suponha que até agora haja cinco segundos de dados já processados, e é hora de processar os dados para o sexto segundo. A tabela de entrada tem eventos para o tempo 00:01 e o tempo 00:03. A meta dessa consulta de exemplo é apresentar o preço médio da ação a cada cinco segundos. A implementação desta consulta se aplica a uma agregação que usa todos os valores que caem em cada janela de cinco segundos, calcula a média do preço da ação e produz uma linha para o preço médio da ação durante esse intervalo. No final da primeira janela de 5 segundos, há duas tuplas: (00:01, 1, 95) e (00:03, 1, 98). Assim, para a janela 00:00-00:05, a agregação produz uma tupla com o preço médio de ações de US$ 96,50. Na próxima janela de cinco segundos, há apenas um ponto de dados no tempo 00:06, portanto, o preço da ação resultante é de US$ 98. No tempo 00:10, usando o modo completo, a tabela de resultados tem linhas para as duas janelas 00:00 – 00:05 e 05:00 – 00:10 porque a consulta produz todas as linhas agregadas, não apenas as novas. Assim, a tabela de resultados continua a crescer à medida que novas janelas são adicionadas.

How Spark structured streaming in complete mode

Nem todas as consultas usando o modo completo fazem a tabela crescer sem limites. Considere o exemplo anterior que, em vez de calcular a média do preço da ação por janela, a média era calculada pela ação. A tabela de resultados contém um número fixo de linhas (uma por dispositivo) com o preço médio da ação para as ações em todos os pontos de dados recebidos do dispositivo. À medida que novos preços de ação são recebidos, a tabela de resultados é atualizada para que as médias na tabela sejam atuais.

Quais são os benefícios do streaming estruturado do Spark?

No setor financeiro, o momento das transações é muito importante. Por exemplo, em uma bolsa de valores, a diferença entre o momento em que a negociação na bolsa de ações ocorre no mercado de ações, em que você recebe a transação e em que os dados são lidos importa. As instituições financeiras dependem desses dados críticos e do momento associado a eles.

Hora do evento, dados atrasados e marca d'água

O streaming estruturado do Spark sabe a diferença entre a hora do evento e a hora em que o evento foi processado pelo sistema. Cada evento é uma linha na tabela e a hora do evento é um valor de coluna na linha. Isso permite que as agregações baseadas em janela (por exemplo, o número de eventos a cada minuto) sejam apenas um agrupamento e uma agregação na coluna de tempo de evento – cada janela de tempo é um grupo e cada linha pode pertencer a várias janelas/grupos. Portanto, essas consultas de agregação com base em janela de tempo do evento podem ser definidas de modo consistente em um conjunto de dados estático, bem como em um fluxo, facilitando muito a vida de um Engenheiro de Dados.

Além disso, esse modelo controla naturalmente os dados que chegaram mais tarde do que o esperado com base na hora do evento. O Spark tem controle total sobre a atualização de agregações antigas quando há dados atrasados, bem como limpeza de agregações antigas para limitar o tamanho dos dados de estado intermediários. Além disso, como o Spark 2.1, o Spark dá suporte para marca d'água, o que permite especificar o limite de dados atrasados e possibilita permite que o mecanismo limpe o estado antigo de maneira adequada.

Flexibilidade para carregar dados recentes ou todos os dados

Conforme discutido na unidade anterior, você pode optar por usar o modo de acréscimo ou o modo completo ao trabalhar com o streaming estruturado do Spark para que a tabela de resultados inclua apenas os dados mais recentes ou todos os dados.

Dá suporte à movimentação de micro lotes para processamento contínuo

Ao alterar o tipo de gatilho de uma consulta do Spark, você pode passar do processamento de microlotes para o processamento contínuo sem outras alterações na estrutura. Aqui estão os diferentes tipos de gatilhos aos quais o Spark dá suporte.

  • Não especificado, esse é o padrão. Se nenhum gatilho for definido explicitamente, a consulta será executada em microlotes e será processada continuamente.
  • Intervalo fixo de microlote. A consulta é inicializada a intervalos recorrentes definidos pelo usuário. Se nenhum dado novo for recebido, nenhum processo de microlote será executado.
  • Microlote de ocorrência única. A consulta executa um microlote e para. Isso será útil se você quiser processar todos os dados desde o microlote anterior e poderá proporcionar economia de custo para trabalhos que não precisam ser executados continuamente.
  • Contínuo com um intervalo de ponto de verificação fixo. A consulta é executada em um novo modo de processamento contínuo e de baixa latência que permite uma baixa latência de ponta a ponta (~1 ms) com garantias de tolerância a falhas de pelo menos uma vez. Isso é semelhante ao padrão, que pode atingir garantias exatamente uma vez, mas só obtém latências de aproximadamente 100 ms.

Como combinar trabalhos de fluxo e lote

Além de simplificar a movimentação do lote para trabalhos de streaming, você também pode combinar trabalhos em lote e de streaming. Isso é especialmente útil quando você deseja usar dados históricos de longo prazo para prever tendências futuras durante o processamento de informações em tempo real. Para as ações, convém examinar o preço da ação nos últimos cinco anos, além do preço atual, para prever as alterações feitas em relação a anúncios anuais ou trimestrais de receita.

Janelas de tempo de evento

Talvez você queira capturar dados no Windows, como um preço de ação em alta e um preço de ação em baixa em uma janela de um dia ou uma janela de um minuto, qualquer intervalo que você queira, e o streaming estruturado do Spark também dá suporte a isso. Também há suporte para janelas sobrepostas.

Ponto de verificação para recuperação de falha

No caso de uma falha ou desligamento intencional, você pode recuperar o progresso e o estado anteriores de uma consulta prévia e continuar do ponto em que parou. Isso é feito usando pontos de verificação e logs write-ahead. Você pode configurar uma consulta com uma localização de ponto de verificação e a consulta salvará todas as informações de progresso (ou seja, intervalo de deslocamentos processados em cada gatilho) e as agregações em execução para a localização do ponto de verificação. Essa localização de ponto de verificação deve ser um caminho em um sistema de arquivos compatível com HDFS e pode ser definido como uma opção no DataStreamWriter ao iniciar uma consulta.