O Apache Beam é um modelo de programação que permite o processamento de dados distribuídos. Ele possui uma única API que pode ser usada para processar tanto Datasets quanto DataFrames. Ao criar um pipeline utilizando o Apache Beam, não é necessário se preocupar com o tipo de pipeline que está sendo construído, seja ele um pipeline em lote ou de streaming.
A história do Apache Beam remonta a 2014, quando a Google começou a desenvolver um modelo de programação unificado para processamento de dados em batch e em tempo real. Esse modelo, inicialmente chamado de Dataflow Model, permitiria que os usuários definissem pipelines de processamento de dados portáteis e escaláveis que poderiam ser executados em diferentes motores de execução. Em 2015, a Google lançou uma versão beta do seu serviço de processamento de dados em nuvem, chamado de Google Cloud Dataflow, que usava o modelo de programação Dataflow. Nessa época, a Google também começou a trabalhar em uma implementação open source do modelo de programação, que mais tarde seria doada à Apache Software Foundation. O Apache Beam é um projeto ativo e em constante evolução, com uma comunidade de desenvolvedores dedicados que trabalham em melhorias e novos recursos. Em sua arquitetura, o Apache Beam é composto por Pipelines, Pcollections, Transformações, Runner
Pipelines
Para iniciar os processamentos no Apache Beam, é necessário construir um objeto Pipeline que servirá de referência para a criação dos conjuntos de dados do pipeline. É importante ressaltar que cada pipeline é responsável por executar um único job, que pode ser repetido diversas vezes. Podemos entender o pipeline como uma sequência de processos que formam um ciclo completo, abrangendo todo o processo, desde a entrada até a saída do processamento. Ele é responsável por ler, processar e gravar os dados de entrada e saída.
Pcollections
Pcollection é uma coleção de dados que faz parte da construção de um pipeline do Apache Beam, definida como "um conjunto de dados ou fluxo de dados". Diferentemente de uma tabela, essa coleção pode ser formada por qualquer combinação de dados, desde dados achatados no formato de tabela até dados aninhados como um documento JSON. A Pcollection não exige a conversão dos dados recebidos para um formato específico, como dataframe, e os dados são mantidos conforme o original, respeitando algumas convenções.
Embora essa coleção aceite elementos de qualquer tipo, é necessário que eles sejam todos do mesmo tipo. Por isso, é importante que o desenvolvedor do Apache Beam aprimore seus conhecimentos em esquema de dados, pois tabelas SQL, Parquet, Avro, JSON e Kafka possuem esquemas específicos que precisam ser identificados para que determinados comandos sejam executados com sucesso. O Beam codifica cada elemento como uma string de bytes para que possa passar itens para trabalhadores distribuídos, conforme mencionado em sua página de programação.
Transformações
Uma transformação é um procedimento que modifica os dados em processamento. Ao receber uma ou mais PCollections como entrada, cada elemento é submetido a uma operação específica, resultando em uma ou mais PCollections como saída. As operações que uma transformação pode executar são diversas, abrangendo desde cálculos matemáticos, mudança de formato, agrupamento, leitura e gravação, filtragem para apresentar somente os itens relevantes, até a combinação de elementos em um valor único.
No exemplo abaixo, vemos um Pipeline chamado Pipeline, com uma Pcoll chamada pcoll, que faz a leitura de uma lista de dicionários, e trata o elemento idade, convertendo-o para INT.
Runner
O runner, por outro lado, é um componente que determina como o pipeline será executado. Ele pode ser visto como uma espécie de ponte entre o pipeline e o executor, que traduz a especificação do pipeline em uma forma que o executor possa entender. O runner pode ser configurado para trabalhar com diferentes executores, dependendo do ambiente de execução e dos requisitos do pipeline. Alguns exemplos de runners populares incluem Apache Beam runners, como DataflowRunner e FlinkRunner.
Pipeline options:
"PipelineOptions" é uma parte essencial da arquitetura do Apache Beam que permite configurar a execução dos dados de forma eficiente, economizando tempo e esforço. Para ilustrar, imagine que você precise transportar várias caixas de um lugar para outro, mas precise decidir como empilhá-las em um caminhão. O PipelineOptions ajuda a tomar decisões importantes, como determinar o tamanho ideal do caminhão, quantas caixas podem ser empilhadas e como organizá-las para otimizar o espaço. As configurações podem incluir informações sobre o ambiente de execução, o tamanho do cluster de processamento, o tempo de retenção de dados em memória, entre outras opções.
No exemplo acima, a classe MyCustomOptions é uma subclasse de PipelineOptions que define uma nova opção personalizada my_custom_option. O método _add_argparse_args adiciona a nova opção personalizada ao parser e define um valor padrão para ela.
Em seguida, as opções personalizadas são visualizadas usando a função view_as do objeto beam_options, que retorna um objeto MyCustomOptions. O valor da opção personalizada é impresso na saída usando a variável my_custom_options.
Este é apenas um exemplo simples de como criar uma opção personalizada e definir uma opção padrão usando a classe PipelineOptions. É possível definir opções personalizadas adicionais, dependendo das necessidades de pipeline.
I/O:
O Apache Beam I/O é uma ferramenta valiosa para a leitura e escrita de grandes volumes de dados, permitindo a utilização de um conjunto de bibliotecas, uma API única e um modelo de programação comum. Com o uso do Apache Beam I/O, os desenvolvedores podem processar dados de diversas fontes sem precisar conhecer as particularidades de cada uma delas. Ademais, o Apache Beam I/O oferece uma ampla variedade de conectores para diferentes fontes de dados, como Hadoop Distributed File System (HDFS), Amazon S3, Google Cloud Storage, BigQuery, Kafka, entre outras, além de suportar diversos formatos de dados, como CSV, JSON, Parquet, Avro, entre outros.
Em resumo, o Apache Beam I/O é uma parte essencial do ecossistema do Apache Beam, que facilita para os desenvolvedores a tarefa de acessar e processar dados provenientes de várias fontes de entrada e saída de maneira simples e eficiente.