Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Atualizado em 2023-05-19 GMT+08:00

Princípios básicos do Flink

Visão geral

Flink é uma estrutura de computação unificada que suporta processamento em lote e processamento de fluxo. Ele fornece um mecanismo de processamento de dados de fluxo que suporta distribuição de dados e computação paralela. Flink apresenta processamento de fluxo e é um mecanismo de processamento de fluxo de código aberto superior na indústria.

O Flink oferece processamento de dados de pipeline de alta simultaneidade, latência de milissegundos e alta confiabilidade, tornando-o extremamente adequado para processamento de dados de baixa latência.

Figura 1 mostra a pilha de tecnologia do Flink.

Figura 1 Pilha de tecnologia de Flink

O Flink fornece os seguintes recursos na versão atual:

  • DataStream
  • Ponto de verificação
  • Janela
  • Pipeline de job
  • Tabela de configuração

Outros recursos são herdados da comunidade de código aberto e não são aprimorados. Para obter detalhes, visite https://ci.apache.org/projects/flink/flink-docs-release-1.12/.

Arquitetura do Flink

Figura 2 mostra a arquitetura do Flink.

Figura 2 Arquitetura do Flink

Como mostrado na figura acima, todo o sistema do Flink consiste em três partes:

  • Client

    O cliente do Flink é usado para enviar jobs (jobs de streaming) para o Flink.

  • TaskManager

    TaskManager é um nó de execução de serviço do Flink. Ele executa tarefas específicas. Um sistema do Flink pode ter múltiplos TaskManagers. Estes TaskManagers são equivalentes entre si.

  • JobManager

    JobManager é um nó de gerenciamento do Flink. Ele gerencia todos os TaskManagers e agenda tarefas enviadas pelos usuários para TaskManagers específicos. No modo de alta disponibilidade (HA), vários JobManagers são implementados. Entre esses JobManagers um é selecionado como o JobManager ativo e os outros são em espera.

Para obter mais informações sobre a arquitetura do Flink, visite https://ci.apache.org/projects/flink/flink-docs-master/docs/concepts/flink-architecture/.

Princípios do Flink

  • Fluxo & Transformação & Operador

    Um programa Flink consiste em dois blocos de construção: fluxo e transformação.

    1. Conceitualmente, um fluxo é um fluxo (potencialmente interminável) de registros de dados, e uma transformação é uma operação que leva um ou mais fluxos como entrada e produz um ou mais fluxos de saída como resultado.
    2. Quando um programa Flink é executado, ele é mapeado para um fluxo de dados de streaming. Um fluxo de dados de streaming consiste em um grupo de fluxos e operadores de transformação. Cada fluxo de dados começa com um ou mais operadores de origem e termina em um ou mais operadores de coletor. Um fluxo de dados se assemelha a um grafo acíclico direcionado (DAG).

      Figura 3 mostra o fluxo de dados de fluxo contínuo para o qual um programa Flink é mapeado.

      Figura 3 Exemplo de DataStream do Flink

      Como mostrado em Figura 3, FlinkKafkaConsumer é um operador de origem; Map, KeyBy, TimeWindow e Apply são operadores de transformação; RollingSink é um operador de coletor.

  • Fluxo de dados do pipeline

    As aplicações no Flink podem ser executadas em modo paralelo ou distribuído. Um fluxo pode ser dividido em uma ou mais partições de fluxo, e um operador pode ser dividido em várias subtarefas de operador.

    O executor de fluxos e operadores são otimizados automaticamente com base na densidade de operadores a montante e a jusante.

    • Operadores com baixa densidade não podem ser otimizados. Cada subtarefa de operador é executada separadamente em threads diferentes. O número de subtarefas de operador é o paralelismo desse operador em particular. O paralelismo (o número total de partições) de um fluxo é o de seu operador produtor. Diferentes operadores do mesmo programa podem ter diferentes níveis de paralelismo, como mostrado em Figura 4.
      Figura 4 Operador
    • Operadores com alta densidade podem ser otimizados. Flink encadeia subtarefas do operador em uma tarefa, ou seja, uma cadeia de operadores. Cada cadeia de operadores é executada por um thread no TaskManager, como mostrado em Figura 5.
      Figura 5 Cadeia do operador
      • Na parte superior do Figura 5, os operadores condensados Source e Map são encadeados em uma Operator Chain, ou seja, um operador maior. A Operator Chain, o KeyBy e o Sink representam um operador, respectivamente, e estão conectados entre si através de fluxos. Cada operador corresponde a uma tarefa durante a execução. Ou seja, existem três tarefas na parte superior.
      • Na parte inferior de Figura 5, cada tarefa, exceto Sink, é paralela em duas subtarefas. O paralelismo do operador Sink é um.

Principais recursos

  • Processamento de fluxo

    O mecanismo de processamento de fluxo em tempo real apresenta alta taxa de transferência, alto desempenho e baixa latência, o que pode fornecer capacidade de processamento em milissegundos.

  • Vários gerenciamento de status
    A aplicação de processamento de fluxo precisa armazenar os eventos recebidos ou o resultado intermediário em um determinado período de tempo para acesso e processamento subsequentes em um determinado ponto de tempo. O Flink fornece diversos recursos para gerenciamento de status, incluindo:
    • Vários tipos básicos de status: o Flink fornece vários estados para estruturas de dados, como ValueState, ListState e MapState. Os usuários podem selecionar o tipo de status mais eficiente e adequado com base no modelo de serviço.
    • Back-end de estado rico: o Back-end de estado gerencia o status das aplicações e executa as operações de Checkpoint conforme necessário. O Flink fornece back-ends de estados diferentes. O estado pode ser armazenado na memória ou no RocksDB e suporta o mecanismo Ponto de verificação assíncrono e incremental.
    • Consistência de estado exatamente uma vez: os recursos de Ponto de verificação e recuperação de falhas do Flink garantem que o status das tarefas da aplicação seja consistente antes e depois da ocorrência de uma falha. O Flink suporta saída transacional para alguns dispositivos de armazenamento específicos. Desta forma, a saída de exatamente uma vez pode ser garantida mesmo quando ocorre uma falha.
  • Diversas semânticas de tempo

    O tempo é uma parte importante das aplicações de processamento de fluxo. Para aplicações de processamento de fluxo em tempo real, operações como agregação de janelas, detecção e correspondência com base na semântica de tempo são muito comuns. Flink fornece várias semânticas de tempo.

    • Horário do evento: o carimbo de data/hora fornecido pelo evento é usado para o cálculo, facilitando o processamento dos eventos que chegam em uma sequência aleatória ou chegam atrasados.
    • Marca d'água: o Flink introduz o conceito de Marca d'água para medir o desenvolvimento do tempo do evento. A marca d'água também fornece garantia flexível para balancear a latência do processamento e a integridade dos dados. Ao processar fluxos de eventos com marca d'água, o Flink oferece várias opções de processamento se os dados chegarem após o cálculo, por exemplo, redirecionando dados (saída lateral) ou atualizando o resultado do cálculo.
    • O tempo de processamento e o tempo de ingestão são suportados.
    • Janela de streaming altamente flexível: o Flink suporta a janela de tempo, a janela de contagem, a janela de sessão e a janela personalizada orientada por dados. Você pode personalizar as condições de disparo para implementar o modo de cálculo de streaming complexo.
  • Mecanismo de tolerância a falhas

    Em um sistema distribuído, se uma única tarefa ou nó quebrar ou estiver com defeito, toda a tarefa pode falhar. O Flink fornece um mecanismo de tolerância a falhas no nível da tarefa, que garante que os dados do usuário não sejam perdidos quando uma exceção ocorrer em uma tarefa e possam ser restaurados automaticamente.

    • Ponto de verificação: o Flink implementa a tolerância a falhas com base no ponto de verificação. Os usuários podem personalizar a política de pontos de verificação para toda a tarefa. Quando uma tarefa falha, ela pode ser restaurada para o status do ponto de verificação mais recente e para os dados após o snapshot ser reenviado da fonte de dados.
    • Ponto de salvamento: um ponto de salvamento é um instantâneo consistente do status da aplicação. O mecanismo de ponto de salvamento é semelhante ao do ponto de verificação. No entanto, o mecanismo de ponto de salvamento precisa ser acionado manualmente. O mecanismo de ponto de salvamento garante que as informações de status da aplicação de fluxo atual não sejam perdidas durante a atualização ou migração da tarefa, facilitando a suspensão e a recuperação da tarefa em qualquer ponto de tempo.
  • Flink SQL

    APIs de tabela e SQL usam o Apache Calcite para analisar, verificar e otimizar consultas. APIs de tabela e SQL podem ser perfeitamente integradas com APIs de DataStream e DataSet e suportam funções escalares definidas pelo usuário, funções de agregação e funções de valor de tabela. A definição de aplicações como análise de dados e ETL é simplificada. O exemplo de código a seguir mostra como usar instruções Flink SQL para definir uma aplicação de contagem que registra horários de sessão.

    SELECT userId, COUNT(*) 
    FROM clicks 
    GROUP BY SESSION(clicktime, INTERVAL '30' MINUTE), userId

    Para obter mais informações sobre o Flink SQL, consulte https://ci.apache.org/projects/flink/flink-docs-master/dev/table/sqlClient.html.

  • CEP em SQL

    O Flink permite que os usuários representem resultados de consultas de processamento de eventos complexos (CEP) em SQL para correspondência de padrões e avaliem fluxos de eventos no Flink.

    O CEP SQL é implementado através da sintaxe SQL MATCH_RECOGNIZE. A cláusula MATCH_RECOGNIZE é suportada pelo Oracle SQL desde o Oracle Database 12c e é usada para indicar a correspondência de padrões de eventos em SQL. Veja a seguir um exemplo de CEP SQL:

    SELECT T.aid, T.bid, T.cid
    FROM MyTable
        MATCH_RECOGNIZE (
          PARTITION BY userid
          ORDER BY proctime
          MEASURES
            A.id AS aid,
            B.id AS bid,
            C.id AS cid
          PATTERN (A B C)
          DEFINE
            A AS name = 'a',
            B AS name = 'b',
            C AS name = 'c'
        ) AS T