Fundamentos de Eng. de Dados - PT-BR
Fundamentos de Eng. de Dados - PT-BR
Fundamentos de Eng. de Dados - PT-BR
Fundamentos de dados
Engenharia
Planeje e crie sistemas de dados robustos
Publicado por O'Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA
95472.
As opiniões expressas neste trabalho são dos autores e não representam a opinião da
editora. Embora o editor e os autores tenham feito esforços de boa fé para garantir que as
informações e instruções contidas neste trabalho sejam precisas, o editor e os autores se
isentam de qualquer responsabilidade por erros ou omissões, incluindo, sem limitação,
responsabilidade por danos resultantes do uso ou confiança neste trabalho. O uso das
informações e instruções contidas neste trabalho é por sua conta e risco. Se qualquer amostra
de código ou outra tecnologia que este trabalho contém ou descreve está sujeita a licenças de
978-1-098-10830-4
[LSI]
Machine Translated by Google
Prefácio
Como surgiu este livro? A origem está profundamente enraizada em nossa jornada da
ciência de dados à engenharia de dados. Muitas vezes, brincando, nos referimos a nós
mesmos como cientistas de dados em recuperação. Nós dois tivemos a experiência de ser
designados para projetos de ciência de dados, depois lutando para executar esses projetos
devido à falta de fundamentos adequados. Nossa jornada na engenharia de dados começou
quando realizamos tarefas de engenharia de dados para construir fundações e infraestrutura.
Nosso objetivo aqui é mapear princípios que abrangem dois eixos. Primeiro, queremos
destilar a engenharia de dados em princípios que possam abranger qualquer tecnologia
relevante. Em segundo lugar, desejamos apresentar princípios que resistirão ao teste
do tempo. Esperamos que essas ideias reflitam as lições aprendidas durante a revolução
da tecnologia de dados dos últimos vinte anos e que nossa estrutura mental permaneça
útil por uma década ou mais no futuro.
Uma coisa a ser observada: adotamos, sem remorso, uma abordagem que prioriza a
nuvem. Vemos a nuvem como um desenvolvimento fundamentalmente transformador que
durará décadas; a maioria dos sistemas de dados e cargas de trabalho locais acabará
migrando para a hospedagem na nuvem. Assumimos que a infraestrutura e os sistemas
são efêmeros e escaláveis, e que os engenheiros de dados se inclinarão para a
implantação de serviços gerenciados na nuvem. Dito isso, a maioria dos conceitos neste
livro serão traduzidos para ambientes não-nuvem.
Machine Translated by Google
Idealmente, você é curioso e quer aprender – por que mais você estaria lendo este livro?
Você se mantém atualizado com as tecnologias e tendências de dados lendo livros e artigos
sobre data warehousing/data lakes, sistemas de lote e streaming, orquestração, modelagem,
gerenciamento, análise, desenvolvimentos em tecnologias de nuvem etc. leia em uma
imagem completa da engenharia de dados em todas as tecnologias e paradigmas.
Pré-requisitos
Assumimos uma boa familiaridade com os tipos de sistemas de dados encontrados em um
ambiente corporativo. Além disso, presumimos que os leitores tenham alguma familiaridade
com SQL e Python (ou alguma outra linguagem de programação) e experiência com serviços
em nuvem.
A nuvem oferece oportunidades sem precedentes para obter experiência prática com
ferramentas de dados. Sugerimos que aspirantes a engenheiros de dados configurem contas
com serviços em nuvem, como AWS, Azure, Google Cloud Platform, Snowflake, Databricks,
etc. Observe que muitas dessas plataformas têm nível gratuito
Machine Translated by Google
opções, mas os leitores devem ficar de olho nos custos e trabalhar com pequenas quantidades
de dados e clusters de nó único enquanto estudam.
Como usar o ciclo de vida de engenharia de dados para projetar e construir uma
arquitetura robusta.
O esboço do livro
Este livro é composto de quatro partes:
A Parte III cobre tópicos adicionais. No Capítulo 10, discutimos segurança e privacidade.
Embora a segurança sempre tenha sido uma parte importante da profissão de engenharia de
dados, ela só se tornou mais crítica com o surgimento de hackers com fins lucrativos e ataques
cibernéticos patrocinados pelo estado. E o que podemos dizer da privacidade? A era do niilismo
de privacidade corporativa acabou - nenhuma empresa quer ver seu nome aparecer na manchete
de um artigo sobre práticas de privacidade descuidadas. O manuseio imprudente de dados
pessoais também pode ter ramificações legais significativas com o advento do GDPR, CCPA e
outros regulamentos. Em suma, segurança e privacidade devem ser as principais prioridades em
qualquer trabalho de engenharia de dados.
idéias especulativas sobre o futuro da engenharia de dados. Por sua natureza, o futuro é
uma coisa escorregadia. O tempo dirá se algumas de nossas ideias estão corretas.
Adoraríamos ouvir de nossos leitores como suas visões do futuro concordam ou diferem das
nossas.
itálico
Largura constante
Mostra comandos ou outro texto que deve ser digitado literalmente pelo usuário.
Mostra o texto que deve ser substituído por valores fornecidos pelo usuário ou por
valores determinados pelo contexto.
Machine Translated by Google
GORJETA
NOTA
Este elemento significa uma nota geral.
AVISO
Este elemento indica um aviso ou cuidado.
Sebastopol, CA 95472
707-829-0104 (fax)
Temos uma página web para este livro, onde listamos erratas, exemplos e
qualquer informação adicional. Você pode acessar esta página em https://oreil.ly/
fundamentals-of-data.
Machine Translated by Google
Agradecimentos
Quando começamos a escrever este livro, fomos avisados por muitas pessoas de
que enfrentávamos uma tarefa difícil. Um livro como este tem muitas partes móveis
e, devido à sua visão abrangente do campo da engenharia de dados, exigiu uma
tonelada de pesquisas, entrevistas, discussões e reflexão profunda. Não afirmaremos
ter capturado todas as nuances da engenharia de dados, mas esperamos que os
resultados ressoem com você. Inúmeras pessoas contribuíram para nossos esforços
e somos gratos pelo apoio que recebemos de muitos especialistas.
Todd Beauchene, Tudor Girba, Scott Taylor, Ori Rafael, Lee Edwards, Bryan
Offutt, Ollie Hughes, Gilbert Eijkelenboom, Chris Bergh, Fabiana Clemente, Andreas
Kretz, Ori Reshef, Nick Singh, Mark Balkenende, Kenten Danas, Brian Olsen, Lior
Gavish , Rhaghu Murthy, Greg Coquillo, David Aponte, Demetrios Brinkmann, Sarah
Catanzaro, Michel Tricot, Levi Davis, Ted Walker, Carlos Kemeny, Josh Benamram,
Chanin Nantasenamat, George Firican, Jordan Goldmeir, Minhaaj Rehmam, Luigi
Patruno, Vin Vashista, Danny Ma, Jesse Anderson, Alessya Visnjic, Vishal Singh, Dave
Langer, Roy Hasson, Todd Odess, Che Sharma, Scott Breitenother, Ben Taylor, Thom
Ives, John Thompson, Brent Dykes, Josh Tobin, Mark Kosiba, Tyler Pugliese, Douwe
Maan, Martin Traverso, Curtis Kowalski, Bob Davis, Koo Ping Shung, Ed Chenard, Matt
Sciorma, Tyler Folkman, Jeff Baird, Tejas Manohar, Paul Singman, Kevin Stumpf,
Willem Pineaar e Michael Del Balso de Tecton, Emma Dahl, Harpreet Sahota, Ken Jee,
Scott Taylor, Kate Strachnyi, Kristen Kehrer, Taylor Miller, Abe Gong, Ben Castleton,
Ben Rogojan, David Mertz, Emmanuel Raj, Andrew Jones, Avery Smith, Brock Cooper,
Jeff Larson, Jon King, Holden Ackerman, Miriah Peterson, Felipe Hoffa, David Gonzalez,
Richard Wellman , Susan Walsh, Ravit Jain, Lauren Balik, Mikiko Bazeley, Mark
Freeman, Mike Wimmer, Alexey Shchedrin, Mary Clair Thompson, Julie Burroughs,
Jason Pedley, Freddy Drennan, Jake Carter, Jason Pedley, Kelly e Matt Phillipps, Brian
Campbell, Faris Chebib, Dylan Gregerson, Ken Myers e muitos outros.
Se você não for mencionado especificamente, não leve para o lado pessoal. Você
sabe quem você é. Deixe-nos saber e vamos levá-lo na próxima edição.
Joe gostaria de agradecer a sua família — Cassie, Milo e Ethan — por deixá-lo
escrever um livro. Eles tiveram que aguentar uma tonelada, e Joe promete nunca mais
escrever outro livro ;)
Matt gostaria de agradecer a seus amigos e familiares por sua paciência e apoio
duradouros. Ele ainda está esperançoso de que Sêneca se dignará a dar uma
avaliação de cinco estrelas depois de muito trabalho e tempo perdido com a família nos feriados.
Machine Translated by Google
Capítulo 1. Engenharia de
Dados Descrita
Se você trabalha com dados ou software, deve ter notado a engenharia de dados
emergindo das sombras e agora dividindo o palco com a ciência de dados.
A engenharia de dados é um dos campos mais quentes em dados e tecnologia, e por um bom
motivo. Ele cria a base para a ciência de dados e a análise em produção. Este capítulo
explora o que é engenharia de dados, como o campo nasceu e sua evolução, as habilidades
dos engenheiros de dados e com quem eles trabalham.
Geração
Armazenar
Ingestão
Transformação
Servindo
Agora que você tem uma definição funcional de engenharia de dados e uma
introdução ao seu ciclo de vida, vamos dar um passo atrás e examinar um pouco
da história.
A internet se popularizou em meados da década de 1990, criando toda uma nova geração
de empresas pioneiras na web, como AOL, Yahoo e Amazon. O boom das pontocom gerou
uma tonelada de atividades em aplicativos da Web e os sistemas de back-end para suportá-
los - servidores, bancos de dados e armazenamento. Grande parte da infraestrutura era cara,
monolítica e fortemente licenciada. Os fornecedores que vendem esses sistemas de back-end
provavelmente não previram a escala dos dados que os aplicativos da Web produziriam.
Avancemos para o início dos anos 2000, quando o boom das pontocom do final dos anos
90 quebrou, deixando para trás um pequeno grupo de sobreviventes. Algumas dessas
empresas, como Yahoo, Google e Amazon, se tornariam poderosas empresas de
tecnologia. Inicialmente, essas empresas continuaram a contar com os bancos de dados e
data warehouses monolíticos e relacionais tradicionais da década de 1990, levando esses
sistemas ao limite. À medida que esses sistemas falhavam, eram necessárias abordagens
atualizadas para lidar com o crescimento de dados. O novo
Machine Translated by Google
O Oxford English Dictionary define big data como “conjuntos de dados extremamente
grandes que podem ser analisados computacionalmente para revelar padrões, tendências
e associações, especialmente relacionadas ao comportamento e interações humanas”.
Outra descrição famosa e sucinta de big data são os três V's de dados: velocidade, variedade
e volume.
Em 2003, o Google publicou um artigo sobre o Google File System e, pouco depois, em
2004, um artigo sobre o MapReduce, um paradigma de processamento de dados
ultraescalável. Na verdade, big data tem antecedentes anteriores em data warehouses MPP
e gerenciamento de dados para projetos de física experimental, mas as publicações do
Google constituíram um “big bang” para tecnologias de dados e as raízes culturais da
engenharia de dados como a conhecemos hoje. Você aprenderá mais sobre sistemas MPP e
MapReduce nos Capítulos 3 e 8, respectivamente.
Na mesma época, a Amazon teve que acompanhar suas próprias necessidades de dados
explosivas e criou ambientes de computação elástica (Amazon Elastic Compute Cloud ou
EC2), sistemas de armazenamento infinitamente escaláveis (Amazon Simple Storage Service
ou S3), bancos de dados NoSQL altamente escaláveis ( Amazon DynamoDB) e muitos outros
7
blocos de construção de dados principais. A Amazon optou por oferecer esses serviços para
consumo interno e externo por meio de
Machine Translated by Google
A explosão de ferramentas de dados no final dos anos 2000 e 2010 deu início ao
engenheiro de big data. Para usar efetivamente essas ferramentas e técnicas, ou seja, o
ecossistema Hadoop, incluindo Hadoop, YARN, Hadoop Distributed File
Machine Translated by Google
O big data rapidamente se tornou vítima de seu próprio sucesso. Como palavra da moda,
big data ganhou popularidade no início dos anos 2000 até meados dos anos 2010. O big
data capturou a imaginação das empresas que tentam entender os volumes cada vez
maiores de dados e a interminável enxurrada de marketing descarado de empresas que
vendem ferramentas e serviços de big data. Por causa do imenso hype, era comum ver
empresas usando ferramentas de big data para pequenos problemas de dados, às vezes
montando um cluster Hadoop para processar apenas alguns gigabytes. Parecia que todos
queriam participar da ação de big data. Dan Ariely twittou, “Big data é como sexo na
adolescência: todo mundo fala sobre isso, ninguém sabe realmente como fazer, todo mundo
acha que todo mundo está fazendo, então todo mundo afirma que está fazendo.”
A Figura 1-2 mostra um instantâneo do Google Trends para o termo de pesquisa “big
data” para ter uma ideia da ascensão e queda do big data.
Apesar da popularidade do termo, o big data perdeu força. O que aconteceu? Uma palavra:
simplificação. Apesar do poder e sofisticação das ferramentas de big data de código aberto,
gerenciá-las era muito trabalhoso e exigia atenção constante. Muitas vezes, as empresas
empregavam equipes inteiras de engenheiros de big data, que custavam milhões de dólares por
ano, para cuidar dessas plataformas. Os engenheiros de big data geralmente gastavam muito
tempo mantendo ferramentas complicadas e provavelmente não tanto tempo entregando os insights
e o valor do negócio.
Hoje, os dados estão se movendo mais rápido do que nunca e crescendo cada vez mais, mas o
processamento de big data tornou-se tão acessível que não merece mais um termo separado; toda
empresa visa resolver seus problemas de dados, independentemente do tamanho real dos dados.
Engenheiros de big data agora são simplesmente engenheiros de dados.
momento da redação deste artigo, a função da engenharia de dados está evoluindo rapidamente.
Esperamos que essa evolução continue em ritmo acelerado no futuro próximo.
Enquanto os engenheiros de dados historicamente tendiam aos detalhes de baixo nível de
estruturas monolíticas como Hadoop, Spark ou Informatica, a tendência está se movendo para
ferramentas descentralizadas, modularizadas, gerenciadas e altamente abstratas.
De fato, as ferramentas de dados proliferaram a uma taxa surpreendente (veja a Figura 1-3).
As tendências populares no início da década de 2020 incluem a pilha de dados
moderna, representando uma coleção de produtos de código aberto e de terceiros prontos
para uso, reunidos para facilitar a vida dos analistas. Ao mesmo tempo, as fontes de dados e os
formatos de dados estão crescendo em variedade e tamanho. A engenharia de dados é cada
vez mais uma disciplina de interoperação e conecta várias tecnologias, como peças LEGO, para
atender aos objetivos de negócios finais.
Machine Translated by Google
O engenheiro de dados que discutimos neste livro pode ser descrito mais precisamente como
um engenheiro de ciclo de vida de dados. Com maior abstração e simplificação, um
engenheiro de ciclo de vida de dados não está mais sobrecarregado pelos detalhes sangrentos
das estruturas de big data de ontem. Embora os engenheiros de dados mantenham habilidades
em programação de dados de baixo nível e as usem conforme necessário, eles encontram
cada vez mais seu papel focado em coisas mais altas na cadeia de valor: segurança,
gerenciamento de dados, DataOps, arquitetura de dados, orquestração e gerenciamento geral
8
do ciclo de vida dos dados.
O que é velho é novo de novo. Embora coisas “empresariais” como gerenciamento de dados
(incluindo qualidade e governança de dados) fossem comuns para grandes empresas na era
pré-big-data, não foram amplamente adotadas em empresas menores. Agora que muitos dos
problemas desafiadores dos sistemas de dados de ontem estão resolvidos, perfeitamente
produzidos e empacotados, tecnólogos e empreendedores mudaram o foco de volta para as
coisas “empresariais”, mas com ênfase em
Machine Translated by Google
Vemos o presente como uma era de ouro do gerenciamento do ciclo de vida dos dados.
Os engenheiros de dados que gerenciam o ciclo de vida da engenharia de dados têm
ferramentas e técnicas melhores do que nunca. Discutimos o ciclo de vida da engenharia
de dados e suas subcorrentes com mais detalhes no próximo capítulo.
Embora muitos cientistas de dados estejam ansiosos para construir e ajustar modelos
de ML, a realidade é que cerca de 70% a 80% de seu tempo é gasto trabalhando nas
três partes inferiores da hierarquia – coleta de dados, limpeza de dados, processamento
de dados – e apenas um pequena fatia de seu tempo em análise e ML.
Rogati argumenta que as empresas precisam construir uma base de dados sólida
(os três níveis inferiores da hierarquia) antes de abordar áreas como IA e ML.
visibilidade à ciência de dados, com engenheiros de dados desempenhando um papel vital para
tornar a ciência de dados bem-sucedida na produção.
Figura 1-6. Um engenheiro de dados obtém dados e fornece valor a partir dos dados
Quais são algumas coisas que um engenheiro de dados não faz? Um engenheiro
de dados normalmente não cria modelos de ML diretamente, cria relatórios ou painéis,
executa análise de dados, cria indicadores-chave de desempenho (KPIs) ou desenvolve
aplicativos de software. Um engenheiro de dados deve ter uma boa compreensão do
funcionamento dessas áreas para atender melhor as partes interessadas.
A maturidade dos dados é a progressão para uma maior utilização, recursos e integração de
dados em toda a organização, mas a maturidade dos dados não depende simplesmente da
idade ou da receita de uma empresa. Uma startup em estágio inicial pode ter maior maturidade
de dados do que uma empresa de 100 anos com receita anual na casa dos bilhões. O que
importa é a forma como os dados são aproveitados como vantagem competitiva.
Figura 1-8. Nosso modelo simplificado de maturidade de dados para uma empresa
Uma empresa que está começando com dados está, por definição, nos estágios iniciais
de sua maturidade de dados. A empresa pode ter metas difusas e definidas de maneira vaga
ou não ter metas. A arquitetura e a infraestrutura de dados estão nos estágios iniciais de
planejamento e desenvolvimento. A adoção e a utilização são provavelmente baixas ou
inexistentes. A equipe de dados é pequena, geralmente com um número de funcionários de um
dígito. Nesse estágio, um engenheiro de dados geralmente é um generalista e normalmente
desempenha várias outras funções, como cientista de dados ou engenheiro de software. O
objetivo de um engenheiro de dados é mover-se rapidamente, obter tração e agregar valor.
Isso não quer dizer que você não possa obter vitórias do ML neste estágio - é raro, mas
possível. Sem uma base de dados sólida, você provavelmente não terá os dados para treinar
modelos de ML confiáveis nem os meios para implantar esses modelos na produção de
maneira escalável e repetível. Nós nos chamamos de brincadeira de “cientistas de dados em
recuperação”, principalmente da experiência pessoal de estar envolvido em projetos prematuros
de ciência de dados sem maturidade de dados adequada ou suporte de engenharia de dados.
Crie uma base de dados sólida para futuros analistas de dados e cientistas
de dados para gerar relatórios e modelos que forneçam valor competitivo.
Enquanto isso, você também pode ter que gerar esses relatórios e modelos até que
essa equipe seja contratada.
Esta é uma fase delicada com muitas armadilhas. Seguem algumas dicas para esta
etapa:
Saia e converse com as pessoas e evite trabalhar em silos. Muitas vezes vemos a
equipe de dados trabalhando em uma bolha, não se comunicando com pessoas de
fora de seus departamentos e obtendo perspectivas e feedback das partes interessadas
do negócio. O perigo é que você passará muito tempo trabalhando em coisas de pouca
utilidade para as pessoas.
Crie soluções personalizadas e codifique apenas onde isso cria uma vantagem competitiva.
Neste ponto, uma empresa se afastou das solicitações de dados ad hoc e tem práticas formais
de dados. Agora, o desafio é criar arquiteturas de dados escaláveis e planejar um futuro em
que a empresa seja genuinamente orientada por dados. As funções de engenharia de dados
passam de generalistas para especialistas, com pessoas focando em aspectos específicos do
ciclo de vida da engenharia de dados.
À medida que nos tornamos mais sofisticados com os dados, há a tentação de adotar
tecnologias de ponta baseadas em provas sociais de empresas do Vale do Silício. Isso
raramente é um bom uso do seu tempo e energia. Quaisquer decisões de tecnologia devem
ser orientadas pelo valor que entregarão aos seus clientes.
Você ficará tentado a se enquadrar como um tecnólogo, um gênio dos dados que pode entregar
produtos mágicos. Mude seu foco para a liderança pragmática e comece a transição para o
próximo estágio de maturidade; comunicar com outras equipes sobre a utilidade prática dos dados.
estágio, a empresa é orientada por dados. Os pipelines e sistemas automatizados criados por
engenheiros de dados permitem que as pessoas dentro da empresa façam análises de autoatendimento
e ML. A introdução de novas fontes de dados é perfeita e o valor tangível é derivado. Os engenheiros de
dados implementam controles e práticas adequados para garantir que os dados estejam sempre disponíveis
Concentre-se nos aspectos “empresariais” dos dados, como gerenciamento de dados (incluindo
outros
Crie uma comunidade e um ambiente onde as pessoas possam colaborar e falar abertamente,
As distrações tecnológicas são um perigo mais significativo aqui do que nos outros
estágios. Existe a tentação de perseguir projetos caros de hobby que não agregam valor
ao negócio. Utilize a tecnologia personalizada apenas onde ela oferece uma vantagem
competitiva.
várias opções de ferramentas, sua interação e seus trade-offs. Isso requer um bom
entendimento de engenharia de software, DataOps e arquitetura de dados.
Responsabilidades Empresariais
As responsabilidades macro que listamos nesta seção não são exclusivas dos
engenheiros de dados, mas são cruciais para quem trabalha em um campo de dados ou tecnologia.
Como uma simples pesquisa no Google renderá muitos recursos para aprender sobre
essas áreas, vamos simplesmente listá-los para brevidade:
Você precisa saber o que construir e garantir que seus stakeholders concordem
Controlar custos.
tempo, fornecer um valor descomunal. Saiba como otimizar o time to value, o custo total de
surpresas.
Aprenda continuamente.
O campo de dados parece estar mudando na velocidade da luz. Pessoas que têm sucesso
novos desenvolvimentos são mais relevantes para seu trabalho, que ainda são
como aprender.
Um engenheiro de dados bem-sucedido sempre diminui o zoom para entender o quadro geral
e como obter um valor descomunal para o negócio. A comunicação é vital, tanto para pessoas
técnicas quanto para não-técnicas. Muitas vezes vemos equipes de dados bem-sucedidas com
base em sua comunicação com outras partes interessadas; sucesso ou fracasso raramente é
um problema de tecnologia. Saber como navegar em uma organização, definir o escopo e
coletar requisitos, controlar custos e aprender continuamente o diferenciará dos engenheiros
de dados que dependem apenas de suas habilidades técnicas para seguir sua carreira.
Responsabilidades Técnicas
Você deve entender como construir arquiteturas que otimizem desempenho e custo em alto
nível, usando componentes pré-empacotados ou desenvolvidos internamente.
Machine Translated by Google
Geração
Armazenar
Ingestão
Transformação
Servindo
Segurança
Gestão de dados
DataOps
Arquitetura de dados
Engenharia de software
Ampliando um pouco, discutimos alguns dos dados táticos e habilidades tecnológicas que você
precisará como engenheiro de dados nesta seção; discutimos isso com mais detalhes nos capítulos
subsequentes.
As pessoas costumam perguntar: um engenheiro de dados deve saber codificar? Resposta curta:
sim. Um engenheiro de dados deve ter habilidades de engenharia de software de nível de
produção. Observamos que a natureza dos projetos de desenvolvimento de software realizados por
engenheiros de dados mudou fundamentalmente nos últimos anos. Os serviços totalmente
gerenciados agora substituem uma grande parte do esforço de programação de baixo nível
anteriormente esperado dos engenheiros, que agora usam software como serviço (SaaS) plug-and-
play simples e software como serviço (SaaS). Por exemplo, os engenheiros de dados agora se
concentram em abstrações de alto nível ou escrevem pipelines como código dentro de uma estrutura
de orquestração.
Machine Translated by Google
SQL
A interface mais comum para bancos de dados e data lakes. Após breve
para processamento de big data, o SQL (em várias formas) ressurgiu como o idioma
franca de dados.
Pitão
fornecer acesso a recursos de nível inferior do que uma API do Python (por exemplo, esse é o caso do
Scala será benéfico se você estiver usando um software de código aberto popular
estrutura.
festança
comandos bash e se sentir confortável usando CLIs melhorarão significativamente sua produtividade
e fluxo de trabalho quando você precisar criar scripts ou executar operações do SO. Ainda hoje,
ferramentas de linha de comando como awk ou sed para processar arquivos em um pipeline de dados ou
Estamos dizendo que o SQL é uma linguagem essencial e final? De jeito nenhum.
O SQL é uma ferramenta poderosa que pode resolver rapidamente problemas
complexos de análise e transformação de dados. Dado que o tempo é a principal
restrição para o rendimento da equipe de engenharia de dados, os engenheiros devem
adotar ferramentas que combinem simplicidade e alta produtividade. Os engenheiros de
dados também fazem bem em desenvolver experiência na composição de SQL com
outras operações, seja em estruturas como Spark e Flink ou usando orquestração para
combinar várias ferramentas. Os engenheiros de dados também devem aprender a
semântica SQL moderna para lidar com a análise de JavaScript Object Notation (JSON)
e dados aninhados e considerar o aproveitamento de uma estrutura de gerenciamento
SQL, como dbt (Data Build Tool).
Uma vez que uma nova tecnologia passa por cima de você, se você não faz
parte do rolo compressor, você faz parte da estrada.
—Marca Stewart
Como você mantém suas habilidades afiadas em um campo em rápida mudança, como a
engenharia de dados? Você deve se concentrar nas ferramentas mais recentes ou mergulhar
profundamente nos fundamentos? Aqui está nosso conselho: concentre-se nos fundamentos
para entender o que não vai mudar; preste atenção aos desenvolvimentos em curso para
saber para onde o campo está indo. Novos paradigmas e práticas são introduzidos o tempo
todo, e cabe a você se manter atualizado. Esforce-se para entender como as novas
tecnologias serão úteis no ciclo de vida.
10
Na ciência de dados, há a noção de cientistas de dados tipo A e tipo B.
Os cientistas de dados do tipo A – onde A significa análise – concentram-se
em entender e obter insights dos dados. Cientistas de dados do tipo B – onde B significa
construção – compartilham experiências semelhantes aos cientistas de dados do tipo A e
possuem fortes habilidades de programação. O cientista de dados tipo B constrói sistemas que
fazem a ciência de dados funcionar na produção. Empréstimo de
Machine Translated by Google
neste continuum de cientistas de dados, criaremos uma distinção semelhante para dois tipos de
engenheiros de dados:
maturidade de dados.
dados) ou quando um caso de uso de dados inicial é tão único e essencial que ferramentas
Os engenheiros de dados do tipo A e do tipo B podem trabalhar na mesma empresa e podem até ser a
mesma pessoa! Mais comumente, um engenheiro de dados tipo A é contratado pela primeira vez para
estabelecer a base, com conjuntos de habilidades de engenheiro de dados tipo B aprendidos ou
contratados conforme a necessidade surgir dentro de uma empresa.
Dado o ritmo em que novas funções de dados entram em voga (engenheiros de análise e
ML vêm à mente), essa não é uma lista exaustiva.
Para ter sucesso como engenheiro de dados, você precisa entender a arquitetura de
dados que está usando ou projetando e os sistemas de origem que produzem os dados necessários.
Em seguida, discutimos algumas partes interessadas de upstream familiares: arquitetos de dados,
engenheiros de software e engenheiros de DevOps.
Arquitetos de dados
Engenheiros de software
DevOps e SREs geralmente produzem dados por meio de monitoramento operacional. Nós
os classificamos como upstream de engenheiros de dados, mas eles também podem ser
downstream, consumindo dados por meio de painéis ou interagindo com engenheiros de
dados diretamente na coordenação de operações de sistemas de dados.
Cientistas de dados
Machine Translated by Google
De acordo com o folclore comum da indústria, os cientistas de dados gastam de 70% a 80%
12
de seu tempo coletando, limpando e preparando dados. Em nossa experiência, esses números
geralmente refletem práticas imaturas de ciência de dados e engenharia de dados. Em
particular, muitas estruturas populares de ciência de dados podem se tornar gargalos se não
forem dimensionadas adequadamente. Os cientistas de dados que trabalham exclusivamente em
uma única estação de trabalho se forçam a reduzir a amostragem de dados, tornando a preparação
de dados significativamente mais complicada e potencialmente comprometendo a qualidade dos
modelos que produzem. Além disso, código e ambientes desenvolvidos localmente são muitas
vezes difíceis de implantar na produção, e a falta de automação dificulta significativamente os
fluxos de trabalho de ciência de dados. Se os engenheiros de dados fizerem seu trabalho e
colaborarem com sucesso, os cientistas de dados não deverão gastar seu tempo coletando,
limpando e preparando dados após o trabalho exploratório inicial. Os engenheiros de dados
devem automatizar esse trabalho o máximo possível.
A necessidade de ciência de dados pronta para produção é um fator significativo por trás do
surgimento da profissão de engenharia de dados. Os engenheiros de dados devem ajudar os
cientistas de dados a permitir um caminho para a produção. Na verdade, nós (os autores)
passamos da ciência de dados para a engenharia de dados depois de reconhecer essa
necessidade fundamental. Os engenheiros de dados trabalham para fornecer automação e escala
de dados que tornam a ciência de dados mais eficiente.
Analistas de dados
Microsoft Power BI, Looker ou Tableau. Os analistas de dados são especialistas no domínio dos
dados com os quais trabalham com frequência e se familiarizam intimamente com as definições,
características e problemas de qualidade dos dados. Os clientes downstream típicos de um analista
de dados são usuários de negócios, gerentes e executivos.
Os engenheiros de dados trabalham com analistas de dados para criar pipelines para novas
fontes de dados exigidas pelos negócios. A experiência no assunto dos analistas de dados é
inestimável para melhorar a qualidade dos dados, e eles frequentemente colaboram com
engenheiros de dados nessa capacidade.
O mundo da engenharia de ML está se tornando uma bola de neve e é paralelo a muitos dos
mesmos desenvolvimentos que ocorrem na engenharia de dados. Enquanto há vários anos a atenção
do ML estava focada em como construir modelos, a engenharia de ML agora enfatiza cada vez mais
a incorporação das melhores práticas de operações de aprendizado de máquina (MLOps) e outras
práticas maduras anteriormente adotadas em engenharia de software e DevOps.
Machine Translated by Google
Dados no C-suite
Os executivos de nível C estão cada vez mais envolvidos em dados e análises, pois são
reconhecidos como ativos significativos para as empresas modernas. Os CEOs agora se
preocupam com iniciativas que antes eram exclusivas da TI, como migrações para a nuvem ou
implantação de uma nova plataforma de dados de clientes.
Machine Translated by Google
Diretor executivo
Diretor de informações
Diretor de tecnologia
Um diretor de tecnologia (CTO) é semelhante a um CIO, mas voltado para fora. Um CTO
possui a principal estratégia tecnológica e arquiteturas para aplicativos externos, como
dispositivos móveis, aplicativos da Web e IoT - todas as fontes de dados críticas para
engenheiros de dados. O CTO é provavelmente um tecnólogo habilidoso e tem
Machine Translated by Google
Diretor de dados
O Chief Data Officer (CDO) foi criado em 2002 na Capital One para reconhecer
a crescente importância dos dados como um ativo de negócios. O CDO é responsável
pelos ativos de dados e estratégia de uma empresa. Os CDOs estão focados na utilidade
comercial dos dados, mas devem ter uma base técnica sólida. Os CDOs supervisionam
produtos de dados, estratégias, iniciativas e funções essenciais, como gerenciamento de
dados mestre e privacidade. Ocasionalmente, os CDOs gerenciam análises de negócios e
engenharia de dados.
Diretor de análise
O diretor de análise (CAO) é uma variante da função de CDO. Onde existem ambas as
funções, o CDO se concentra na tecnologia e na organização necessárias para fornecer
dados. O CAO é responsável pela análise, estratégia e tomada de decisões para o negócio.
Um CAO pode supervisionar a ciência de dados e o ML, embora isso dependa muito se a
empresa tem uma função de CDO ou CTO.
Diretor de algoritmos Um
diretor de algoritmos (CAO-2) é uma inovação recente no C-suite, uma função altamente
técnica focada especificamente em ciência de dados e ML. Os CAO-2s normalmente têm
experiência como colaboradores individuais e líderes de equipe em projetos de ciência de
dados ou ML. Frequentemente, eles têm experiência em pesquisa de ML e um grau
avançado relacionado.
Os engenheiros de dados interagem com vários gerentes além dos gerentes de projeto e produto. No
dados atendem a uma variedade de solicitações recebidas como uma equipe centralizada ou trabalham
Para obter mais informações sobre equipes de dados e como estruturá-las, recomendamos o
Building Analytics Teams (Packt) de John Thompson e o Data Teams de Jesse Anderson (Apress).
Ambos os livros fornecem estruturas e perspectivas sólidas sobre os papéis dos executivos com dados,
quem contratar e como construir a equipe de dados mais eficaz para sua empresa.
NOTA
As empresas não contratam engenheiros simplesmente para hackear o código isoladamente. Para serem dignos de
seu título, os engenheiros devem desenvolver uma compreensão profunda dos problemas que têm a tarefa de resolver,
as ferramentas tecnológicas à sua disposição e as pessoas com quem trabalham e
servir.
Conclusão
Este capítulo forneceu uma breve visão geral do cenário de engenharia de dados, incluindo o seguinte:
Esperamos que este primeiro capítulo tenha aguçado seu apetite, seja você um praticante de desenvolvimento
risco. É claro que muito ainda precisa ser elucidado nos capítulos subsequentes. O Capítulo 2 cobre o ciclo
capítulos abordam o âmago da questão das decisões de tecnologia para cada parte do
ciclo de vida. Todo o campo de dados está em fluxo e, tanto quanto possível, cada capítulo
se concentra nos imutáveis — perspectivas que serão válidas por muitos anos em meio a
mudanças implacáveis.
Recursos adicionais
“Sobre a Complexidade em Big Data” por Jesse Anderson (O'Reilly)
“Os três níveis de análise de dados: uma estrutura para avaliação de dados
Maturidade da Organização” de Emilie Schario
“Dados como Produto versus Dados como Serviço” por Justin Gage
“O que é um arquiteto de dados? Visionário da estrutura de dados de TI” por Thor Olavsrud
“Como os CEOs podem liderar uma cultura orientada a dados” por Thomas H.
Davenport e Nitin Mittal
“Por que os CEOs devem liderar iniciativas de Big Data” por John Weathington
“Como a criação de uma cultura orientada a dados pode impulsionar o sucesso” por Frederik
Bussler
1 “Data Engineering and Its Main Concepts”, AlexSoft, atualizado pela última vez em 26 de agosto de
2021, https://oreil.ly/e94py.
2 ETL significa extrair, transformar, carregar, um padrão comum que abordamos no livro.
3 Jesse Anderson, “The Two Types of Data Engineering”, 27 de junho de 2018, https:// oreil.ly/ dxDt6.
4 Maxime Beauchemin, “The Rise of the Data Engineer”, 20 de janeiro de 2017, https://
oreil.ly/ kNDmd.
5 Lewis Gavin, O que é engenharia de dados? (Sebastapol, CA: O'Reilly, 2020), https://
oreil.ly/ ELxLi.
6 Cade Metz, “How Yahoo Spawned Hadoop, the Future of Big Data”, Wired, 18 de outubro de 2011, https://
oreil.ly/ iaD9G.
7 Ron Miller, “How AWS Came to Be”, TechCrunch, 2 de julho de 2016, https:// oreil.ly/ VJehv.
8 DataOps é uma abreviação de operações de dados. Cobrimos esse tópico no Capítulo 2. Para obter mais
informações, leia o Manifesto DataOps.
Machine Translated by Google
9 Essas siglas significam Lei de Privacidade do Consumidor da Califórnia e Proteção Geral de Dados
regulamento, respectivamente.
10 Robert Chang, “Doing Data Science at Twitter”, Medium, 20 de junho de 2015, https://
oreil.ly/ xqjAx.
11 Paramita (Guha) Ghosh, “Data Architect vs. Data Engineer”, Dataversity, 12 de novembro de 2021, https://
oreil.ly/ TlyZY.
12 Existe uma variedade de referências para essa noção. Embora esse clichê seja amplamente conhecido, um debate
saudável surgiu em torno de sua validade em diferentes contextos práticos. Para obter mais detalhes, consulte
Leigh Dodds, “Os cientistas de dados gastam 80% de seu tempo limpando dados? Acontece, não?” Blog Lost Boy,
31 de janeiro de 2020, https:// oreil.ly/ szFww; e Alex Woodie, “Data Prep Still Dominates Data Scientists' Time,
Survey Finds”, Datanami, 6 de julho de 2020, https:// oreil.ly/ jDVWF.
Machine Translated by Google
Capítulo 2. O Ciclo de
Vida da Engenharia de Dados
Neste capítulo, você aprenderá sobre o ciclo de vida da engenharia de dados, que é o
tema central deste livro. O ciclo de vida da engenharia de dados é nossa estrutura que
descreve a engenharia de dados “do berço ao túmulo”. Você também aprenderá sobre as
correntes ocultas do ciclo de vida da engenharia de dados, que são as principais bases que
suportam todos os esforços de engenharia de dados.
Geração
Armazenar
Ingestão
Machine Translated by Google
Transformação
Dados de veiculação
Começamos o ciclo de vida da engenharia de dados obtendo dados dos sistemas de origem e
armazenando-os. Em seguida, transformamos os dados e prosseguimos para nosso objetivo
central, fornecendo dados para analistas, cientistas de dados, engenheiros de ML e outros. Na
realidade, o armazenamento ocorre durante todo o ciclo de vida, à medida que os dados fluem
do início ao fim – portanto, o diagrama mostra o “estágio” de armazenamento como uma base
que sustenta outros estágios.
Atuando como um alicerce estão as correntes ocultas (Figura 2-1, inferior) que atravessam
vários estágios do ciclo de vida da engenharia de dados: segurança, gerenciamento de dados,
DataOps, arquitetura de dados, orquestração e engenharia de software. Nenhuma parte do
ciclo de vida da engenharia de dados pode funcionar adequadamente sem essas tendências.
Machine Translated by Google
Você pode estar se perguntando sobre a diferença entre o ciclo de vida geral dos
dados e o ciclo de vida da engenharia de dados. Há uma distinção sutil entre os dois.
O ciclo de vida da engenharia de dados é um subconjunto de todo o ciclo de vida dos
dados (Figura 2-2). Enquanto o ciclo de vida de dados completo abrange dados em
toda a sua vida útil, o ciclo de vida de engenharia de dados se concentra nos estágios
que um engenheiro de dados controla.
Figura 2-2. O ciclo de vida de engenharia de dados é um subconjunto do ciclo de vida de dados completo
A Figura 2-3 ilustra um sistema de origem tradicional com vários servidores de aplicativos
suportados por um banco de dados. Esse padrão de sistema de origem tornou-se popular na década
de 1980 com o sucesso explosivo dos sistemas de gerenciamento de banco de dados relacional
(RDBMSs). O padrão aplicativo + banco de dados permanece popular hoje com várias evoluções
modernas de práticas de desenvolvimento de software.
Por exemplo, os aplicativos geralmente consistem em muitos pequenos pares de serviço/
banco de dados com microsserviços, em vez de um único monólito.
Vejamos outro exemplo de um sistema de origem. A Figura 2-4 ilustra um enxame de IoT:
uma frota de dispositivos (círculos) envia mensagens de dados (retângulos) para um sistema
de coleta central. Esse sistema de origem IoT é cada vez mais comum à medida que
dispositivos IoT, como sensores, dispositivos inteligentes e muito mais, aumentam na natureza.
Figura 2-4. Exemplo de sistema de origem: um enxame de IoT e uma fila de mensagens
A que taxa os dados são gerados? Quantos eventos por segundo? Quantos
gigabytes por hora?
Machine Translated by Google
Que nível de consistência os engenheiros de dados podem esperar dos dados de saída? Se você
estiver executando verificações de qualidade de dados em relação aos dados de saída, com que
frequência ocorrem inconsistências de dados — nulos onde não são esperados, formatação ruim
etc.?
Alguns valores de dados chegarão atrasados, possivelmente muito mais tarde do que outras
mensagens produzidas simultaneamente?
Qual é o esquema dos dados ingeridos? Os engenheiros de dados precisarão unir várias tabelas
ou mesmo vários sistemas para obter uma visão completa dos dados?
Se o esquema muda (digamos, uma nova coluna é adicionada), como isso é tratado e comunicado
aos interessados a jusante?
Para sistemas com estado (por exemplo, um banco de dados que rastreia as informações
da conta do cliente), os dados são fornecidos como instantâneos periódicos ou eventos de
atualização do change data capture (CDC)? Qual é a lógica de como as alterações são executadas
e como elas são rastreadas no banco de dados de origem?
O sistema de origem tem dependências de dados upstream? Quais são as características desses
sistemas upstream?
As fontes produzem dados consumidos por sistemas downstream, incluindo planilhas geradas por humanos,
sensores de IoT e aplicativos da Web e móveis. Cada fonte tem seu volume e cadência únicos de geração
de dados. Um engenheiro de dados deve saber como a fonte gera dados, incluindo dados relevantes
Machine Translated by Google
peculiaridades ou nuances. Os engenheiros de dados também precisam entender os limites dos sistemas de
origem com os quais interagem. Por exemplo, as consultas analíticas em um banco de dados do aplicativo de
Uma das nuances mais desafiadoras dos dados de origem é o esquema. O esquema define a organização
hierárquica dos dados. Logicamente, podemos pensar em dados no nível de todo um sistema de origem,
detalhando tabelas individuais, até a estrutura dos respectivos campos. O esquema de dados enviados
Schemaless não significa ausência de esquema. Em vez disso, significa que o aplicativo define o esquema à
medida que os dados são gravados, seja em uma fila de mensagens, um arquivo simples, um blob ou um
banco de dados de documentos como o MongoDB. Um modelo mais tradicional construído no armazenamento
de banco de dados relacional usa um esquema fixo aplicado no banco de dados, ao qual as gravações do
Qualquer um desses modelos apresenta desafios para engenheiros de dados. Os esquemas mudam ao
desenvolvimento de software. Uma parte fundamental do trabalho do engenheiro de dados é receber a entrada
de dados brutos no esquema do sistema de origem e transformá-la em uma saída valiosa para análise. Esse
Mergulhamos nos sistemas de origem com mais detalhes no Capítulo 5; também abordamos esquemas e
Armazenar
Após a ingestão de dados, você precisa de um local para armazená-los. A escolha de uma solução
de armazenamento é fundamental para o sucesso no restante do ciclo de vida dos dados e também é um dos
estágios mais complicados do ciclo de vida dos dados por vários motivos.
como armazenamento, com muitas suportando consultas de transformação complexas; até mesmo as soluções
de armazenamento de objetos podem oferecer suporte a recursos avançados de consulta, por exemplo, Amazon S3
Machine Translated by Google
Aqui estão algumas perguntas importantes de engenharia a serem feitas ao escolher um sistema de
armazenamento para um data warehouse, data lakehouse, banco de dados ou armazenamento de objetos:
Você entende como essa tecnologia de armazenamento funciona? Você está utilizando o
sistema de armazenamento de forma otimizada ou cometendo atos não naturais?
Por exemplo, você está aplicando uma alta taxa de atualizações de acesso aleatório em um sistema
de armazenamento de objetos? (Este é um antipadrão com sobrecarga de desempenho significativa.)
Este sistema de armazenamento lidará com a escala futura prevista? Você deve considerar todos
os limites de capacidade do sistema de armazenamento: armazenamento total disponível, taxa
de operação de leitura, volume de gravação etc.
Você está capturando metadados sobre evolução de esquema, fluxos de dados, linhagem de
dados e assim por diante? Os metadados têm um impacto significativo na utilidade dos dados.
Os metadados representam um investimento no futuro, aumentando drasticamente a
capacidade de descoberta e o conhecimento institucional para otimizar projetos futuros e
mudanças de arquitetura.
Como você está rastreando dados mestre, qualidade de dados de registros dourados e
linhagem de dados para governança de dados? (Temos mais a dizer sobre isso em
“Gerenciamento de Dados”.)
Nem todos os dados são acessados da mesma maneira. Os padrões de recuperação variam muito
com base nos dados armazenados e consultados. Isso traz à tona a noção das “temperaturas” dos
dados. A frequência de acesso aos dados determinará a temperatura dos seus dados.
Os dados acessados com mais frequência são chamados de dados quentes. Os dados
quentes geralmente são recuperados muitas vezes por dia, talvez até várias vezes por segundo,
em sistemas que atendem a solicitações de usuários. Esses dados devem ser armazenados para
recuperação rápida, onde “rápido” é relativo ao caso de uso. Dados mornos podem ser acessados
de vez em quando – digamos, toda semana ou mês.
Que tipo de solução de armazenamento você deve usar? Isso depende de seus casos de uso, volumes de
dados, frequência de ingestão, formato e tamanho dos dados que estão sendo ingeridos — basicamente,
as principais considerações listadas nas perguntas com marcadores anteriores. Não há uma recomendação
de armazenamento universal de tamanho único. Toda tecnologia de armazenamento tem suas desvantagens.
O Capítulo 6 aborda as melhores práticas e abordagens de armazenamento com mais detalhes, bem como o
Ingestão
Depois de entender a fonte de dados e as características do sistema de origem que está usando, você
precisa coletar os dados. A segunda etapa do ciclo de vida da engenharia de dados é a ingestão de dados
significativos do ciclo de vida da engenharia de dados. Os sistemas de origem normalmente estão fora de seu
controle direto e podem deixar de responder aleatoriamente ou fornecer dados de baixa qualidade. Ou seu
serviço de ingestão de dados pode parar de funcionar misteriosamente por vários motivos. Como resultado, o
fluxo de dados para ou fornece dados insuficientes para armazenamento, processamento e veiculação.
Sistemas de origem e ingestão não confiáveis têm um efeito cascata em todo o ciclo de vida da engenharia de
dados. Mas você está em boa forma, supondo que tenha respondido às grandes questões sobre sistemas de
origem.
Ao se preparar para arquitetar ou construir um sistema, aqui estão algumas perguntas principais sobre
o estágio de ingestão:
Machine Translated by Google
Quais são os casos de uso para os dados que estou ingerindo? Posso reutilizar esses dados
em vez de criar várias versões do mesmo conjunto de dados?
Os sistemas estão gerando e ingerindo esses dados de forma confiável e os dados estão
disponíveis quando eu preciso deles?
Os dados de origem estão em boas condições para uso imediato a jusante? Em caso
afirmativo, por quanto tempo e o que pode fazer com que seja inutilizável?
Se os dados forem de uma fonte de streaming, eles precisam ser transformados antes de
chegar ao destino? Uma transformação em andamento seria apropriada, onde os dados
são transformados dentro do próprio fluxo?
Esses são apenas uma amostra dos fatores que você precisará considerar com a
ingestão, e abordaremos essas questões e muito mais no Capítulo 7. Antes de sairmos, vamos
voltar brevemente nossa atenção para dois conceitos principais de ingestão de dados: lote versus
streaming e push versus puxar.
A ingestão de streaming nos permite fornecer dados para sistemas downstream — sejam
outros aplicativos, bancos de dados ou sistemas de análise — de maneira contínua e em
tempo real. Aqui, em tempo real (ou quase em tempo real) significa que os dados estão disponíveis
para um sistema downstream pouco tempo depois de serem
Machine Translated by Google
produzido (por exemplo, menos de um segundo depois). A latência necessária para se qualificar como
em tempo real varia de acordo com o domínio e os requisitos.
Quais são meus casos de uso para ingestão de streaming? Quais benefícios específicos eu
percebo ao implementar o streaming? Se eu obtiver dados em tempo real, que ações posso
tomar nesses dados que seriam uma melhoria no lote?
Minha abordagem de streaming em primeiro lugar custará mais em termos de tempo, dinheiro,
manutenção, tempo de inatividade e custo de oportunidade do que simplesmente fazer?
Machine Translated by Google
lote?
Quais ferramentas são mais apropriadas para o caso de uso? Devo usar um
serviço gerenciado (Amazon Kinesis, Google Cloud Pub/Sub, Google Cloud Dataflow)
ou criar minhas próprias instâncias de Kafka, Flink, Spark, Pulsar etc.? Se eu fizer o último,
quem irá gerenciá-lo? Quais são os custos e trade-offs?
Se estou implantando um modelo de ML, quais benefícios tenho com previsões online
e possivelmente treinamento contínuo?
Como você pode ver, transmitir primeiro pode parecer uma boa ideia, mas nem sempre é
simples; custos e complexidades extras ocorrem inerentemente.
Muitas estruturas de ingestão excelentes lidam com estilos de ingestão em lote e microlote.
Achamos que o lote é uma abordagem excelente para muitos casos de uso comuns, como
treinamento de modelo e relatórios semanais. Adote o streaming em tempo real somente após
identificar um caso de uso de negócios que justifique as compensações em relação ao uso de
lote.
cronograma. Você aprenderá mais sobre ETL e extrair, carregar, transformar (ELT) ao longo deste
livro.
Em outro exemplo, considere o CDC contínuo, que é alcançado de algumas maneiras. Um método
comum aciona uma mensagem sempre que uma linha é alterada no banco de dados de origem. Essa
mensagem é enviada para uma fila, onde o sistema de ingestão a coleta. Outro método CDC comum
usa logs binários, que registram cada confirmação no banco de dados. O banco de dados envia para
seus logs. O sistema de ingestão lê os logs, mas não interage diretamente com o banco de dados. Isso
adiciona pouca ou nenhuma carga adicional ao banco de dados de origem. Algumas versões do CDC
em lote usam o padrão pull . Por exemplo, no CDC baseado em carimbo de data/hora, um sistema de
ingestão consulta o banco de dados de origem e extrai as linhas que foram alteradas desde a atualização
anterior.
Com a ingestão de streaming, os dados ignoram um banco de dados de back-end e são enviados
diretamente para um endpoint, normalmente com dados armazenados em buffer por uma plataforma
de streaming de eventos. Esse padrão é útil com frotas de sensores de IoT que emitem dados de
sensores. Em vez de depender de um banco de dados para manter o estado atual, simplesmente
pensamos em cada leitura registrada como um evento. Esse padrão também está crescendo em
popularidade em aplicativos de software, pois simplifica o processamento em tempo real, permite que
os desenvolvedores de aplicativos personalizem suas mensagens para análises downstream e
simplifica muito a vida dos engenheiros de dados.
Transformação
Depois de ingerir e armazenar dados, você precisa fazer algo com eles.
O próximo estágio do ciclo de vida da engenharia de dados é a transformação, o que significa que os
dados precisam ser alterados de sua forma original para algo útil para casos de uso downstream. Sem
as transformações adequadas, os dados ficarão inertes e não estarão em uma forma útil para relatórios,
análises ou ML. Normalmente, o estágio de transformação é onde os dados começam a criar valor para
o consumo do usuário downstream.
Machine Translated by Google
Você pode transformar dados em lote ou durante o streaming em voo. Conforme mencionado
em “Ingestão”, praticamente todos os dados iniciam a vida como um fluxo contínuo; batch é
apenas uma forma especializada de processar um fluxo de dados. As transformações em
lote são extremamente populares, mas dada a crescente popularidade das soluções de
processamento de fluxo e o aumento geral na quantidade de dados de streaming, esperamos
que a popularidade das transformações de streaming continue crescendo, talvez substituindo
inteiramente o processamento em lote em determinados domínios
em breve.
A transformação é um assunto profundo, e não podemos fazer justiça a isso nesta breve
introdução. O Capítulo 8 aprofunda consultas, modelagem de dados e várias práticas e nuances
de transformação.
Dados de veiculação
Você atingiu o último estágio do ciclo de vida da engenharia de dados. Agora que os dados foram
ingeridos, armazenados e transformados em estruturas coerentes e úteis, é hora de obter valor de
seus dados. “Obter valor” dos dados significa coisas diferentes para usuários diferentes.
Os dados têm valor quando são usados para fins práticos. Os dados que não são
consumidos ou consultados são simplesmente inertes. Os projetos de vaidade de dados são
um grande risco para as empresas. Muitas empresas buscaram projetos de vaidade na era do big data,
Machine Translated by Google
reunindo grandes conjuntos de dados em data lakes que nunca foram consumidos de
forma útil. A era da nuvem está desencadeando uma nova onda de projetos de vaidade
construídos nos mais recentes data warehouses, sistemas de armazenamento de objetos
e tecnologias de streaming. Os projetos de dados devem ser intencionais em todo o ciclo de
vida. Qual é o objetivo comercial final dos dados coletados, limpos e armazenados com tanto
cuidado?
Análise
A análise é o núcleo da maioria dos esforços de dados. Depois que seus dados forem
armazenados e transformados, você estará pronto para gerar relatórios ou painéis e fazer
análises ad hoc dos dados. Enquanto a maior parte das análises costumava abranger o BI,
agora inclui outras facetas, como análises operacionais e análises voltadas para o cliente
(Figura 2-5). Vamos abordar brevemente essas variações de análise.
Inteligência de negócios
Os marechais de BI coletaram dados para descrever o estado passado e atual de uma empresa.
O BI requer o uso de lógica de negócios para processar dados brutos. Observe que o fornecimento
de dados para análise é outra área em que os estágios do ciclo de vida da engenharia de dados
podem se confundir. Como mencionamos anteriormente, a lógica de negócios geralmente é
aplicada aos dados no estágio de transformação do ciclo de vida da engenharia de dados, mas
uma abordagem lógica na leitura tornou-se cada vez mais popular. Os dados são
Machine Translated by Google
armazenado em uma forma limpa, mas bastante bruta, com lógica de negócios de pós-
processamento mínima. Um sistema de BI mantém um repositório de definições e lógica de negócios.
Essa lógica de negócios é usada para consultar o data warehouse para que os relatórios e
painéis se alinhem às definições de negócios.
À medida que uma empresa aumenta sua maturidade de dados, ela passará da
análise de dados ad hoc para a análise de autoatendimento, permitindo acesso
democratizado aos dados para usuários de negócios sem a necessidade de intervenção
da TI. A capacidade de fazer análises de autoatendimento pressupõe que os dados são
bons o suficiente para que as pessoas em toda a organização possam simplesmente acessá-
los, cortá-los como quiserem e obter insights imediatos. Embora a análise de autoatendimento
seja simples na teoria, é difícil de realizar na prática. A principal razão é que a baixa qualidade
dos dados, os silos organizacionais e a falta de habilidades de dados adequadas impedem o
uso generalizado de análises.
Análise operacional
Análise incorporada
Você pode se perguntar por que dividimos a análise incorporada (análise voltada para o
cliente) separadamente do BI. Na prática, as análises fornecidas aos clientes em uma
plataforma SaaS vêm com um conjunto separado de requisitos e complicações. O BI interno
enfrenta um público limitado e geralmente apresenta um número limitado de visualizações
unificadas. Os controles de acesso são críticos, mas não particularmente complicados. O
MÚLTIPLOS INQUILINOS
Aprendizado de máquina
Um engenheiro de dados deve estar familiarizado com ML? Certamente ajuda. Independentemente
do limite operacional entre engenharia de dados, engenharia de ML, análise de negócios e assim
por diante, os engenheiros de dados devem manter o conhecimento operacional sobre suas equipes.
Um bom engenheiro de dados conhece as técnicas fundamentais de ML e os requisitos de
processamento de dados relacionados, os casos de uso de modelos em sua empresa e as
responsabilidades das várias equipes de análise da organização. Isso ajuda a manter uma
comunicação eficiente e facilita a colaboração. Idealmente, os engenheiros de dados criarão
ferramentas em parceria com outras equipes que nenhuma das equipes pode criar de forma
independente.
Este livro não pode cobrir ML em profundidade. Um ecossistema crescente de livros, vídeos,
artigos e comunidades está disponível se você estiver interessado em aprender mais; incluímos
algumas sugestões em “Recursos Adicionais”.
A seguir estão algumas considerações para a fase de veiculação de dados específica para
ML:
ETL reverso
O ETL reverso tem sido uma realidade prática em dados, visto como um
antipadrão que não gostamos de falar ou dignificar com um nome. O ETL reverso
pega os dados processados do lado de saída do ciclo de vida da engenharia de dados
e os realimenta nos sistemas de origem, conforme mostrado na Figura 2-6. Na
realidade, esse fluxo é benéfico e muitas vezes necessário; O ETL reverso nos permite
obter análises, modelos pontuados, etc., e alimentá-los de volta em sistemas de
produção ou plataformas SaaS.
Machine Translated by Google
Enquanto escrevíamos este livro, vários fornecedores adotaram o conceito de ETL reverso e
criaram produtos em torno dele, como Hightouch e Census.
O ETL reverso permanece incipiente como um campo, mas suspeitamos que ele veio para
ficar.
O júri está decidindo se o termo ETL reverso se manterá. E a prática pode evoluir. Alguns
engenheiros afirmam que podemos eliminar o ETL reverso manipulando transformações de
dados em um fluxo de eventos e enviando esses eventos de volta aos sistemas de origem
conforme necessário. Percebendo a adoção generalizada deste
Machine Translated by Google
padrão entre as empresas é outra questão. A essência é que os dados transformados precisarão
ser devolvidos aos sistemas de origem de alguma maneira, idealmente com a linhagem e o
processo de negócios corretos associados ao sistema de origem.
Segurança
A segurança deve ser prioridade para os engenheiros de dados, e aqueles que a ignoram o
fazem por sua conta e risco. É por isso que a segurança é a primeira tendência. Os engenheiros
de dados devem entender tanto a segurança de dados quanto de acesso, exercendo o princípio de
Machine Translated by Google
Dê aos usuários apenas o acesso de que precisam para realizar seus trabalhos hoje, nada mais.
Não opere a partir de um shell root quando estiver apenas procurando por arquivos visíveis
com acesso de usuário padrão. Ao consultar tabelas com uma função menor, não use a função
de superusuário em um banco de dados. Impor o princípio do menor privilégio a nós mesmos
pode evitar danos acidentais e mantê-lo em uma mentalidade de segurança em primeiro lugar.
A segurança dos dados também tem a ver com o tempo – fornecer acesso aos dados
exatamente para as pessoas e sistemas que precisam acessá-los e apenas pela duração
necessária para realizar seu trabalho. Os dados devem ser protegidos contra visibilidade
indesejada, tanto em voo quanto em repouso, usando criptografia, tokenização, mascaramento
de dados, ofuscação e controles de acesso simples e robustos.
Ao longo do livro, destacamos as áreas em que a segurança deve ser prioridade no ciclo de
vida da engenharia de dados. Você também pode obter informações mais detalhadas sobre
segurança no Capítulo 10.
Machine Translated by Google
Gestão de dados
Você provavelmente acha que o gerenciamento de dados soa muito... corporativo. As práticas de
gerenciamento de dados “old school” chegam aos dados e à engenharia de ML. O que é velho é
novo de novo. O gerenciamento de dados existe há décadas, mas não obteve muita tração na
engenharia de dados até recentemente.
As ferramentas de dados estão se tornando mais simples e há menos complexidade para os
engenheiros de dados gerenciarem. Como resultado, o engenheiro de dados sobe na cadeia
de valor em direção ao próximo degrau das melhores práticas. As melhores práticas de dados
antes reservadas para grandes empresas – governança de dados, gerenciamento de dados mestre,
gerenciamento de qualidade de dados, gerenciamento de metadados – agora estão sendo filtradas
para empresas de todos os tamanhos e níveis de maturidade. Como gostamos de dizer, a engenharia
de dados está se tornando “empresarial”. Isso é, em última análise, uma grande coisa!
Isso é um pouco longo, então vamos ver como isso se relaciona com a engenharia de dados. Os
engenheiros de dados gerenciam o ciclo de vida dos dados e o gerenciamento de dados abrange o
conjunto de práticas recomendadas que os engenheiros de dados usarão para realizar essa tarefa,
tanto técnica quanto estrategicamente. Sem uma estrutura para gerenciar dados, os engenheiros de
dados são simplesmente técnicos operando no vácuo. Os engenheiros de dados precisam de uma
perspectiva mais ampla da utilidade dos dados em toda a organização, desde os sistemas de origem
até o C-suite e em todos os lugares entre eles.
Linhagem de dados
Armazenamento e operações
Ética e privacidade
Embora este livro não seja um recurso exaustivo sobre gerenciamento de dados, vamos abordar
brevemente alguns pontos importantes de cada área no que se refere à engenharia de dados.
Governança de dados
De acordo com Data Governance: The Definitive Guide, “A governança de dados é, antes de
tudo, uma função de gerenciamento de dados para garantir a qualidade, integridade, segurança e
usabilidade dos dados coletados por uma organização”.
1
Podemos expandir essa definição e dizer que a governança de dados envolve pessoas,
processos e tecnologias para maximizar o valor dos dados em uma organização enquanto
protege os dados com controles de segurança apropriados.
A governança de dados eficaz é desenvolvida com intenção e apoiada pela organização. Quando
a governança de dados é acidental e aleatória, os efeitos colaterais podem variar de dados não
confiáveis a violações de segurança e tudo mais. Ser intencional sobre a governança de dados
maximizará os recursos de dados da organização e o valor gerado a partir dos dados. Também
(espero) manterá uma empresa fora das manchetes por práticas de dados questionáveis ou
totalmente imprudentes.
Machine Translated by Google
A governança de dados é uma base para práticas de negócios orientadas por dados e uma
parte essencial do ciclo de vida da engenharia de dados. Quando a governança de dados é
bem praticada, pessoas, processos e tecnologias se alinham para tratar os dados como um
fator-chave de negócios; se ocorrerem problemas de dados, eles serão prontamente tratados.
Capacidade de
Metadados
Metadados são “dados sobre dados” e sustentam cada seção do ciclo de vida da engenharia
de dados. Metadados são exatamente os dados necessários para tornar os dados
detectáveis e governáveis.
A tecnologia pode ajudar nesse processo, removendo grande parte do trabalho propenso a erros
da coleta manual de metadados. Estamos vendo uma proliferação de catálogos de dados, sistemas
de rastreamento de linhagem de dados e ferramentas de gerenciamento de metadados.
As ferramentas podem rastrear bancos de dados para procurar relacionamentos e
monitorar pipelines de dados para rastrear de onde os dados vêm e para onde vão. Uma
abordagem manual de baixa fidelidade usa um esforço conduzido internamente em que várias
partes interessadas fazem crowdsourcing da coleta de metadados dentro da organização. Essas
ferramentas de gerenciamento de dados são abordadas em profundidade ao longo do livro, pois
prejudicam grande parte do ciclo de vida da engenharia de dados.
Os dados têm um elemento social; cada organização acumula capital social e conhecimento em
torno de processos, conjuntos de dados e pipelines. Os sistemas de metadados orientados para
humanos concentram-se no aspecto social dos metadados. Isso é algo que o Airbnb enfatizou em
suas várias postagens de blog sobre ferramentas de dados, particularmente seu conceito original
3 para divulgar proprietários de dados,
de Dataportal. Essas ferramentas devem fornecer um local
consumidores de dados e especialistas de domínio.
As ferramentas de documentação e wiki internas fornecem uma base fundamental para
o gerenciamento de metadados, mas essas ferramentas também devem se integrar à catalogação
automatizada de dados. Por exemplo, ferramentas de varredura de dados podem gerar páginas
wiki com links para objetos de dados relevantes.
Uma vez que existam sistemas e processos de metadados, os engenheiros de dados podem
consumir metadados de maneiras úteis. Os metadados se tornam a base para projetar pipelines
e gerenciar dados ao longo do ciclo de vida.
O DMBOK identifica quatro categorias principais de metadados que são úteis para engenheiros
de dados:
Metadados comerciais
Machine Translated by Google
Metadados técnicos
Metadados operacionais
Metadados de referência
Os metadados de negócios estão relacionados à maneira como os dados são usados nos negócios,
incluindo definições de negócios e dados, regras e lógica de dados, como e onde os dados são
usados e o(s) proprietário(s) dos dados.
Um engenheiro de dados usa metadados de negócios para responder a perguntas não técnicas
sobre quem, o quê, onde e como. Por exemplo, um engenheiro de dados pode ser encarregado
de criar um pipeline de dados para análise de vendas do cliente. Mas o que é um cliente? É alguém
que comprou nos últimos 90 dias? Ou alguém que comprou a qualquer momento o negócio foi aberto?
Um engenheiro de dados usaria os dados corretos para se referir aos metadados de negócios
(dicionário de dados ou catálogo de dados) para pesquisar como um “cliente” é definido. Os metadados
de negócios fornecem a um engenheiro de dados o contexto e as definições corretos para usar os
dados corretamente.
Os metadados técnicos descrevem os dados criados e usados pelos sistemas em todo o ciclo de
vida da engenharia de dados. Inclui o modelo e esquema de dados, linhagem de dados,
mapeamentos de campo e fluxos de trabalho de pipeline. Um engenheiro de dados usa metadados
técnicos para criar, conectar e monitorar vários sistemas ao longo do ciclo de vida da engenharia
de dados.
Aqui estão alguns tipos comuns de metadados técnicos que um engenheiro de dados usará:
Linhagem de dados
Esquema
Estes são apenas alguns exemplos de metadados técnicos que um engenheiro de dados deve
conhecer. Esta não é uma lista completa e abordamos aspectos adicionais de metadados
técnicos em todo o livro.
Metadados de referência são dados usados para classificar outros dados. Isso também é
conhecido como dados de pesquisa. Exemplos padrão de dados de referência são códigos
internos, códigos geográficos, unidades de medida e padrões de calendário internos.
Observe que muitos dos dados de referência são totalmente gerenciados internamente, mas itens
como códigos geográficos podem vir de referências externas padrão.
Machine Translated by Google
Os dados de referência são essencialmente um padrão para interpretar outros dados, portanto, se houver
alterações, essa alteração ocorrerá lentamente ao longo do tempo.
Responsabilidade de dados
Responsabilidade de dados significa designar um indivíduo para controlar uma parte dos dados. A
pessoa responsável coordena então as atividades de governança de outras partes interessadas. Gerenciar
a qualidade dos dados é difícil se ninguém for responsável pelos dados em questão.
Observe que as pessoas responsáveis pelos dados não precisam ser engenheiros de dados. A
pessoa responsável pode ser um engenheiro de software ou gerente de produto, ou servir em outra
função. Além disso, o responsável geralmente não possui todos os recursos necessários para manter a
qualidade dos dados. Em vez disso, eles coordenam com todas as pessoas que tocam os dados, incluindo
engenheiros de dados.
A responsabilidade de dados pode acontecer em vários níveis; a responsabilidade pode ocorrer no nível de
uma tabela ou de um fluxo de logs, mas pode ser tão refinada quanto uma entidade de campo único que
ocorre em muitas tabelas. Um indivíduo pode ser responsável pelo gerenciamento de um ID de cliente em
vários sistemas. Para gerenciamento de dados corporativos, um domínio de dados é o conjunto de todos os
valores possíveis que podem ocorrer para um determinado tipo de campo, como neste exemplo de ID. Isso
pode parecer excessivamente burocrático e meticuloso, mas pode afetar significativamente a qualidade dos
dados.
—Todos no negócio
A qualidade dos dados é a otimização dos dados em direção ao estado desejado e orbita a pergunta: “O
que você obtém em comparação com o que espera?” Os dados devem estar em conformidade com as
expectativas nos metadados de negócios. Os dados correspondem à definição acordada pela empresa?
Um engenheiro de dados garante a qualidade dos dados em todo o ciclo de vida da engenharia de
dados. Isso envolve realizar testes de qualidade de dados e garantir a conformidade dos dados com
as expectativas do esquema, integridade e precisão dos dados.
Machine Translated by Google
De acordo com o Data Governance: The Definitive Guide, a qualidade dos dados é
definida por três características principais: 4
Precisão
Completude
Pontualidade
Cada uma dessas características é bastante matizada. Por exemplo, como pensamos em
bots e web scrapers ao lidar com dados de eventos da web? Se pretendemos analisar a
jornada do cliente, devemos ter um processo que nos permita separar humanos do tráfego
gerado por máquina. Quaisquer eventos gerados por bots classificados erroneamente como
humanos apresentam problemas de precisão de dados e vice-versa.
Fundamentalmente, este problema não pode ser resolvido por meios puramente técnicos.
Em vez disso, os engenheiros precisarão determinar seus padrões para dados de chegada
tardia e aplicá-los de maneira uniforme, possivelmente com a ajuda de várias ferramentas
de tecnologia.
qualidade dos dados e usar ferramentas de tecnologia para detectar problemas de qualidade
Machine Translated by Google
O MDM alcança todo o ciclo de dados em bancos de dados operacionais. Pode estar
diretamente sob a alçada da engenharia de dados, mas geralmente é responsabilidade
atribuída a uma equipe dedicada que trabalha em toda a organização. Mesmo que não
possuam MDM, os engenheiros de dados devem estar sempre cientes disso, pois colaborarão
em iniciativas de MDM.
obter insights de negócios a partir de dados, por meio de análise de negócios e ciência de dados,
os dados devem estar em um formato utilizável. O processo de conversão de dados em um formato
utilizável é conhecido como modelagem e design de dados. Enquanto tradicionalmente pensamos
na modelagem de dados como um problema para administradores de banco de dados (DBAs) e
desenvolvedores de ETL, a modelagem de dados pode acontecer em praticamente qualquer lugar
de uma organização. Os engenheiros de firmware desenvolvem o formato de dados de um registro
para um dispositivo IoT ou o design de desenvolvedores de aplicativos da Web
Machine Translated by Google
a resposta JSON a uma chamada de API ou a um esquema de tabela MySQL — todas são instâncias
de modelagem e design de dados.
A modelagem de dados tornou-se mais desafiadora devido à variedade de novas fontes de dados e
casos de uso. Por exemplo, a normalização estrita não funciona bem com dados de eventos.
Felizmente, uma nova geração de ferramentas de dados aumenta a flexibilidade dos modelos de
dados, mantendo as separações lógicas de medidas, dimensões, atributos e hierarquias. Os data
warehouses em nuvem suportam a ingestão de enormes quantidades de dados desnormalizados e
semiestruturados, enquanto ainda suportam padrões comuns de modelagem de dados, como Kimball,
Inmon e cofre de dados. Estruturas de processamento de dados, como o Spark, podem ingerir todo
um espectro de dados, desde registros relacionais estruturados simples até texto bruto não
estruturado. Discutimos esses padrões de modelagem e transformação de dados com mais detalhes
no Capítulo 8.
Com a grande variedade de dados com os quais os engenheiros precisam lidar, existe a
tentação de jogar as mãos para o alto e desistir da modelagem de dados. Esta é uma ideia terrível
com consequências angustiantes, evidenciadas quando as pessoas murmuram sobre o padrão de
acesso write uma vez, read never (WORN) ou referem-se a um pântano de dados. Os engenheiros
de dados precisam entender as práticas recomendadas de modelagem, bem como desenvolver a
flexibilidade para aplicar o nível e o tipo apropriados de modelagem à fonte de dados e ao caso de
uso.
Linhagem de dados
À medida que os dados se movem ao longo de seu ciclo de vida, como você sabe qual sistema afetou
os dados ou do que os dados são compostos à medida que são transmitidos e transformados? A
linhagem de dados descreve o registro de uma trilha de auditoria de dados ao longo de seu ciclo de
vida, rastreando os sistemas que processam os dados e os dados upstream dos quais depende.
A linhagem de dados existe há muito tempo em empresas maiores com padrões rígidos de
conformidade. No entanto, agora está sendo mais amplamente adotado em empresas menores à
medida que o gerenciamento de dados se torna popular. Também observamos que o conceito de
Desenvolvimento Orientado à Observabilidade de Dados (DODD) de Andy Petrella está intimamente
relacionado à linhagem de dados. O DODD observa dados ao longo de sua linhagem. Este processo
é aplicado durante o desenvolvimento, teste e, finalmente, produção para entregar qualidade e
conformidade com as expectativas.
Cada vez mais, a integração acontece por meio de APIs de uso geral, em vez de conexões de
banco de dados personalizadas. Por exemplo, um pipeline de dados pode extrair dados da API do
Salesforce, armazená-los no Amazon S3, chamar a API do Snowflake para carregá-los em uma
tabela, chamar a API novamente para executar uma consulta e exportar os resultados para o S3,
onde o Spark pode consumi-los.
Toda essa atividade pode ser gerenciada com código Python relativamente simples que se
comunica com sistemas de dados em vez de manipular os dados diretamente. Embora a
complexidade da interação com os sistemas de dados tenha diminuído, o número de sistemas e a
complexidade dos pipelines aumentaram drasticamente.
Engenheiros começando do zero rapidamente superam os recursos de scripts sob medida e se
deparam com a necessidade de orquestração. A orquestração é uma de nossas correntes, e
discutimos isso em detalhes em “Orquestração”.
Primeiro, os dados são cada vez mais armazenados na nuvem. Isso significa que temos custos
de armazenamento com pagamento conforme o uso, em vez de grandes despesas de capital
iniciais para um data lake local. Quando cada byte aparece em um extrato mensal da AWS, os
CFOs veem oportunidades de economia. Os ambientes em nuvem tornam o arquivamento de
dados um processo relativamente simples. Os principais fornecedores de nuvem oferecem classes de
armazenamento de objetos específicas de arquivamento que permitem a retenção de dados a longo
prazo a um custo extremamente baixo, assumindo acesso muito pouco frequente (deve-se notar que
a recuperação de dados não é tão barata, mas isso é para outra conversa).
Essas classes de armazenamento também oferecem suporte a controles de política
extras para evitar a exclusão acidental ou deliberada de arquivos críticos.
Em segundo lugar, as leis de privacidade e retenção de dados, como o GDPR e o CCPA, exigem
que os engenheiros de dados gerenciem ativamente a destruição de dados para respeitar o “direito
de ser esquecido” dos usuários. Os engenheiros de dados devem saber quais dados do consumidor
eles retêm e devem ter procedimentos para destruir dados em resposta a solicitações e requisitos de
conformidade.
Ética e privacidade
Comportamento ético é fazer a coisa certa quando ninguém mais está olhando.
—Aldo Leopoldo
Os últimos anos de violações de dados, desinformação e manuseio incorreto de dados deixam uma
coisa clara: os dados afetam as pessoas. Os dados costumavam viver no Velho Oeste, coletados e
negociados livremente como cartões de beisebol. Esses dias já se foram. Enquanto as implicações
éticas e de privacidade dos dados já foram consideradas boas de se ter, como segurança, agora elas
são centrais para o ciclo de vida geral dos dados. Os engenheiros de dados precisam fazer a coisa
certa quando ninguém mais está
Machine Translated by Google
assistindo, porque todo mundo vai assistir um dia. Esperamos que mais organizações
encorajem uma cultura de boa ética e privacidade de dados.
Orquestração
A orquestração não é apenas um processo central de DataOps, mas também uma parte
crítica do fluxo de engenharia e implantação para tarefas de dados. Então, o que é
orquestração?
o sistema monitora os trabalhos que gerencia e inicia novas tarefas à medida que as
dependências internas do DAG são concluídas. Ele também pode monitorar sistemas e
ferramentas externas para observar a chegada de dados e o cumprimento de critérios. Quando
certas condições saem dos limites, o sistema também define condições de erro e envia alertas
por e-mail ou outros canais. Você pode definir um tempo de conclusão esperado de 10h para
pipelines de dados diários noturnos. Se os trabalhos não forem concluídos até esse momento,
os alertas serão enviados para engenheiros de dados e consumidores.
A orquestração tem sido um recurso essencial para o processamento de dados, mas muitas
vezes não era a prioridade nem acessível a ninguém, exceto as maiores empresas.
As empresas usavam várias ferramentas para gerenciar fluxos de trabalho, mas
eram caras, fora do alcance de pequenas startups e geralmente não extensíveis.
O Apache Oozie era extremamente popular na década de 2010, mas foi projetado para
funcionar em um cluster Hadoop e era difícil de usar em um ambiente mais heterogêneo. O
Facebook desenvolveu o Dataswarm para uso interno no final dos anos 2000; isso inspirou
ferramentas populares como o Airflow, lançado pelo Airbnb em 2014.
O Airflow era de código aberto desde o início e foi amplamente adotado. Foi escrito em Python,
tornando-o altamente extensível a quase todos os casos de uso imagináveis. Embora existam
muitos outros projetos interessantes de orquestração de código aberto, como Luigi e Conductor,
o Airflow é sem dúvida o líder de mindshare por enquanto. O fluxo de ar chegou no momento
em que o processamento de dados estava se tornando mais abstrato e acessível, e os
engenheiros estavam cada vez mais interessados em coordenar fluxos complexos em vários
processadores e sistemas de armazenamento, especialmente em ambientes de nuvem.
No momento da redação deste artigo, vários projetos de código aberto nascentes visam imitar
os melhores elementos do design principal do Airflow, aprimorando-o em áreas-chave. Algum
Machine Translated by Google
dos exemplos mais interessantes são Prefect e Dagster, que visam melhorar a
portabilidade e testabilidade dos DAGs para permitir que os engenheiros passem do
desenvolvimento local para a produção com mais facilidade. Argo é um mecanismo de
orquestração construído em torno de primitivos do Kubernetes; Metaflow é um projeto de
código aberto da Netflix que visa melhorar a orquestração da ciência de dados.
DataOps
O DataOps mapeia as melhores práticas da metodologia Agile, DevOps e controle
estatístico de processos (SPC) para os dados. Enquanto o DevOps visa melhorar o
lançamento e a qualidade dos produtos de software, o DataOps faz o mesmo com os
produtos de dados.
Práticas Lean (como redução de lead time e minimização de defeitos) e as melhorias resultantes
de qualidade e produtividade são coisas que estamos felizes em ver ganhando força tanto em
operações de software quanto de dados.
Automação
A equipe de engenharia de dados ainda tem espaço para melhorias operacionais. Um cientista
de dados eventualmente implanta um DAG quebrado, derrubando o servidor web do Airflow e
deixando a equipe de dados operacionalmente cega. Depois de tantas dores de cabeça, os
membros da equipe de engenharia de dados percebem que precisam parar de permitir
implantações manuais de DAG. Em sua próxima fase de maturidade operacional, eles adotam
a implantação automatizada de DAG. Os DAGs são testados antes da implantação e os
processos de monitoramento garantem que os novos DAGs comecem a funcionar corretamente.
Além disso, os engenheiros de dados bloqueiam a implantação de novas dependências do
Python até que a instalação seja validada.
Depois que a automação é adotada, a equipe de dados fica muito mais feliz e experimenta
muito menos dores de cabeça.
Um dos princípios do Manifesto DataOps é “Abrace a mudança”. Isso não significa mudança
pela mudança, mas mudança orientada a objetivos. Em cada estágio de nossa jornada de
automação, existem oportunidades de melhoria operacional. Mesmo no alto nível de maturidade
que descrevemos aqui, ainda há espaço para melhorias. Os engenheiros podem adotar uma
estrutura de orquestração de próxima geração que incorpora melhores recursos de metadados.
Ou eles podem tentar desenvolver uma estrutura que cria DAGs automaticamente com base em
especificações de linhagem de dados. O ponto principal é que os engenheiros buscam
constantemente implementar melhorias na automação que reduzam sua carga de trabalho e
aumentem o valor que entregam ao negócio.
Observabilidade e monitoramento
Como dizemos aos nossos clientes: “Os dados são um assassino silencioso”. Vimos
inúmeros exemplos de dados ruins que permanecem em relatórios por meses ou anos. Os
executivos podem tomar decisões importantes a partir desses dados ruins, descobrindo o
erro apenas muito mais tarde. Os resultados geralmente são ruins e às vezes catastróficos
para o negócio. As iniciativas são minadas e destruídas, anos de trabalho desperdiçados.
Em alguns dos piores casos, dados ruins podem levar as empresas à ruína financeira.
Outra história de horror ocorre quando os sistemas que criam os dados para relatórios
param de funcionar aleatoriamente, resultando em relatórios atrasados por
Machine Translated by Google
muitos dias. A equipe de dados não sabe até que seja perguntado pelas partes
interessadas por que os relatórios estão atrasados ou produzem informações obsoletas.
Eventualmente, várias partes interessadas perdem a confiança nos recursos da equipe de
dados principal e iniciam suas próprias equipes fragmentadas. O resultado são muitos sistemas
instáveis diferentes, relatórios inconsistentes e silos.
Se você não estiver observando e monitorando seus dados e os sistemas que os produzem,
inevitavelmente experimentará sua própria história de horror de dados. Observabilidade,
monitoramento, registro, alerta e rastreamento são essenciais para se antecipar a quaisquer
problemas ao longo do ciclo de vida da engenharia de dados. Recomendamos que você incorpore
o SPC para entender se os eventos monitorados estão fora de linha e quais incidentes valem a
pena responder.
O método DODD de Petrella mencionado anteriormente neste capítulo fornece uma excelente
estrutura para pensar sobre a observabilidade de dados. O DODD é muito parecido com o
desenvolvimento orientado a testes (TDD) na engenharia de software:
Resposta a incidentes
Uma equipe de dados de alto funcionamento usando DataOps poderá enviar novos produtos de
dados rapidamente. Mas erros inevitavelmente acontecerão. Um sistema pode ter tempo de
inatividade, um novo modelo de dados pode interromper relatórios de downstream, um modelo de
ML pode ficar obsoleto e fornecer previsões ruins - inúmeros problemas podem interromper o ciclo
de vida da engenharia de dados. A resposta a incidentes é usar os recursos de automação e
observabilidade mencionados anteriormente para
Machine Translated by Google
Resumo do DataOps
Arquitetura de dados
Uma arquitetura de dados reflete o estado atual e futuro dos sistemas de dados que
suportam as necessidades e a estratégia de dados de longo prazo de uma organização.
Como os requisitos de dados de uma organização provavelmente mudarão rapidamente e
novas ferramentas e práticas parecem chegar quase diariamente, os engenheiros de dados
devem entender uma boa arquitetura de dados. O Capítulo 3 cobre a arquitetura de dados
em profundidade, mas queremos destacar aqui que a arquitetura de dados é uma tendência
do ciclo de vida da engenharia de dados.
Isso não significa que um engenheiro de dados seja um arquiteto de dados, pois
normalmente são duas funções separadas. Se um engenheiro de dados trabalha ao
lado de um arquiteto de dados, o engenheiro de dados deve ser capaz de entregar os
projetos do arquiteto de dados e fornecer feedback de arquitetura.
Engenharia de software
A engenharia de software sempre foi uma habilidade central para engenheiros de dados.
Nos primeiros dias da engenharia de dados contemporânea (2000–2010), engenheiros de
dados trabalhavam em estruturas de baixo nível e escreviam trabalhos MapReduce em C,
C++ e Java. No auge da era do big data (meados da década de 2010), os engenheiros
começaram a usar estruturas que abstraíam esses detalhes de baixo nível.
Essa abstração continua até hoje. Os data warehouses na nuvem oferecem suporte a
transformações poderosas usando a semântica do SQL; ferramentas como o Spark tornaram-
se mais fáceis de usar, deixando de lado os detalhes de codificação de baixo nível para
dataframes fáceis de usar. Apesar dessa abstração, a engenharia de software ainda é
fundamental para a engenharia de dados. Queremos discutir brevemente algumas áreas
comuns da engenharia de software que se aplicam ao ciclo de vida da engenharia de dados.
Machine Translated by Google
Embora tenha se tornado mais abstrato e fácil de gerenciar, o código principal de processamento
de dados ainda precisa ser escrito e aparece em todo o ciclo de vida da engenharia de dados. Seja em
ingestão, transformação ou serviço de dados, os engenheiros de dados precisam ser altamente proficientes
e produtivos em estruturas e linguagens como Spark, SQL ou Beam; rejeitamos a noção de que SQL não
é código.
Na era do big data, vimos uma explosão cambriana de estruturas de processamento de dados
dentro do ecossistema Hadoop. Essas ferramentas se concentraram principalmente em transformar e
servir partes do ciclo de vida da engenharia de dados. A especiação de ferramentas de engenharia de
dados não cessou ou desacelerou, mas a ênfase mudou para cima na escada da abstração, longe do
processamento direto de dados. Essa nova geração de ferramentas de código aberto auxilia os engenheiros
no gerenciamento, aprimoramento, conexão, otimização e monitoramento de dados.
Por exemplo, o Airflow dominou o espaço de orquestração de 2015 até o início dos anos 2020. Agora,
um novo lote de concorrentes de código aberto (incluindo Prefect, Dagster e Metaflow) surgiu para
corrigir as limitações percebidas do Airflow, fornecendo melhor manuseio de metadados, portabilidade e
gerenciamento de dependências. Para onde vai o futuro da orquestração é uma incógnita.
Antes que os engenheiros de dados comecem a projetar novas ferramentas internas, eles fariam bem
em pesquisar o cenário de ferramentas disponíveis publicamente. Fique de olho no custo total de
propriedade (TCO) e no custo de oportunidade associado à implementação de uma ferramenta. Há uma
boa chance de que um projeto de código aberto
Machine Translated by Google
já existe para resolver o problema que eles procuram resolver, e eles fariam bem em colaborar
em vez de reinventar a roda.
Transmissão
Por exemplo, tarefas de processamento de dados, como junções, que consideramos garantidas no
mundo do processamento em lote, geralmente se tornam mais complicadas em tempo real, exigindo
engenharia de software mais complexa. Os engenheiros também devem escrever código para aplicar
uma variedade de métodos de janelas . A janela permite que os sistemas em tempo real calculem
métricas valiosas, como estatísticas finais. Os engenheiros têm muitas estruturas para escolher,
incluindo várias plataformas de funções (OpenFaaS, AWS Lambda, Google Cloud Functions) para lidar
com eventos individuais ou processadores de fluxo dedicados (Spark, Beam, Flink ou Pulsar) para
analisar fluxos para oferecer suporte a relatórios e ações em tempo real .
Essas práticas são uma parte vital do DevOps, permitindo o controle de versão e a
repetibilidade das implantações. Naturalmente, esses recursos são preciosos em todo o
ciclo de vida da engenharia de dados, especialmente quando adotamos práticas de
DataOps.
Pipelines como código é o conceito central dos sistemas de orquestração atuais, que
tocam todas as etapas do ciclo de vida da engenharia de dados. Engenheiros de dados
usam código (normalmente Python) para declarar tarefas de dados e dependências entre
eles. O mecanismo de orquestração interpreta essas instruções para executar etapas
usando os recursos disponíveis.
Conclusão
A maioria das discussões que vimos no passado sobre engenharia de dados envolve
tecnologias, mas perde a visão geral do gerenciamento do ciclo de vida dos dados. À
medida que as tecnologias se tornam mais abstratas e fazem mais trabalho pesado, um
engenheiro de dados tem a oportunidade de pensar e agir em um nível mais alto. O ciclo
de vida da engenharia de dados, apoiado por suas correntes subjacentes, é um modelo
mental extremamente útil para organizar o trabalho da engenharia de dados.
Geração
Machine Translated by Google
Armazenar
Ingestão
Transformação
Dados de veiculação
Vários temas também atravessam o ciclo de vida da engenharia de dados. Essas são as correntes
subjacentes do ciclo de vida da engenharia de dados. Em um nível alto, as subcorrentes são as
seguintes:
Segurança
Gestão de dados
DataOps
Arquitetura de dados
Orquestração
Engenharia de software
Um engenheiro de dados tem vários objetivos de alto nível em todo o ciclo de vida dos
dados: produzir ROI ideal e reduzir custos (financeiros e de oportunidade), reduzir riscos
(segurança, qualidade dos dados) e maximizar o valor e a utilidade dos dados.
Os próximos dois capítulos discutem como esses elementos afetam um bom projeto de arquitetura,
juntamente com a escolha das tecnologias certas. Se você se sentir confortável com esses dois
tópicos, sinta-se à vontade para pular para a Parte II, onde abordamos cada um dos estágios do
ciclo de vida da engenharia de dados.
Recursos adicionais
Gerenciando o ciclo de vida da engenharia de dados:
Subcorrentes:
Operações de dados:
Gestão de dados:
“Cinco passos para começar a coletar o valor de seus dados” Página da web Lean-Data
Orquestração:
1 Evren Eryurek et al., Data Governance: The Definitive Guide (Sebastopol, CA: O'Reilly,
2021), 1, https:// oreil.ly/ LFT4d.
3 Chris Williams et al., “Democratizing Data at Airbnb”, The Airbnb Tech Blog, 12 de maio de 2017, https:// oreil.ly/ dM332.
5 Tyler Akidau et al., “O Modelo de Fluxo de Dados: Uma Abordagem Prática para Equilibrar a Correção,
Latência e Custo em Processamento de Dados em Grande Escala, Ilimitado e Fora de Ordem”, Anais do VLDB Endowment
8 (2015): 1792–1803, https://oreil.ly/Z6XYy.
6 “O que é DataOps”, página de perguntas frequentes do DataKitchen, acessada em 5 de maio de 2022, https:// oreil.ly/ Ns06w.
Uma boa arquitetura de dados fornece recursos contínuos em todas as etapas do ciclo de
vida e subcorrente dos dados. Começaremos definindo a arquitetura de dados e, em
seguida, discutiremos os componentes e as considerações. Em seguida, abordaremos
padrões de lote específicos (data warehouses, data lakes), padrões de streaming e padrões
que unificam lote e streaming. Durante todo o processo, enfatizaremos o aproveitamento
dos recursos da nuvem para fornecer escalabilidade, disponibilidade e confiabilidade.
O que é arquitetura de dados? Quando você para para descompactá-lo, o assunto fica um
pouco obscuro; pesquisar arquitetura de dados gera muitas definições inconsistentes e
muitas vezes desatualizadas. É muito parecido com quando definimos engenharia de
dados no Capítulo 1 — não há consenso. Em um campo que está em constante mudança,
isso é de se esperar. Então, o que queremos dizer com arquitetura de dados para os
propósitos deste livro? Antes de definir o termo, é essencial entender o contexto em que ele
se situa. Vamos abordar brevemente a arquitetura corporativa, que enquadrará nossa
definição de arquitetura de dados.
O termo empresa recebe reações mistas. Isso traz à mente escritórios corporativos
estéreis, planejamento de comando e controle/cascata, culturas de negócios estagnadas
e frases de efeito vazias. Mesmo assim, podemos aprender algumas coisas aqui.
Definição do TOGAF
Definição do Gartner
Definição do EABOK
Nossa definição
Decisões flexíveis e reversíveis são essenciais por duas razões. Primeiro, o mundo
está em constante mudança e é impossível prever o futuro.
Decisões reversíveis permitem que você ajuste o curso à medida que o mundo muda
e você reúne novas informações. Em segundo lugar, há uma tendência natural à
ossificação empresarial à medida que as organizações crescem. À medida que as
organizações crescem, tornam-se cada vez mais avessas ao risco e complicadas.
Adotar uma cultura de decisões reversíveis ajuda a superar essa tendência, reduzindo
o risco associado a uma decisão.
Por outro lado, uma porta de mão dupla é uma decisão facilmente reversível: você
entra e prossegue se gostar do que vê na sala ou recua pela porta se não gostar. A
Amazon pode decidir exigir o uso do DynamoDB para um novo banco de dados de
microsserviços. Se essa política não funcionar, a Amazon tem a opção de revertê-la e
refatorar alguns serviços para usar outros bancos de dados. Como os riscos associados
a cada decisão reversível (porta de mão dupla) são baixos, as organizações podem
tomar mais decisões, iterando, melhorando e coletando dados rapidamente.
As soluções técnicas existem não por si mesmas, mas para apoiar os objetivos de
negócios.
Definição do TOGAF
Definição da DAMA
Nossa definição
Agora que temos uma definição funcional de arquitetura de dados, vamos abordar os
elementos de uma “boa” arquitetura de dados.
O que queremos dizer com “boa” arquitetura de dados? Parafraseando um velho clichê, você sabe
bem quando o vê. Uma boa arquitetura de dados atende aos requisitos de negócios com um
conjunto comum e amplamente reutilizável de blocos de construção, mantendo a flexibilidade e
fazendo as compensações apropriadas. A arquitetura ruim é autoritária e tenta enfiar um monte de
decisões de tamanho único em uma grande bola de lama.
A agilidade é a base para uma boa arquitetura de dados; reconhece que o mundo é fluido. Uma
boa arquitetura de dados é flexível e de fácil manutenção. Ele evolui em resposta a
mudanças dentro do negócio e novas tecnologias e práticas que podem liberar ainda mais valor no
futuro.
As empresas e seus casos de uso de dados estão sempre evoluindo. O mundo é dinâmico e o
ritmo das mudanças no espaço de dados está se acelerando. A arquitetura de dados do ano
passado que lhe serviu bem pode não ser suficiente para hoje, muito menos para o próximo ano.
As correntes ocultas do ciclo de vida da engenharia de dados formam a base de uma boa
arquitetura de dados para empresas em qualquer estágio de maturidade de dados. Novamente,
essas subcorrentes são segurança, gerenciamento de dados, DataOps, arquitetura de dados,
orquestração e engenharia de software.
Uma boa arquitetura de dados é uma coisa viva que respira. Nunca está terminado. De fato, de
acordo com nossa definição, mudança e evolução são centrais para o significado e propósito da
arquitetura de dados. Vejamos agora os princípios de uma boa arquitetura de dados.
Excelência operacional
Segurança
Confiabilidade
Eficiência de desempenho
Otimização de custos
Sustentabilidade
Cinco princípios do Google Cloud para arquitetura nativa da nuvem são como segue:
Aconselhamos que você estude cuidadosamente ambas as estruturas, identifique ideias valiosas e
determine pontos de desacordo. Gostaríamos de expandir ou elaborar esses pilares com estes princípios
da arquitetura de engenharia de dados:
2. Planeje o fracasso.
4. Arquitetura é liderança.
8. Priorize a segurança.
9. Abrace FinOps.
Componentes comuns podem ser qualquer coisa que tenha ampla aplicabilidade dentro de uma
organização. Os componentes comuns incluem armazenamento de objetos, sistemas de controle de
versão, observabilidade, sistemas de monitoramento e orquestração e mecanismos de processamento.
Componentes comuns devem ser acessíveis a todos com um caso de uso apropriado, e as equipes
são incentivadas a confiar em componentes comuns já em uso, em vez de reinventar a roda. Os
componentes comuns devem oferecer suporte a permissões e segurança robustas para permitir o
compartilhamento de ativos entre as equipes, evitando o acesso não autorizado.
As plataformas em nuvem são o local ideal para adotar componentes comuns. Por exemplo, a
Escolher componentes comuns é um ato de equilíbrio. Por um lado, você precisa se concentrar
nas necessidades em todo o ciclo de vida e nas equipes de engenharia de dados, utilizar
componentes comuns que serão úteis para projetos individuais e, simultaneamente, facilitar a
interoperação e a colaboração. Por outro lado, os arquitetos devem evitar decisões que prejudiquem
a produtividade dos engenheiros que trabalham em problemas específicos de domínio, forçando-os
a soluções tecnológicas de tamanho único. O Capítulo 4 fornece detalhes adicionais.
Machine Translated by Google
—Werner Vogels
O hardware moderno é altamente robusto e durável. Mesmo assim, qualquer componente de hardware
falhará, com tempo suficiente. Para construir sistemas de dados altamente robustos, você deve
considerar falhas em seus projetos. Aqui estão alguns termos-chave para avaliar cenários de falha;
Disponibilidade
Estado.
Confiabilidade
A probabilidade do sistema de atender a padrões definidos na execução de sua função pretendida durante
um intervalo especificado.
O tempo máximo aceitável para uma interrupção de serviço ou sistema. O objetivo de tempo de
sistema de relatórios internos. Uma interrupção do site de apenas cinco minutos pode
O estado aceitável após a recuperação. Em sistemas de dados, os dados geralmente são perdidos
durante uma interrupção. Nessa configuração, o objetivo do ponto de recuperação (RPO) refere-se
Alguns sistemas escaláveis também podem ser dimensionados para zero: eles desligam
completamente quando não estão em uso. Depois que o trabalho de treinamento de modelo grande
for concluído, podemos excluir o cluster. Muitos sistemas sem servidor (por exemplo, funções sem
servidor e processamento analítico online sem servidor, ou OLAP, bancos de dados) podem ser
dimensionados automaticamente para zero.
delegar a maior parte do trabalho individual dos colaboradores a outros. Fortes habilidades de
liderança combinadas com alta competência técnica são raras e extremamente valiosas.
Os melhores arquitetos de dados levam essa dualidade a sério.
Observe que a liderança não implica uma abordagem de comando e controle para a
tecnologia. Não era incomum no passado os arquitetos escolherem uma tecnologia
proprietária de banco de dados e forçar cada equipe a armazenar seus dados lá. Opomo-
nos a esta abordagem porque pode prejudicar significativamente os atuais projetos de dados.
Os ambientes de nuvem permitem que os arquitetos equilibrem escolhas de componentes
comuns com flexibilidade que permite inovação nos projetos.
manter o estado existente; em vez disso, eles constantemente projetam coisas novas e
empolgantes em resposta às mudanças nos negócios e na tecnologia. De acordo com o
EABOK, o trabalho de um arquiteto é desenvolver um conhecimento profundo da arquitetura
de linha de base (estado atual), desenvolver uma arquitetura de destino e mapear um
plano de sequenciamento para determinar as prioridades e a ordem das mudanças na
arquitetura.
Acrescentamos que a arquitetura moderna não deve ser de comando e controle ou cascata,
mas colaborativa e ágil. O arquiteto de dados mantém uma arquitetura de destino e planos de
sequenciamento que mudam com o tempo. A arquitetura alvo torna-se um alvo móvel,
ajustado em resposta às mudanças de negócios e tecnologia interna e mundial. O plano de
sequenciamento determina prioridades imediatas para entrega.
Em 2002, Bezos escreveu um e-mail para os funcionários da Amazon que ficou conhecido como
3 the Bezos API Mandate:
1. Todas as equipes, a partir de agora, exporão seus dados e funcionalidades por meio de
interfaces de serviço.
3. Não será permitida nenhuma outra forma de comunicação entre processos: nenhuma
ligação direta, nenhuma leitura direta do armazenamento de dados de outra equipe,
nenhum modelo de memória compartilhada, nenhum backdoor. A única comunicação
permitida é por meio de chamadas de interface de serviço pela rede.
5. Todas as interfaces de serviço, sem exceção, devem ser projetadas desde o início para
serem externalizáveis. Ou seja, a equipe deve planejar e projetar para poder expor a
interface aos desenvolvedores do mundo exterior. Sem exceções.
O advento do Mandato API de Bezos é amplamente visto como um divisor de águas para
a Amazon. Colocar dados e serviços atrás de APIs permitiu o baixo acoplamento e acabou
resultando na AWS como a conhecemos agora.
A busca do Google por baixo acoplamento permitiu que ele aumentasse seus sistemas em
uma escala extraordinária.
2. Esses sistemas fazem interface com outros serviços por meio de camadas de abstração,
como um barramento de mensagens ou uma API. Essas camadas de abstração ocultam e
protegem detalhes internos do serviço, como um back-end de banco de dados ou classes
internas e chamadas de método.
2. Essas equipes publicam os detalhes abstratos de seus componentes para outras equipes
por meio de definições de API, esquemas de mensagens etc. As equipes não precisam
se preocupar com os componentes de outras equipes; eles simplesmente usam a API
publicada ou as especificações de mensagem para chamar esses componentes.
Eles iteram sua parte para melhorar seu desempenho e recursos ao longo do tempo.
Eles também podem publicar novos recursos à medida que são adicionados ou solicitar
novos itens de outras equipes. Novamente, o último acontece sem que as equipes
precisem se preocupar com os detalhes técnicos internos dos recursos solicitados. As
equipes trabalham juntas por meio de comunicação fracamente acoplada.
O baixo acoplamento entre tecnologia e sistemas humanos permitirá que suas equipes de
engenharia de dados colaborem com mais eficiência entre si e com outras partes da empresa.
Este princípio também facilita diretamente o princípio 7.
Como Fowler escreveu: “Uma das tarefas mais importantes de um arquiteto é remover a
arquitetura encontrando maneiras de eliminar a irreversibilidade nos projetos de software”. O
4
que era verdade quando Fowler escreveu isso em 2003 é tão preciso hoje.
Como dissemos anteriormente, Bezos se refere a decisões reversíveis como “portas de mão
dupla”. Como ele diz: “Se você anda e não gosta do que vê no
Machine Translated by Google
outro lado, você não pode voltar para antes. Podemos chamar essas decisões de Tipo 1.
Mas a maioria das decisões não é assim – elas são mutáveis, reversíveis – são portas de
mão dupla.” Aponte para portas de duas vias sempre que possível.
Por pelo menos uma década, reportagens alarmantes da mídia nos alertaram sobre a
crescente ameaça de violações de segurança que exploram alvos humanos dentro de
perímetros de segurança organizacional reforçados. Mesmo que os funcionários trabalhem
Machine Translated by Google
redes corporativas altamente seguras, eles permanecem conectados ao mundo exterior por
meio de e-mail e dispositivos móveis. As ameaças externas tornam-se efetivamente ameaças
internas.
Sua responsabilidade é determinada pelo serviço da AWS que você usa. Você também
é responsável por outros fatores, incluindo a confidencialidade de seus dados, os
requisitos de sua organização e as leis e regulamentos aplicáveis.
No mundo corporativo de hoje, uma abordagem de comando e controle para a segurança é bastante
comum, na qual as equipes de segurança e rede gerenciam perímetros e práticas gerais de
segurança. A nuvem transfere essa responsabilidade para engenheiros que não estão explicitamente
em funções de segurança.
Devido a esta responsabilidade, em conjunto com a erosão mais geral da
Machine Translated by Google
Além disso, JR Sorment e Mike Fuller fornecem a seguinte definição no Cloud FinOps
(O'Reilly):
Na era da nuvem, a maioria dos sistemas de dados é paga conforme o uso e prontamente escalável.
Os sistemas podem ser executados em um modelo de custo por consulta, modelo de custo por
capacidade de processamento ou outra variante de um modelo de pagamento conforme o uso.
Essa abordagem pode ser muito mais eficiente do que a abordagem de despesas de capital. Agora
é possível expandir para alto desempenho e, em seguida, reduzir para economizar dinheiro.
No entanto, a abordagem de pagamento conforme o uso torna os gastos muito mais dinâmicos.
O novo desafio para os líderes de dados é gerenciar orçamentos, prioridades e eficiência.
FinOps evolui o modelo de monitoramento operacional para monitorar os gastos de forma contínua.
Em vez de simplesmente monitorar as solicitações e a utilização da CPU para um servidor web, o
FinOps pode monitorar o custo contínuo das funções sem servidor que lidam com o tráfego, bem
como os picos nos alertas de gatilho de gastos. Assim como os sistemas são projetados para falhar
graciosamente em tráfego excessivo, as empresas podem considerar a adoção de limites rígidos
para gastos, com modos de falha graciosos em resposta a picos de gastos.
As equipes de operações também devem pensar em termos de ataques de custo. Assim como
um ataque distribuído de negação de serviço (DDoS) pode bloquear o acesso a um servidor web,
muitas empresas descobriram, para seu desgosto, que downloads excessivos de buckets do S3
podem aumentar os gastos e ameaçar uma pequena startup com falência. Ao compartilhar dados
publicamente, as equipes de dados podem resolver esses problemas definindo políticas de pagamento
do solicitante ou simplesmente monitorando gastos excessivos com acesso a dados e removendo
rapidamente o acesso se os gastos começarem a atingir níveis inaceitáveis.
Machine Translated by Google
Agora que você tem uma compreensão de alto nível dos bons princípios de arquitetura de
dados, vamos nos aprofundar um pouco mais nos principais conceitos necessários para
projetar e construir uma boa arquitetura de dados.
Domínios e Serviços
Um domínio pode conter vários serviços. Por exemplo, você pode ter um domínio
de vendas com três serviços: pedidos, faturamento e produtos. Cada serviço
possui tarefas específicas que suportam o domínio de vendas. Outros domínios
também podem compartilhar serviços (Figura 3-3). Nesse caso, o domínio contábil é
responsável pelas funções contábeis básicas: faturamento, folha de pagamento e
contas a receber (AR). Observe que o domínio de contabilidade compartilha o serviço
de fatura com o domínio de vendas, pois uma venda gera uma fatura e a contabilidade
deve acompanhar as faturas para garantir que o pagamento seja recebido. Vendas e
contabilidade possuem seus respectivos domínios.
Figura 3-3. Dois domínios (vendas e contabilidade) compartilham um serviço comum (faturas), e vendas
e contabilidade possuem seus respectivos domínios
A discussão nesta seção está relacionada ao nosso segundo e terceiro princípios de arquitetura de engenharia
de dados discutidos anteriormente: planejar para falhas e arquiteto para escalabilidade. Como engenheiros de
(disponibilidade e confiabilidade foram mencionadas anteriormente, mas as reiteramos aqui para completar):
Escalabilidade
e atender a demanda. Por exemplo, podemos querer dimensionar um sistema para lidar com uma alta
Elasticidade
pode aumentar e diminuir automaticamente com base na carga de trabalho atual. A ampliação é
escala para zero, o que significa que eles podem desligar automaticamente quando ociosos.
Disponibilidade
Estado.
Confiabilidade
GORJETA
Como essas características estão relacionadas? Se um sistema não atender aos requisitos
de desempenho durante um intervalo especificado, ele poderá parar de responder. Assim,
a baixa confiabilidade pode levar à baixa disponibilidade. Por outro lado, o dimensionamento
dinâmico ajuda a garantir o desempenho adequado sem intervenção manual dos
engenheiros — a elasticidade melhora a confiabilidade.
Figura 3-4. Um sistema distribuído horizontal simples utilizando uma arquitetura líder-
seguidor, com um nó líder e três nós de trabalho
Machine Translated by Google
Os sistemas distribuídos são difundidos nas várias tecnologias de dados que você usará em
sua arquitetura. Quase todo sistema de armazenamento de objetos de data warehouse em
nuvem que você usa tem alguma noção de distribuição sob o capô.
Os detalhes de gerenciamento do sistema distribuído normalmente são abstraídos, permitindo
que você se concentre na arquitetura de alto nível em vez de no encanamento de baixo nível.
No entanto, é altamente recomendável que você aprenda mais sobre sistemas distribuídos,
pois esses detalhes podem ser extremamente úteis para entender e melhorar o desempenho
de seus pipelines; Projeto de aplicativos de dados intensivos de Martin Kleppmann (O'Reilly)
é um excelente recurso.
Ao projetar uma arquitetura de dados, você escolhe quanta interdependência deseja incluir em
seus vários domínios, serviços e recursos.
Em uma extremidade do espectro, você pode optar por ter dependências e fluxos de trabalho
extremamente centralizados. Cada parte de um domínio e serviço é vitalmente dependente
de todos os outros domínios e serviços. Esse padrão é conhecido como fortemente acoplado.
Na outra ponta do espectro, você tem domínios e serviços descentralizados que não
têm dependência estrita uns dos outros, em um padrão conhecido como acoplamento
fraco. Em um cenário fracamente acoplado, é fácil para equipes descentralizadas
criarem sistemas cujos dados podem não ser utilizáveis por seus pares. Certifique-se de
atribuir padrões comuns, propriedade, responsabilidade e prestação de contas às equipes que
possuem seus respectivos domínios e serviços.
Projetar uma arquitetura de dados “boa” depende de compensações entre o acoplamento
forte e fraco de domínios e serviços.
Vale a pena notar que muitas das ideias nesta seção se originam no desenvolvimento de
software. Tentaremos manter o contexto da intenção e do espírito originais dessas grandes
ideias – mantendo-as agnósticas em relação aos dados – enquanto explicamos posteriormente
algumas diferenças das quais você deve estar ciente ao aplicar esses conceitos aos dados
especificamente.
Machine Translated by Google
Camadas de arquitetura
À medida que você desenvolve sua arquitetura, é útil estar ciente das camadas da arquitetura.
Sua arquitetura tem camadas – dados, aplicativos, lógica de negócios, apresentação e assim por
diante – e você precisa saber como desacoplar essas camadas. Como o acoplamento rígido de
modalidades apresenta vulnerabilidades óbvias, lembre-se de como você estrutura as camadas
de sua arquitetura para obter o máximo de confiabilidade e flexibilidade. Vejamos a arquitetura de
camada única e multicamada.
Camada única
Em uma arquitetura de camada única, seu banco de dados e aplicativo são fortemente
acoplados, residindo em um único servidor (Figura 3-5). Esse servidor pode ser seu laptop ou
uma única máquina virtual (VM) na nuvem. A natureza fortemente acoplada significa que se o
servidor, o banco de dados ou o aplicativo falhar, toda a arquitetura falhará. Embora as
arquiteturas de camada única sejam boas para prototipagem e desenvolvimento, elas não são
recomendadas para ambientes de produção devido aos riscos óbvios de falha.
Mesmo quando arquiteturas de camada única são construídas em redundância (por exemplo,
uma réplica de failover), elas apresentam limitações significativas de outras maneiras. Por
exemplo, muitas vezes é impraticável (e não aconselhável) executar consultas analíticas em
bancos de dados de aplicativos de produção. Fazer isso corre o risco de sobrecarregar o banco
de dados e fazer com que o aplicativo fique indisponível. Uma arquitetura de camada única é
adequada para testar sistemas em uma máquina local, mas não é recomendada para usos de
produção.
Machine Translated by Google
Multicamada
Os desafios de uma arquitetura de camada única fortemente acoplada são resolvidos com a
dissociação dos dados e do aplicativo. Uma arquitetura multicamadas (também conhecida como n
camadas) é composta de camadas separadas: dados, aplicativo, lógica de negócios, apresentação
etc. Essas camadas são ascendentes e hierárquicas, o que significa que a camada inferior não
depende necessariamente das camadas superiores ; as camadas superiores dependem das camadas
inferiores. A noção é separar os dados do aplicativo e o aplicativo da apresentação.
Uma arquitetura multicamada comum é uma arquitetura de três camadas, um design cliente-servidor
amplamente utilizado. Uma arquitetura de três camadas consiste em dados, lógica de aplicativo e
camadas de apresentação (Figura 3-6). Cada camada é isolada da outra, permitindo a separação de
interesses. Com uma arquitetura de três camadas, você pode usar as tecnologias que preferir em cada
camada sem a necessidade de se concentrar monoliticamente.
Machine Translated by Google
Monólitos
A noção geral de um monólito inclui tanto quanto possível sob o mesmo teto; em sua
versão mais extrema, um monólito consiste em uma única base de código executada em
uma única máquina que fornece a lógica do aplicativo e a interface do usuário.
Microsserviços
Uma pergunta que surge com frequência é como converter seu monólito em muitos
microsserviços (Figura 3-7). Isso depende completamente de quão complexo é o seu
monólito e de quanto esforço será para começar a extrair serviços dele. É perfeitamente
possível que seu monólito não possa ser desmembrado; nesse caso, você desejará
começar a criar uma nova arquitetura paralela que tenha os serviços desacoplados de
maneira amigável aos microsserviços. Não sugerimos uma refatoração inteira, mas, em
vez disso, separamos os serviços. O monólito não chegou da noite para o dia e é uma
questão de tecnologia como organizacional. Certifique-se de obter a adesão das partes
interessadas do monólito se você planeja separá-lo.
Se você quiser saber mais sobre como quebrar um monólito, sugerimos a leitura do
guia fantástico e pragmático Software Architecture: The Hard Parts , de Neal Ford
et al. (O'Reilly).
Figura 3-7. Uma arquitetura extremamente monolítica executa todas as funcionalidades dentro de uma única base
de código, potencialmente colocando um banco de dados no mesmo servidor host
Como você pode ver na Figura 3-7, você separa os componentes de sua
arquitetura em diferentes camadas de interesse de forma vertical. Embora uma
arquitetura multicamada resolva os desafios técnicos de desacoplar recursos
compartilhados, ela não aborda a complexidade de compartilhar domínios. Ao longo das
linhas de arquitetura única versus multicamada, você também deve considerar como
separa os domínios de sua arquitetura de dados. Por exemplo, sua equipe de analistas
pode contar com dados de vendas e estoque. Os domínios de vendas e inventário são
diferentes e devem ser vistos separadamente.
Machine Translated by Google
Uma abordagem para esse problema é a centralização: uma única equipe é responsável por
coletar dados de todos os domínios e reconciliá-los para consumo em toda a organização.
(Esta é uma abordagem comum no armazenamento de dados tradicional.) Outra abordagem
é a malha de dados. Com a malha de dados, cada equipe de software é responsável por
preparar seus dados para consumo em toda a organização. Falaremos mais sobre a malha
de dados mais adiante neste capítulo.
Nosso conselho: monólitos não são necessariamente ruins, e pode fazer sentido começar
com um sob certas condições. Às vezes você precisa se mover rápido, e é muito mais
simples começar com um monólito. Apenas esteja preparado para quebrá-lo em pedaços
menores eventualmente; não fique muito confortável.
Por exemplo, geralmente é perfeitamente aceitável usar tabelas multilocatário e isolar dados
por meio de exibições. No entanto, você deve certificar-se de que essas exibições não
podem vazar dados. Leia a documentação do fornecedor ou do projeto para entender as
estratégias e riscos apropriados.
Seu negócio raramente é estático. Muitas vezes acontecem coisas em sua empresa, como
obter um novo cliente, um novo pedido de um cliente ou um pedido de um produto ou
serviço. Todos esses são exemplos de eventos amplamente definidos como algo que
aconteceu, normalmente uma mudança no estado de algo.
Por exemplo, um novo pedido pode ser criado por um cliente ou um cliente pode
posteriormente fazer uma atualização nesse pedido.
Figura 3-8. Em um fluxo de trabalho orientado a eventos, um evento é produzido, roteado e então consumido
Figura 3-9. Em uma arquitetura orientada a eventos, os eventos são passados entre serviços fracamente acoplados
Projetos brownfield
Uma alternativa popular para uma reescrita direta é o padrão estrangulador: novos
sistemas substituem lenta e incrementalmente os componentes de uma arquitetura
7
legada. Eventualmente, a arquitetura legada é completamente substituída.
A atração para o padrão estrangulador é sua abordagem direcionada e cirúrgica de depreciar
uma peça de um sistema de cada vez. Isso permite decisões flexíveis e reversíveis ao avaliar o
impacto da descontinuação em sistemas dependentes.
Se você puder descontinuar, entenda que existem várias maneiras de descontinuar sua
arquitetura antiga. É fundamental demonstrar valor na nova plataforma aumentando gradualmente
sua maturidade para mostrar evidências de sucesso e seguir um plano de saída para encerrar
sistemas antigos.
Projetos greenfield
No extremo oposto do espectro, um projeto greenfield permite que você seja pioneiro
em um novo começo, sem restrições pela história ou legado de uma arquitetura anterior.
Projetos greenfield tendem a ser mais fáceis do que projetos brownfield, e muitos arquitetos e
engenheiros de dados os consideram mais divertidos! Você tem a oportunidade de experimentar
as ferramentas e padrões arquitetônicos mais novos e interessantes.
O que poderia ser mais emocionante?
Machine Translated by Google
Você deve tomar cuidado com algumas coisas antes de se empolgar demais. Vemos
as equipes ficarem excessivamente exuberantes com a síndrome do objeto brilhante.
Eles se sentem compelidos a buscar a maior e mais recente moda tecnológica sem
entender como isso afetará o valor do projeto. Há também a tentação de fazer
desenvolvimento orientado por currículo, empilhando novas tecnologias
8
impressionantes sem priorizar os objetivos finais do projeto. Sempre priorize os
requisitos sobre a construção de algo legal.
Armazém de dados
Um data warehouse é um hub de dados central usado para relatórios e análises. Os
dados em um data warehouse geralmente são altamente formatados e estruturados para
casos de uso de análise. Está entre as arquiteturas de dados mais antigas e bem
estabelecidas.
Em 1990, Bill Inmon originou a noção de data warehouse, que ele descreveu como “um
sistema orientado a assunto, integrado, não volátil e variante no tempo”.
Machine Translated by Google
9 aspectos
coleta de dados para apoiar as decisões da administração”. Embora os
técnicos do data warehouse tenham evoluído significativamente, sentimos que essa
definição original ainda mantém seu peso hoje.
Vale a pena notar dois tipos de arquitetura de data warehouse: organizacional e técnica.
A arquitetura de data warehouse organizacional organiza os dados associados a
determinadas estruturas e processos da equipe de negócios. A arquitetura do data
warehouse técnico reflete a natureza técnica do data warehouse, como MPP. Uma
empresa pode ter um data warehouse sem um sistema MPP ou executar um sistema
MPP que não esteja organizado como um data warehouse. No entanto, as arquiteturas
técnica e organizacional têm existido em um ciclo virtuoso e são frequentemente
identificadas entre si.
Uma variação do ETL é o ELT. Com a arquitetura de data warehouse ELT, os dados são
movidos mais ou menos diretamente dos sistemas de produção para um
Machine Translated by Google
área de preparação no data warehouse. A preparação nessa configuração indica que os dados
estão em um formato bruto. Em vez de usar um sistema externo, as transformações são
tratadas diretamente no data warehouse. A intenção é aproveitar o enorme poder computacional
dos data warehouses na nuvem e das ferramentas de processamento de dados. Os dados são
processados em lotes e a saída transformada é gravada em tabelas e visualizações para
análise. A Figura 3-11 mostra o processo geral. O ELT também é popular em um arranjo de
streaming, pois os eventos são transmitidos de um processo CDC, armazenados em uma área
de teste e, posteriormente, transformados no data warehouse.
Uma segunda versão do ELT foi popularizada durante o crescimento de big data no
ecossistema Hadoop. Este é o ELT de transformação na leitura, que discutimos em “Data
Lake”.
Os data warehouses em nuvem expandem os recursos dos sistemas MPP para cobrir
muitos casos de uso de big data que exigiam um cluster Hadoop em um passado muito
recente. Eles podem processar prontamente petabytes de dados em uma única consulta.
Eles normalmente suportam estruturas de dados que permitem o armazenamento de dezenas
de megabytes de dados de texto bruto por linha ou documentos JSON extremamente ricos e complexos.
À medida que os data warehouses na nuvem (e data lakes) amadurecem, a linha entre o data
warehouse e o data lake continuará a se confundir.
O impacto dos novos recursos oferecidos pelos data warehouses em nuvem é tão
significativo que podemos considerar descartar completamente o termo data warehouse .
Em vez disso, esses serviços estão evoluindo para uma nova plataforma de dados com
recursos muito mais amplos do que os oferecidos por um sistema MPP tradicional.
Data marts
Os data marts existem por dois motivos. Primeiro, um data mart torna os dados mais facilmente
acessíveis a analistas e desenvolvedores de relatórios. Em segundo lugar, os data marts
fornecem um estágio adicional de transformação além do fornecido pelos pipelines ETL ou ELT
iniciais. Isso pode melhorar significativamente o desempenho se relatórios ou consultas
analíticas exigirem junções e agregações complexas de dados, especialmente quando os dados
brutos forem grandes. Os processos de transformação podem preencher o data mart com
dados combinados e agregados para melhorar o desempenho das consultas ao vivo.
A Figura 3-12 mostra o fluxo de trabalho geral. Discutimos data marts e modelagem de
dados para data marts no Capítulo 8.
Machine Translated by Google
Data Lake
Entre as arquiteturas mais populares que surgiram durante a era do big data está o data lake.
Em vez de impor limitações estruturais rígidas aos dados, por que não simplesmente despejar
todos os seus dados – estruturados e não estruturados – em um local central? O data lake
prometia ser uma força democratizadora, liberando os negócios para beber de uma fonte de
dados ilimitados. O data lake de primeira geração, “data lake 1.0”, fez contribuições sólidas, mas
geralmente não cumpriu sua promessa.
O Data Lake 1.0 começou com HDFS. À medida que a nuvem cresceu em popularidade,
esses data lakes mudaram para armazenamento de objetos baseado em nuvem, com
custos de armazenamento extremamente baratos e capacidade de armazenamento praticamente
ilimitada. Em vez de depender de um data warehouse monolítico onde armazenamento e
computação estão fortemente acoplados, o data lake permite que uma imensa quantidade de
dados de qualquer tamanho e tipo seja armazenada. Quando esses dados precisam ser
consultados ou transformados, você tem acesso a um poder de computação quase ilimitado ao
criar um cluster sob demanda e pode escolher sua tecnologia de processamento de dados
favorita para a tarefa em mãos — MapReduce, Spark, Ray, Presto, Colmeia, etc
Apesar da promessa e do hype, o data lake 1.0 tinha sérias deficiências. O data lake tornou-se
um depósito de lixo; termos como data swamp, dark data e WORN foram cunhados quando
projetos de dados outrora promissores falharam. Os dados cresceram para tamanhos não
gerenciáveis, com pouco em termos de gerenciamento de esquema, catalogação de dados e
ferramentas de descoberta. Além disso, o conceito original de data lake era essencialmente
somente gravação, criando enormes dores de cabeça com a chegada de regulamentações
como o GDPR, que exigia a exclusão direcionada de registros de usuários.
Machine Translated by Google
O Data Lake 1.0 também não cumpriu outra promessa central do movimento de big data. O software
de código aberto no ecossistema Apache foi apresentado como um meio de evitar contratos
multimilionários para sistemas MPP proprietários.
Hardware barato e pronto para uso substituiria as soluções personalizadas de fornecedores. Na
realidade, os custos de big data aumentaram à medida que as complexidades do gerenciamento de
clusters Hadoop forçavam as empresas a contratar grandes equipes de engenheiros com altos salários.
As empresas geralmente optam por comprar versões licenciadas e personalizadas do Hadoop
de fornecedores para evitar os fios expostos e as bordas afiadas da base de código Apache bruta
e adquirir um conjunto de ferramentas de andaimes para tornar o Hadoop mais fácil de usar. Mesmo as
empresas que evitaram o gerenciamento de clusters do Hadoop usando armazenamento em nuvem
tiveram que gastar muito com talentos para escrever trabalhos do MapReduce.
Devemos ter cuidado para não subestimar a utilidade e o poder dos data lakes de primeira
geração. Muitas organizações encontraram valor significativo em data lakes – especialmente
grandes empresas de tecnologia do Vale do Silício, fortemente focadas em dados, como Netflix e
Facebook. Essas empresas tinham os recursos para criar práticas de dados bem-sucedidas e criar
suas ferramentas e aprimoramentos personalizados baseados em Hadoop. Mas para muitas
organizações, os data lakes se transformaram em um superfundo interno de desperdício, decepção e
custos crescentes.
Em resposta às limitações dos data lakes de primeira geração, vários players procuraram
aprimorar o conceito para cumprir plenamente sua promessa. Por exemplo, o Databricks
introduziu a noção de data lakehouse. O lakehouse incorpora os controles, o gerenciamento
de dados e as estruturas de dados encontrados em um data warehouse, ao mesmo tempo
em que abriga dados no armazenamento de objetos e oferece suporte a uma variedade de
mecanismos de consulta e transformação. Em particular, o data lakehouse oferece suporte
a transações de atomicidade, consistência, isolamento e durabilidade (ACID), um grande
afastamento do data lake original, onde você simplesmente insere dados e nunca os atualiza
ou exclui. O termo data lakehouse sugere uma convergência entre data lakes e data
warehouses.
A arquitetura técnica de data warehouses em nuvem evoluiu para ser muito semelhante a
uma arquitetura de data lake. Os data warehouses na nuvem separam a computação do
armazenamento, oferecem suporte a consultas em escala de petabytes, armazenam texto
não estruturado e objetos semiestruturados e integram-se a tecnologias de processamento
avançadas, como Spark ou Beam.
Arquitetura lambda
Machine Translated by Google
Nos “velhos tempos” (início a meados da década de 2010), a popularidade de trabalhar com
dados de streaming explodiu com o surgimento do Kafka como uma fila de mensagens
altamente escalável e estruturas como Apache Storm e Samza para análise de streaming/em
tempo real. Essas tecnologias permitiram que as empresas realizassem novos tipos de análise
e modelagem em grandes quantidades de dados, agregação e classificação de usuários e
recomendações de produtos. Os engenheiros de dados precisavam descobrir como reconciliar
dados em lote e streaming em uma única arquitetura. A arquitetura Lambda foi uma das primeiras
respostas populares a esse problema.
A arquitetura lambda tem sua parcela de desafios e críticas. Gerenciar vários sistemas com
bases de código diferentes é tão difícil quanto parece, criando sistemas propensos a erros
com código e dados extremamente difíceis de conciliar.
Mencionamos a arquitetura Lambda porque ela ainda chama atenção e é popular nos
resultados de mecanismos de pesquisa para arquitetura de dados. Lambda não é o nosso primeiro
Machine Translated by Google
recomendação se você estiver tentando combinar dados de streaming e lote para análise.
A tecnologia e as práticas mudaram.
Arquitetura Kappa
Como resposta às deficiências da arquitetura Lambda, Jay Kreps propôs uma
10
alternativa chamada arquitetura Kappa (Figura 3-15). A tese central é esta: por que
não usar apenas uma plataforma de processamento de fluxo como a espinha dorsal para
todo o manuseio de dados – ingestão, armazenamento e serviço? Isso facilita uma
verdadeira arquitetura baseada em eventos. O processamento em tempo real e em lote
pode ser aplicado perfeitamente aos mesmos dados lendo o fluxo de eventos ao vivo
diretamente e reproduzindo grandes blocos de dados para processamento em lote.
Embora o artigo original da arquitetura Kappa tenha sido publicado em 2014, não o
vimos amplamente adotado. Pode haver algumas razões para isso.
Primeiro, o streaming em si ainda é um mistério para muitas empresas.
Em segundo lugar, a arquitetura Kappa acaba sendo complicada e cara na prática.
Embora alguns sistemas de streaming possam ser dimensionados para grandes volumes
de dados, eles são complexos e caros; o armazenamento e o processamento em lote
permanecem muito mais eficientes e econômicos para enormes conjuntos de dados históricos.
A ideia central do modelo Dataflow é visualizar todos os dados como eventos, pois a
agregação é realizada em vários tipos de janelas. Os fluxos de eventos em tempo real
contínuos são dados ilimitados. Os lotes de dados são simplesmente fluxos de eventos
limitados e os limites fornecem uma janela natural. Os engenheiros podem escolher entre
várias janelas para agregação em tempo real, como deslizamento ou queda. O processamento
em tempo real e em lote ocorre no mesmo sistema usando código quase idêntico.
A filosofia de “lote como um caso especial de streaming” agora é mais difundida. Vários
frameworks, como Flink e Spark, adotaram uma abordagem semelhante.
Dispositivos
Dispositivos (também conhecidos como coisas) são o hardware físico conectado à Internet,
detectando o ambiente ao seu redor e coletando e transmitindo dados para um destino
downstream. Esses dispositivos podem ser usados em aplicativos de consumo, como uma
câmera de campainha, smartwatch ou termostato.
O dispositivo pode ser uma câmera com inteligência artificial que monitora uma linha de
montagem em busca de componentes defeituosos, um rastreador GPS para registrar a
localização de veículos ou um Raspberry Pi programado para baixar os tweets mais recentes e
preparar seu café. Qualquer dispositivo capaz de coletar dados de seu ambiente é um dispositivo
IoT.
Um dispositivo não é benéfico a menos que você possa obter seus dados. Esta seção abrange
alguns dos principais componentes necessários para fazer a interface com dispositivos IoT em estado
selvagem.
Gateway de IoT
Um gateway IoT é um hub para conectar dispositivos e rotear dispositivos com segurança
para os destinos apropriados na Internet. Embora você possa conectar um dispositivo
diretamente à Internet sem um gateway IoT, o gateway permite que os dispositivos se conectem
usando muito pouca energia. Ele atua como uma estação intermediária para retenção de dados e
gerencia uma conexão com a Internet até o destino final dos dados.
Novos padrões WiFi de baixo consumo são projetados para tornar os gateways IoT menos críticos
no futuro, mas eles estão sendo lançados agora. Normalmente, um enxame de dispositivos utilizará
muitos gateways IoT, um em cada local físico onde os dispositivos estão presentes (Figura 3-16).
Figura 3-16. Um enxame de dispositivos (círculos), gateways IoT e fila de mensagens com mensagens
(retângulos dentro da fila)
Ingestão
Machine Translated by Google
A ingestão começa com um gateway IoT, conforme discutido anteriormente. A partir daí, eventos
e medições podem fluir para uma arquitetura de ingestão de eventos.
Claro, outros padrões são possíveis. Por exemplo, o gateway pode acumular dados e
carregá-los em lotes para processamento analítico posterior. Em ambientes físicos remotos,
os gateways podem não ter conectividade com uma rede na maior parte do tempo. Eles
podem fazer o upload de todos os dados somente quando são trazidos ao alcance de uma
rede celular ou Wi-Fi. O ponto é que a diversidade de sistemas e ambientes de IoT apresenta
complicações – por exemplo, dados atrasados, estrutura de dados e disparidades de esquema,
corrupção de dados e interrupção de conexão – que os engenheiros devem considerar em
suas arquiteturas e análises downstream.
Armazenar
Servindo
Um padrão de serviço significativo para IoT parece ETL reverso (Figura 3-17 ), embora
tendamos a não usar esse termo no contexto de IoT. Pense neste cenário: dados de
sensores em dispositivos de fabricação são coletados e analisados. Os resultados dessas
medições são processados para buscar otimizações que permitirão que os equipamentos
operem com mais eficiência. Os dados são enviados de volta para reconfigurar os
dispositivos e otimizá-los.
Malha de dados
A Figura 3-18 mostra uma versão simplificada de uma arquitetura de malha de dados, com os três domínios
interoperando.
Machine Translated by Google
Figura 3-18. Exemplo simplificado de uma arquitetura de malha de dados. Fonte: From Data Mesh,
de Zhamak Dehghani. Direitos autorais © 2022 Zhamak Dehghani. Publicado por O'Reilly Media,
Inc. Usado com permissão.
Você pode aprender mais sobre malha de dados no livro Data Mesh de Dehghani
(O'Reilly).
padrões de arquitetura de dados mais críticos que estão extremamente bem estabelecidos,
evoluindo rapidamente, ou ambos.
Como engenheiro de dados, preste atenção em como as novas arquiteturas podem ajudar sua
organização. Fique a par dos novos desenvolvimentos cultivando uma conscientização de alto
nível sobre os desenvolvimentos do ecossistema de engenharia de dados. Tenha a mente aberta
e não se apegue emocionalmente a uma abordagem. Depois de identificar o valor potencial,
aprofunde seu aprendizado e tome decisões concretas. Quando feito corretamente, pequenos
ajustes – ou grandes revisões – em sua arquitetura de dados podem impactar positivamente os
negócios.
uma estrutura unificada de lote/streaming (Beam, Flink) pode ser uma escolha apropriada? Estudar
essas escolhas de forma abstrata irá prepará-lo para tomar decisões concretas e valiosas.
Machine Translated by Google
Conclusão
Você aprendeu como a arquitetura de dados se encaixa no ciclo de vida da engenharia de
dados e o que torna a arquitetura de dados “boa” e viu vários exemplos de arquiteturas de
dados. Como a arquitetura é uma base fundamental para o sucesso, incentivamos você a
investir tempo para estudá-la profundamente e entender as vantagens e desvantagens
inerentes a qualquer arquitetura. Você estará preparado para mapear a arquitetura que
corresponde aos requisitos exclusivos de sua organização.
Recursos adicionais
“Separando Utilidade de Valor Agregado” por Ross Petit
“Gerencie sua equipe de dados como uma equipe de produto” por Emilie Schario e
Taylor A. Murphy
“Dados como Produto versus Dados como Serviço” por Justin Gage
“EagerReadDerivação”
“AnemicDomainModel”
“DomainDrivenDesign”
“Fornecimento de eventos”
“BoundedContext”
“Foco em Eventos”
“Persistência Poliglota”
“UtilityVsStrategicDicotomia”
Aplicações de dados:
“O que é o ecossistema de dados abertos e por que veio para ficar” por
Casber Wang
Machine Translated by Google
Convenções de nomenclatura:
“O que é arquitetura de dados? Uma estrutura para gerenciar dados” por Thor
Olavsrud
Arquitetura de dados: uma cartilha para o cientista de dados por WH Inmon et al.
(Imprensa Acadêmica)
Site EABOK
“As 5 principais tendências de dados para os CDOs a serem observados em 2021” por
Prukalpa
“Testar a qualidade dos dados em escala com o Deequ” por Dustin Lange et al.
Machine Translated by Google
“Análise unificada: onde o lote e o streaming se unem; SQL e além” Roteiro Apache
Flink
1 Jeff Haden, “Fundador da Amazon Jeff Bezos: é assim que pessoas bem-sucedidas tomam decisões
inteligentes”, Inc., 3 de dezembro de 2018, https:// oreil.ly/ QwIm0.
3 “The Bezos API Mandate: Amazon’s Manifesto for Externalization,” Nordic APIs, janeiro
19, 2021, https:// oreil.ly/ vIs8m.
6 “FinOps Foundation sobe para 300 membros e apresenta novos níveis de parceiros para provedores e
fornecedores de serviços em nuvem”, Business Wire, 17 de junho de 2019, https:// oreil.ly/ XcwYO.
10 Jay Kreps, “Questioning the Lambda Architecture,” O'Reilly, 2 de julho de 2014, https://
oreil.ly/ wWR3n.
12 Zhamak Dehghani, “How to Move Beyond a Monolithic Data Lake to a Distributed Data
Mesh”, MartinFowler.com, 20 de maio de 2019, https:// oreil.ly/ SqMe8.
Capítulo 4. Escolhendo
tecnologias em todo o ciclo de
vida da engenharia de dados
A engenharia de dados hoje sofre de um embaraço de riquezas. Não temos escassez de tecnologias
para resolver vários tipos de problemas de dados.
As tecnologias de dados estão disponíveis como ofertas prontas e consumíveis em quase todas as
formas: código aberto, código aberto gerenciado, software proprietário, serviço proprietário e muito
mais. No entanto, é fácil ficar preso na busca por tecnologia de ponta e perder de vista o objetivo
central da engenharia de dados: projetar sistemas robustos e confiáveis para transportar dados
durante todo o ciclo de vida e atendê-los de acordo com as necessidades dos usuários finais.
O Capítulo 3 discutiu a “boa” arquitetura de dados e por que ela é importante. Agora explicamos
como escolher as tecnologias certas para atender a essa arquitetura. Os engenheiros de dados devem
escolher boas tecnologias para criar o melhor produto de dados possível. Achamos que os critérios
para escolher uma boa tecnologia de dados são simples: ela agrega valor a um produto de dados e
aos negócios mais amplos?
Muitas vezes vemos equipes saindo dos trilhos e escolhendo tecnologias antes de mapear uma
arquitetura. As razões variam: síndrome do objeto brilhante,
Machine Translated by Google
Este capítulo discute nosso plano tático para fazer escolhas de tecnologia assim que tivermos um
plano de arquitetura estratégica. A seguir estão algumas considerações para escolher tecnologias de
dados em todo o ciclo de vida de engenharia de dados:
Interoperabilidade
nichos específicos? O tamanho da sua equipe influenciará os tipos de tecnologias que você
adotar.
mais do que algumas equipes de dados se dissolvem por se moverem muito devagar e por
não entregarem o valor que foram contratados para produzir.
Entregue valor cedo e com frequência. Como mencionamos, use o que funciona. Os membros de
sua equipe provavelmente obterão uma melhor alavancagem com ferramentas que já conhecem.
Evite o trabalho pesado indiferenciado que envolve sua equipe em trabalhos
desnecessariamente complexos que agregam pouco ou nenhum valor. Escolha ferramentas que
o ajudem a se mover de forma rápida, confiável, segura e protegida.
Interoperabilidade
Raramente você usará apenas uma tecnologia ou sistema. Ao escolher uma tecnologia ou
sistema, você precisará garantir que ele interaja e opere com outras tecnologias. A
interoperabilidade descreve como várias tecnologias ou sistemas se conectam, trocam
informações e interagem.
Digamos que você esteja avaliando duas tecnologias, A e B. Com que facilidade a tecnologia
A se integra à tecnologia B quando se pensa em interoperabilidade? Isso geralmente é um
espectro de dificuldade, variando de contínuo a demorado. A integração perfeita já está
incorporada em cada produto, facilitando a configuração? Ou você precisa fazer muita configuração
manual para integrar essas tecnologias?
Muitas vezes, fornecedores e projetos de código aberto terão como alvo plataformas e sistemas
específicos para interoperar. A maioria das ferramentas de ingestão e visualização de dados
possui integrações integradas com data warehouses e data lakes populares.
Além disso, ferramentas populares de ingestão de dados se integrarão a APIs e serviços comuns,
como CRMs, software de contabilidade e muito mais.
Às vezes, existem padrões para interoperabilidade. Quase todos os bancos de dados permitem
conexões via Java Database Connectivity (JDBC) ou Open Database Connectivity (ODBC), o que
significa que você pode se conectar facilmente a um banco de dados usando esses padrões. Em
outros casos, a interoperabilidade ocorre na ausência de padrões. A transferência de estado
representacional (REST) não é realmente um padrão para APIs; cada API REST tem suas
peculiaridades. Nesses casos, cabe
Machine Translated by Google
para o fornecedor ou projeto de software de código aberto (OSS) para garantir uma
integração suave com outras tecnologias e sistemas.
Esteja sempre ciente de como será simples conectar suas várias tecnologias ao
longo do ciclo de vida da engenharia de dados. Conforme mencionado em outros capítulos,
sugerimos projetar para modularidade e dar a si mesmo a capacidade de trocar tecnologias
facilmente à medida que novas práticas e alternativas se tornam disponíveis.
Além dos custos diretos e indiretos, a forma como algo é comprado afeta a forma como os
custos são contabilizados. As despesas se dividem em dois grandes grupos: despesas de
capital e despesas operacionais.
As despesas operacionais, também conhecidas como opex, são o oposto do capex em alguns
aspectos. Opex é gradual e distribuído ao longo do tempo. Enquanto o capex é focado no longo
prazo, o opex é no curto prazo. Opex pode ser pago conforme o uso ou similar e permite muita
flexibilidade. Opex está mais próximo de um custo direto, facilitando a atribuição a um projeto de dados.
Até recentemente, opex não era uma opção para grandes projetos de dados. Os sistemas de dados
geralmente exigiam contratos multimilionários. Isso mudou com o advento da nuvem, pois os serviços
de plataforma de dados permitem que os engenheiros paguem em um modelo baseado em consumo.
Em geral, o opex permite uma capacidade muito maior para as equipes de engenharia escolherem
seu software e hardware. Os serviços baseados em nuvem permitem que os engenheiros de dados
interajam rapidamente com várias configurações de software e tecnologia, geralmente de forma
barata.
Se você escolher a pilha de dados A, você escolheu os benefícios da pilha de dados A em vez
de todas as outras opções, excluindo efetivamente as pilhas de dados B, C e D. Você está
comprometido com a pilha de dados A e tudo o que ela envolve — a equipe para dar suporte
isso, treinamento, configuração e manutenção. O que acontece se a pilha de dados A for uma
má escolha? O que acontece quando a pilha de dados A se torna obsoleta? Você ainda pode
mover para a pilha de dados B?
Quão rápido e barato você pode mudar para algo mais novo e melhor?
Esta é uma questão crítica no espaço de dados, onde novas tecnologias e produtos parecem
aparecer em um ritmo cada vez mais rápido. A experiência que você acumulou na pilha de
dados A se traduz na próxima onda? Ou você pode trocar os componentes da pilha de dados A
e ganhar algum tempo e opções?
O primeiro passo para minimizar o custo de oportunidade é avaliá-lo com os olhos bem abertos.
Vimos inúmeras equipes de dados ficarem presas a tecnologias que pareciam boas na época e
não são flexíveis para o crescimento futuro ou simplesmente obsoletas. Tecnologias de dados
inflexíveis são muito parecidas com armadilhas para ursos.
Eles são fáceis de entrar e extremamente dolorosos de escapar.
FinOps
Já abordamos o FinOps no “Princípio 9: Abrace o FinOps”. Conforme discutimos, os gastos
típicos em nuvem são inerentemente opex: as empresas pagam por serviços para executar
processos de dados críticos em vez de fazer compras antecipadas e recuperar o valor ao longo
do tempo. O objetivo do FinOps é operacionalizar totalmente a responsabilidade financeira e o
valor comercial, aplicando as práticas semelhantes ao DevOps de monitoramento e ajuste
dinâmico de sistemas.
Neste capítulo, queremos enfatizar uma coisa sobre FinOps que está bem incorporada nesta
citação:
Machine Translated by Google
Como muitos treinadores de vida lhe diriam, concentre-se no presente. Você deve
escolher a melhor tecnologia para o momento e o futuro próximo, mas de uma forma que
suporte as incógnitas futuras e a evolução. Pergunte a si mesmo: onde você está hoje e
quais são seus objetivos para o futuro? Suas respostas a essas perguntas devem informar
suas decisões sobre sua arquitetura e, portanto, as tecnologias usadas nessa arquitetura. Isso
é feito entendendo o que provavelmente mudará e o que tende a permanecer o mesmo.
Para linguagens, SQL e bash existem há muitas décadas, e não os vemos desaparecendo tão
cedo. As tecnologias imutáveis se beneficiam do efeito Lindy: quanto mais tempo uma tecnologia
for estabelecida, mais tempo ela será usada. Pense na rede elétrica, nos bancos de dados
relacionais, na linguagem de programação C ou na arquitetura do processador x86. Sugerimos
aplicar o efeito Lindy como um teste decisivo para determinar se uma tecnologia é potencialmente
imutável.
As tecnologias transitórias são aquelas que vêm e vão. A trajetória típica começa com muito
hype, seguido por um crescimento meteórico em popularidade, depois uma lenta descida à
obscuridade. O cenário de front-end JavaScript é um exemplo clássico. Quantas estruturas de
front-end JavaScript surgiram e desapareceram entre 2010 e 2020? Backbone.js, Ember.js e
Knockout eram populares no início dos anos 2010, AngularJS em meados dos anos 2010, e
React e Vue.js têm um enorme compartilhamento hoje. Qual é a estrutura de front-end popular
daqui a três anos? Quem sabe.
Novos participantes bem financiados e projetos de código aberto chegam à frente de dados
todos os dias. Todo fornecedor dirá que seu produto mudará a indústria e “tornará o mundo um
lugar melhor”. A maioria dessas empresas e projetos não consegue tração de longo prazo e
desaparece lentamente na obscuridade. Os principais VCs estão fazendo grandes apostas,
sabendo que a maioria de seus investimentos em ferramentas de dados falhará. Como você
pode saber em quais tecnologias investir para sua arquitetura de dados? É difícil. Basta
considerar o número de tecnologias nas representações (in)famosas de Matt Turck do cenário
de ML, IA e dados (MAD) que apresentamos no Capítulo 1 (Figura 4-1).
Machine Translated by Google
Nosso Conselho
Dado o ritmo acelerado das mudanças nas ferramentas e nas melhores práticas,
sugerimos avaliar as ferramentas a cada dois anos (Figura 4-2). Sempre que possível,
encontre as tecnologias imutáveis ao longo do ciclo de vida da engenharia de dados e
use-as como base. Construa ferramentas transitórias em torno dos imutáveis.
Machine Translated by Google
Figura 4-2. Use um horizonte de tempo de dois anos para reavaliar suas escolhas de tecnologia
Dada a probabilidade razoável de falha para muitas tecnologias de dados, você precisa
considerar como é fácil fazer a transição de uma tecnologia escolhida.
Quais são as barreiras para sair? Conforme mencionado anteriormente em nossa
discussão sobre custo de oportunidade, evite “armadilhas para ursos”. Entre em uma
nova tecnologia com os olhos bem abertos, sabendo que o projeto pode ser abandonado,
a empresa pode não ser viável ou a tecnologia simplesmente não é mais adequada.
Localização
As empresas agora têm várias opções ao decidir onde executar suas pilhas de
tecnologia. Uma lenta mudança em direção à nuvem culmina em uma verdadeira
debandada de empresas aumentando as cargas de trabalho na AWS, Azure e Google
Cloud Platform (GCP). Na última década, muitos CTOs passaram a ver suas decisões
sobre hospedagem de tecnologia como tendo significado existencial para suas
organizações. Se eles se movem muito devagar, correm o risco de serem deixados para
trás por sua concorrência mais ágil; por outro lado, uma migração para a nuvem mal
planejada pode levar a falhas tecnológicas e custos catastróficos.
Vejamos os principais locais para executar sua pilha de tecnologia: local, nuvem, nuvem
híbrida e multinuvem.
Machine Translated by Google
Nas instalações
Enquanto novas startups nascem cada vez mais na nuvem, os sistemas locais ainda são o
padrão para empresas estabelecidas. Essencialmente, essas empresas são proprietárias
de seu hardware, que pode residir em data centers próprios ou em espaço de colocation
alugado. Em ambos os casos, as empresas são operacionalmente responsáveis por seu
hardware e pelo software que é executado nele. Se o hardware falhar, eles precisam repará-
lo ou substituí-lo. Eles também precisam gerenciar os ciclos de atualização a cada poucos
anos à medida que o hardware novo e atualizado é lançado e o hardware mais antigo
envelhece e se torna menos confiável. Eles devem garantir que tenham hardware suficiente
para lidar com picos; para um varejista online, isso significa hospedar capacidade suficiente
para lidar com os picos de carga da Black Friday. Para engenheiros de dados encarregados
de sistemas locais, isso significa comprar sistemas grandes o suficiente para permitir um
bom desempenho para cargas de pico e grandes trabalhos sem compras e gastos excessivos.
Por outro lado, as empresas estabelecidas veem sua concorrência mais jovem e mais
ágil escalando rapidamente e aproveitando os serviços gerenciados em nuvem. Eles
também veem concorrentes estabelecidos fazendo incursões na nuvem, permitindo
que aumentem temporariamente o enorme poder de computação para trabalhos de
dados maciços ou o pico de compras da Black Friday.
funcionando no local. Pode envolver uma migração completa para a nuvem, conforme
discutido a seguir.
Nuvem
A nuvem inverte o modelo local. Em vez de comprar hardware, você simplesmente aluga
hardware e serviços gerenciados de um provedor de nuvem (como AWS, Azure ou
Google Cloud). Esses recursos muitas vezes podem ser reservados em prazos
extremamente curtos; As VMs são ativadas em menos de um minuto e o uso subsequente
é cobrado em incrementos por segundo.
Isso permite que os usuários da nuvem dimensionem dinamicamente recursos
que eram inconcebíveis com servidores locais.
A era inicial da nuvem foi dominada por ofertas de infraestrutura como serviço (IaaS)
– produtos como VMs e discos virtuais que são essencialmente fatias de hardware
alugadas. Lentamente, vimos uma mudança em direção à plataforma como serviço
(PaaS), enquanto os produtos SaaS continuam a crescer rapidamente.
PaaS inclui produtos IaaS, mas adiciona serviços gerenciados mais sofisticados para dar
suporte a aplicativos. Exemplos são bancos de dados gerenciados, como Amazon Relational
Database Service (RDS) e Google Cloud SQL, plataformas de streaming gerenciadas,
como Amazon Kinesis e Simple Queue Service (SQS), e Kubernetes gerenciados, como
Google Kubernetes Engine (GKE) e Azure Kubernetes Service (AKS). ). Os serviços de
PaaS permitem que os engenheiros ignorem os detalhes operacionais do gerenciamento de
máquinas individuais e da implantação de estruturas em sistemas distribuídos. Eles fornecem
acesso pronto para uso a sistemas complexos de escalonamento automático com sobrecarga
operacional mínima.
Google Workspace, Microsoft 365, Zoom e Fivetran. Tanto as principais nuvens públicas
quanto terceiros oferecem plataformas SaaS. O SaaS abrange todo um espectro de domínios
corporativos, incluindo videoconferência, gerenciamento de dados, tecnologia de anúncios,
aplicativos de escritório e sistemas de CRM.
Este capítulo também discute sem servidor, cada vez mais importante nas ofertas de PaaS
e SaaS. Os produtos sem servidor geralmente oferecem dimensionamento automatizado de
zero a taxas de uso extremamente altas. Eles são cobrados conforme o uso e permitem que os
engenheiros operem sem o conhecimento operacional dos servidores subjacentes. Muitas
pessoas discutem com o termo serverless; afinal, o código deve ser executado em algum
lugar. Na prática, serverless geralmente significa muitos
servidores.
Para entender como usar os serviços em nuvem com eficiência por meio da arquitetura
nativa da nuvem , você precisa saber como as nuvens geram dinheiro. Este é um conceito
extremamente complexo e no qual os provedores de nuvem oferecem pouca transparência.
Considere esta barra lateral um ponto de partida para sua pesquisa, descoberta e desenvolvimento
de processos.
Vamos tangenciar um pouco os swaps de crédito. Não se preocupe, isso vai fazer sentido daqui a
pouco. Lembre-se de que os swaps de inadimplência de crédito chegaram à infâmia após a crise
financeira global de 2007. Um credit default swap era um mecanismo para vender diferentes níveis
de risco atrelados a um ativo (ou seja, uma hipoteca). Não é nossa intenção apresentar essa ideia
em detalhes, mas oferecer uma analogia em que muitos serviços em nuvem são semelhantes a
derivados financeiros; os provedores de nuvem não apenas dividem os ativos de hardware em
pequenos pedaços por meio da virtualização, mas também vendem esses pedaços com características
técnicas variadas e riscos associados. Embora os provedores sejam extremamente discretos sobre
os detalhes de seus sistemas internos, existem enormes oportunidades de otimização e
dimensionamento ao entender os preços da nuvem e trocar notas com outros usuários.
Aqui está o nosso palpite. Ao comprar armazenamento em nuvem, cada disco em um cluster de
armazenamento tem três ativos que os provedores e consumidores de nuvem usam. Primeiro, ele
tem uma certa capacidade de armazenamento – digamos, 10 TB. Segundo, ele suporta um certo
número de operações de entrada/saída (IOPs) por segundo — digamos, 100. Terceiro, os discos
suportam uma certa largura de banda máxima, a velocidade máxima de leitura para arquivos
organizados de maneira ideal. Uma unidade magnética pode ser capaz de ler a 200 MB/s.
Machine Translated by Google
Nuvem ÿ No Local
Este título pode parecer uma tautologia boba, mas a crença de que os serviços em nuvem
são como servidores locais familiares é um erro cognitivo generalizado que assola as
migrações de nuvem e leva a contas horríveis. Isso demonstra uma questão mais ampla
na tecnologia que chamamos de maldição da familiaridade. Muitos novos produtos de
tecnologia são projetados intencionalmente para se parecerem com algo familiar para
facilitar o uso e acelerar a adoção. Mas, qualquer novo produto de tecnologia tem sutilezas
e rugas que os usuários devem aprender a identificar, acomodar e otimizar.
Mover servidores locais um por um para VMs na nuvem - conhecido como simples elevação
e mudança - é uma estratégia perfeitamente razoável para a fase inicial da migração para
a nuvem, especialmente quando uma empresa está enfrentando alguns problemas
Machine Translated by Google
tipo de precipício financeiro, como a necessidade de assinar uma nova locação significativa ou contrato
de hardware se o hardware existente não for desligado. No entanto, as empresas que deixam seus
ativos de nuvem nesse estado inicial sofrerão um grande choque. Em uma base de comparação direta,
os servidores de longa duração na nuvem são significativamente mais caros do que seus equivalentes
locais.
A chave para encontrar valor na nuvem é entender e otimizar o modelo de precificação da nuvem.
Em vez de implantar um conjunto de servidores de longa execução capazes de lidar com a carga
máxima de pico, use o dimensionamento automático para permitir que as cargas de trabalho sejam
reduzidas para infraestrutura mínima quando as cargas são leves e até clusters massivos durante os
horários de pico. Para obter descontos por meio de cargas de trabalho mais efêmeras e menos
duráveis, use instâncias reservadas ou pontuais ou use funções sem servidor no lugar de servidores.
Muitas vezes pensamos que essa otimização leva a custos mais baixos, mas também devemos
nos esforçar para aumentar o valor do negócio explorando a natureza dinâmica da nuvem. Os
3 criar novo valor na nuvem realizando coisas que eram impossíveis em
engenheiros de dados podem
seu ambiente local. Por exemplo, é possível ativar rapidamente clusters de computação massivos
para executar transformações complexas em escalas inacessíveis para hardware local.
Gravidade de dados
Além de erros básicos, como seguir práticas operacionais locais na nuvem, os engenheiros de
dados precisam estar atentos a outros aspectos de preços e incentivos na nuvem que
frequentemente pegam usuários
desprevenido.
Nuvem Híbrida
À medida que empresas mais estabelecidas migram para a nuvem, o modelo de nuvem
híbrida ganha importância. Praticamente nenhuma empresa pode migrar todas as suas
cargas de trabalho da noite para o dia. O modelo de nuvem híbrida pressupõe que uma
organização manterá indefinidamente algumas cargas de trabalho fora da nuvem.
Esse padrão de colocar análises na nuvem é bonito porque os dados fluem principalmente
em uma direção, minimizando os custos de saída de dados (Figura 4-3). Ou seja, os
aplicativos locais geram dados de eventos que podem ser enviados para a nuvem
essencialmente de graça. A maior parte dos dados permanece na nuvem onde é analisada,
enquanto quantidades menores de dados são enviadas de volta ao local para implantação
de modelos em aplicativos, ETL reverso etc.
Machine Translated by Google
Figura 4-3. Um modelo de fluxo de dados de nuvem híbrida que minimiza os custos de saída
Uma nova geração de ofertas de serviços gerenciados de nuvem híbrida também permite que
4
os clientes localizem servidores gerenciados em nuvem em seus data centers. Isso oferece aos
usuários a capacidade de incorporar os melhores recursos em cada nuvem junto com a infraestrutura
local.
Multicloud
Multicloud simplesmente se refere à implantação de cargas de trabalho em várias nuvens públicas.
As empresas podem ter várias motivações para implantações multicloud. As plataformas SaaS
geralmente desejam oferecer serviços próximos às cargas de trabalho existentes na nuvem do
cliente. Snowflake e Databricks fornecem suas ofertas de SaaS em várias nuvens por esse motivo.
Isso é especialmente crítico para aplicativos com uso intenso de dados, em que a latência da rede
e as limitações de largura de banda prejudicam o desempenho e os custos de saída de dados
podem ser proibitivos.
Machine Translated by Google
Uma nova geração de serviços de “nuvem de nuvens” visa facilitar a multicloud com
complexidade reduzida, oferecendo serviços entre nuvens e replicando dados entre
nuvens ou gerenciando cargas de trabalho em várias nuvens por meio de um único
painel. Para citar um exemplo, uma conta do Snowflake é executada em uma única
região de nuvem, mas os clientes podem facilmente ativar outras contas no GCP, AWS
ou Azure. O Snowflake fornece replicação de dados agendada simples entre essas
várias contas de nuvem. A interface Snowflake é essencialmente a mesma em todas
essas contas, removendo a carga de treinamento de alternar entre serviços de dados
nativos da nuvem.
Embora não seja amplamente utilizado agora, vale a pena mencionar brevemente uma nova
tendência que pode se tornar popular na próxima década: computação descentralizada.
Enquanto os aplicativos de hoje são executados principalmente no local e na nuvem, a
ascensão do blockchain, Web 3.0 e computação de ponta pode inverter esse paradigma.
No momento, as plataformas descentralizadas provaram ser extremamente populares, mas
não tiveram um impacto significativo no espaço de dados; mesmo assim, vale a pena ficar de
olho nessas plataformas ao avaliar as decisões de tecnologia.
Nosso Conselho
Do nosso ponto de vista, ainda estamos no início da transição para a nuvem. Assim, as
evidências e os argumentos em torno do posicionamento e migração da carga de trabalho
estão em constante mudança. A própria nuvem está mudando, com uma mudança do
modelo IaaS construído em torno do Amazon EC2 que impulsionou o crescimento inicial da
AWS, para ofertas de serviços mais gerenciadas, como AWS Glue, Google BigQuery e
Snowflake.
Acreditamos que é fundamental evitar essa armadilha interminável de análise. Em vez disso,
planeje para o presente. Escolha as melhores tecnologias para suas necessidades atuais
Machine Translated by Google
e planos concretos para o futuro próximo. Escolha sua plataforma de implantação com base
nas necessidades reais dos negócios, concentrando-se na simplicidade e na flexibilidade.
Por outro lado, tenha um plano de fuga. Como enfatizamos antes, toda tecnologia – mesmo
software de código aberto – vem com algum grau de bloqueio. Uma estratégia de nuvem única
tem vantagens significativas de simplicidade e integração, mas vem com um bloqueio significativo
anexado. Neste caso, estamos falando de flexibilidade mental, a flexibilidade de avaliar o estado
atual do mundo e imaginar alternativas. Idealmente, seu plano de fuga permanecerá trancado
atrás do vidro, mas preparar esse plano o ajudará a tomar melhores decisões no presente e lhe
dará uma saída se as coisas derem errado no futuro.
Queremos ter um momento para dissecar uma parte de sua discussão. Wang e Casado citam a
repatriação do Dropbox de cargas de trabalho significativas da AWS para servidores de
propriedade do Dropbox como um estudo de caso para empresas que consideram movimentos
de repatriação semelhantes.
Acreditamos que este estudo de caso é frequentemente usado sem contexto apropriado e é um
exemplo convincente da falácia lógica da falsa equivalência .
O Dropbox fornece serviços específicos em que a propriedade de hardware e data centers pode
oferecer uma vantagem competitiva. As empresas não devem confiar excessivamente no exemplo do
Dropbox ao avaliar as opções de implantação na nuvem e no local.
Primeiro, é importante entender que o Dropbox armazena enormes quantidades de dados. A empresa
está de boca fechada sobre exatamente quantos dados hospeda, mas diz que são muitos exabytes e
continua a crescer.
Em segundo lugar, o Dropbox lida com uma grande quantidade de tráfego de rede. Sabemos que seu
consumo de largura de banda em 2017 foi significativo o suficiente para a empresa adicionar “centenas
de gigabits de conectividade de internet com provedores de trânsito (ISPs regionais e globais) e centenas
de novos parceiros de peering (onde trocamos tráfego diretamente em vez de um ISP). ).” Os custos de
5
saída de dados seriam extremamente altos em um ambiente de nuvem pública.
Quarto, enquanto o Dropbox transferiu seu produto principal para o hardware, continuou desenvolvendo
outras cargas de trabalho da AWS. Isso permite que o Dropbox se concentre na criação de um serviço
de nuvem altamente ajustado em uma escala extraordinária, em vez de tentar substituir vários serviços.
O Dropbox pode se concentrar em sua competência central em armazenamento em nuvem e
sincronização de dados, enquanto descarrega software e gerenciamento de hardware em outras áreas,
como análise de dados. 7
Outras histórias de sucesso frequentemente citadas que as empresas construíram fora da nuvem
incluem Backblaze e Cloudflare, mas oferecem lições semelhantes.
Backblaze começou a vida como um produto de backup de dados em nuvem pessoal, mas desde então
Machine Translated by Google
A Netflix oferece mais um exemplo útil. A empresa é famosa por executar sua pilha de tecnologia
na AWS, mas isso é apenas parcialmente verdade. A Netflix executa a transcodificação de vídeo na
AWS, respondendo por aproximadamente 70% de suas necessidades de computação em 2017. A Netflix
também executa seu8back-end de aplicativos e análise de dados na AWS. No entanto, em vez de usar a
rede de distribuição de conteúdo da AWS, a Netflix criou uma CDN personalizada em colaboração com
provedores de serviços de Internet, utilizando uma combinação altamente especializada de software e
hardware. Para uma empresa que consome uma fatia substancial de todo o tráfego da Internet, a
construção dessa infraestrutura crítica permitiu que ela entregasse vídeo de alta qualidade a uma enorme
9
base de clientes de maneira econômica.
Esses estudos de caso sugerem que faz sentido que as empresas gerenciem seu próprio hardware
e conexões de rede em circunstâncias específicas.
As maiores histórias de sucesso modernas de empresas que criam e mantêm hardware envolvem escala
extraordinária (exabytes de dados, terabits por segundo de largura de banda etc.) e casos de uso
limitados em que as empresas podem obter uma vantagem competitiva ao projetar pilhas de hardware
e software altamente integradas. Além disso, todas essas empresas consomem largura de banda de
rede massiva, sugerindo que as cobranças de saída de dados seriam um grande custo se optassem por
operar totalmente a partir de uma nuvem pública.
Como costumamos perguntar: “Quando você precisa de pneus novos para o seu carro,
você obtém as matérias-primas, constrói os pneus do zero e os instala você mesmo?”
Como a maioria das pessoas, você provavelmente está comprando pneus e mandando
alguém instalá-los. O mesmo argumento se aplica a construir versus comprar. Vimos
equipes que construíram seus bancos de dados do zero. Um simples RDBMS de código
aberto teria servido muito melhor às suas necessidades após uma inspeção mais detalhada.
Imagine a quantidade de tempo e dinheiro investidos neste banco de dados local. Fale
sobre baixo ROI para TCO e custo de oportunidade.
É aqui que a distinção entre o engenheiro de dados tipo A e tipo B é útil. Como
apontamos anteriormente, as funções do tipo A e do tipo B geralmente são incorporadas
ao mesmo engenheiro, especialmente em uma pequena organização.
Sempre que possível, incline-se para o comportamento do tipo A; evite o trabalho
pesado indiferenciado e abrace a abstração. Use estruturas de código aberto ou, se isso
for muito problemático, procure comprar uma solução gerenciada ou proprietária
adequada. Muitos ótimos serviços modulares estão disponíveis para escolha em ambos
os casos.
Machine Translated by Google
Software livre
O software de código aberto (OSS) é um modelo de distribuição de software no qual o
software e a base de código subjacente são disponibilizados para uso geral, geralmente sob
termos de licenciamento específicos. Muitas vezes o OSS é criado e mantido por uma equipe
distribuída de colaboradores. O OSS é livre para usar, alterar e distribuir na maioria das vezes,
mas com ressalvas específicas. Por exemplo, muitas licenças exigem que o código-fonte do
software derivado de código aberto seja incluído quando o software for distribuído.
As motivações para criar e manter OSS variam. Às vezes, o OSS é orgânico, surgindo da mente de
um indivíduo ou de uma pequena equipe que cria uma nova solução e opta por liberá-la para uso
público. Outras vezes, uma empresa pode disponibilizar uma ferramenta ou tecnologia específica ao
público sob uma licença de OSS.
O OSS tem dois sabores principais: OSS gerenciado pela comunidade e OSS comercial.
projetos OSS são bem-sucedidos com uma comunidade forte e uma base de usuários vibrante.
O OSS gerenciado pela comunidade é um caminho predominante para projetos de OSS.
A comunidade abre altas taxas de inovações e contribuições de desenvolvedores em todo o
mundo com projetos populares de OSS.
Mindshare
Machine Translated by Google
grupos de bate-papo e fóruns relacionados. O projeto tem um forte senso de comunidade? Uma
comunidade forte cria um ciclo virtuoso de adoção forte. Isso também significa que você terá mais
Maturidade
indica que as pessoas o consideram útil e estão dispostas a incorporá-lo em seus fluxos de
trabalho de produção.
Solução de problemas
Como você terá que lidar com os problemas se eles surgirem? Você está sozinho para
Gerenciamento de Projetos
Veja os problemas do Git e a maneira como eles são abordados. Eles são abordados
Equipe
contribuintes?
O que o projeto está fazendo para incentivar a aceitação e a adoção? Existe uma
Contribuindo
Roteiro
Auto-hospedagem e manutenção
Você tem os recursos para hospedar e manter a solução OSS? Se for assim,
Retribuindo à comunidade
Você pode contribuir com a base de código, ajudar a corrigir problemas e dar
amor que não dá ao mantenedor um salário digno. Se você pode dar ao luxo de
OSS comercial
gerenciando a solução OSS para você, normalmente como uma oferta de SaaS em nuvem.
Exemplos de tais fornecedores incluem Databricks (Spark), Confluent (Kafka), DBT Labs (dbt)
e há muitos, muitos outros.
Neste ponto, o engenheiro de dados tem duas opções. Você pode continuar usando a versão
OSS gerenciada pela comunidade, que precisa continuar mantendo por conta própria (atualizações,
manutenção de servidor/contêiner, solicitações de pull para correções de bugs, etc.). Ou você
pode pagar ao fornecedor e deixar que ele cuide da gestão administrativa do produto COSS.
Valor
Modelo de entrega
API ou IU da Web/móvel? Certifique-se de que você pode acessar facilmente a versão inicial
e as versões subsequentes.
Machine Translated by Google
Apoiar
O suporte não pode ser subestimado e muitas vezes é opaco para o comprador. o que
Apoio, suporte? Frequentemente, os fornecedores vendem suporte por uma taxa adicional.
Certifique-se de entender claramente os custos de obter suporte. Além disso, entenda o que é
Qualquer coisa que não seja coberta pelo suporte será de sua responsabilidade
possuir e administrar.
Muitas vezes, um fornecedor oferecerá preços sob demanda, especialmente para um SaaS
Finanças da empresa
Suporte da comunidade
Observe também que as nuvens oferecem seus próprios produtos de código aberto
gerenciados. Se um fornecedor de nuvem vê tração com um determinado produto ou
projeto, espere que esse fornecedor ofereça sua versão. Isso pode variar de exemplos
simples (Linux de código aberto oferecido em VMs) a serviços gerenciados extremamente
complexos (Kafka totalmente gerenciado). A motivação para essas ofertas é simples: as
nuvens ganham dinheiro por meio do consumo. Mais ofertas em um ecossistema de nuvem
significam uma chance maior de “aderência” e aumento dos gastos do cliente.
Ofertas independentes
Machine Translated by Google
O cenário de ferramentas de dados tem visto um crescimento exponencial nos últimos anos.
Todos os dias, surgem novas ofertas independentes para ferramentas de dados. Com a
capacidade de arrecadar fundos de VCs com capital, essas empresas de dados podem escalar
e contratar ótimas equipes de engenharia, vendas e marketing. Isso apresenta uma situação em
que os usuários têm ótimas opções de produtos no mercado, ao mesmo tempo em que precisam
percorrer intermináveis vendas e confusão de marketing.
Muitas vezes, uma empresa que vende uma ferramenta de dados não a lança como
OSS, oferecendo uma solução proprietária. Embora você não tenha a transparência de uma
solução OSS pura, uma solução proprietária independente pode funcionar muito bem,
especialmente como um serviço totalmente gerenciado na nuvem.
Interoperabilidade
Certifique-se de que a ferramenta interopere com outras ferramentas que você escolheu
Documentação e suporte
Preços
Longevidade
A empresa sobreviverá tempo suficiente para que você obtenha valor de seu produto? Se a
situação. Veja as avaliações dos usuários. Pergunte aos amigos e poste perguntas nas redes sociais
redes sobre as experiências de outros usuários com o produto. Certifique-se de saber no que
está se metendo.
A seguir estão os fatores a serem considerados com uma oferta de nuvem proprietária:
A oferta de nuvem é substancialmente melhor do que uma versão independente ou OSS? Qual
Considerações de compra
O preço sob demanda pode ser caro. Você pode reduzir seu custo comprando capacidade
acordo?
Nosso Conselho
Construir versus comprar volta a conhecer sua vantagem competitiva e onde faz
sentido investir recursos em customização. Em geral, favorecemos OSS e COSS
por padrão, o que libera você para se concentrar em melhorar as áreas onde essas
opções são insuficientes. Concentre-se em algumas áreas onde construir algo irá
agregar valor significativo ou reduzir substancialmente o atrito.
Por fim, quem é responsável pelo orçamento da sua empresa? Como essa pessoa
decide os projetos e tecnologias que serão financiados? Antes de fazer o business
case para COSS ou serviços gerenciados, faz sentido tentar usar o OSS primeiro? A
última coisa que você deseja é que sua escolha de tecnologia fique presa no limbo
enquanto aguarda a aprovação do orçamento. Como diz o velho ditado, o tempo
mata os negócios. No seu caso, mais tempo gasto no limbo significa uma maior
probabilidade de que a aprovação do seu orçamento morra. Saiba de antemão quem
controla o orçamento e o que será aprovado com sucesso.
tecnologias que executam tarefas nas quais são excepcionalmente excelentes. Especialmente
considerando a taxa de mudança nos produtos no mundo dos dados, o argumento é que
você deve buscar a interoperabilidade entre um conjunto de soluções em constante mudança.
Que abordagem você deve adotar em sua pilha de engenharia de dados? Vamos
explorar os trade-offs.
Monólito
O monólito (Figura 4-4) tem sido um pilar da tecnologia por décadas. Os velhos tempos da
cascata significavam que os lançamentos de software eram enormes, fortemente acoplados e
se moviam em uma cadência lenta. Grandes equipes trabalharam juntas para entregar uma
única base de código funcional. Os sistemas de dados monolíticos continuam até hoje, com
fornecedores de software mais antigos, como a Informatica, e estruturas de código aberto,
como o Spark.
Problemas induzidos pelo usuário também acontecem com monólitos. Por exemplo, vimos
um pipeline ETL monolítico que levou 48 horas para ser executado. Se algo quebrasse em
qualquer lugar do pipeline, todo o processo teria que ser reiniciado. Enquanto isso, usuários
de negócios ansiosos aguardavam seus relatórios, que já estavam com dois dias de atraso
por padrão. As rupturas eram comuns o suficiente para que o sistema monolítico fosse
eventualmente descartado.
Outro contra dos monólitos é que mudar para um novo sistema será doloroso se o
fornecedor ou o projeto de código aberto morrer. Como todos os seus processos estão
contidos no monólito, sair desse sistema e entrar em uma nova plataforma será caro em
tempo e dinheiro.
Modularidade
A modularidade (Figura 4-5) é um conceito antigo na engenharia de software, mas
os sistemas distribuídos modulares realmente entraram em voga com o surgimento
dos microsserviços. Em vez de depender de um monólito maciço para lidar com suas
necessidades, por que não separar sistemas e processos em suas áreas de interesse
independentes? Os microsserviços podem se comunicar por meio de APIs, permitindo
que os desenvolvedores se concentrem em seus domínios enquanto tornam seus
aplicativos acessíveis a outros microsserviços. Essa é a tendência na engenharia de
software e é cada vez mais vista em sistemas de dados modernos.
Machine Translated by Google
Os contras da modularidade são que há mais motivos para raciocinar. Em vez de lidar
com um único sistema de preocupação, agora você tem potencialmente inúmeros
sistemas para entender e operar. A interoperabilidade é uma dor de cabeça potencial;
espero que todos esses sistemas funcionem bem juntos.
dependências. Qualquer executor pode executar qualquer tarefa, portanto, uma biblioteca cliente
para uma única tarefa executada em um DAG deve ser instalada em todo o cluster.
A orquestração de muitas ferramentas envolve a instalação de bibliotecas de cliente para uma
série de APIs. Os conflitos de dependência são um problema constante.
Nosso Conselho
Aqui estão algumas coisas a serem consideradas ao avaliar monólitos versus opções
modulares:
Interoperabilidade
escapar.
Flexibilidade
As coisas estão se movendo tão rápido no espaço de dados agora. Comprometer-se com um
Sem servidor
Embora o serverless já exista há algum tempo, a tendência serverless começou com força total com
o AWS Lambda em 2014. Com a promessa de executar pequenos pedaços de código conforme
necessário sem ter que gerenciar um servidor, o serverless explodiu em popularidade . As principais
razões para sua popularidade são o custo e a conveniência. Em vez de pagar o custo de um servidor,
por que não pagar apenas quando seu código for evocado?
Serverless tem muitos sabores. Embora a função como serviço (FaaS) seja muito popular, os
sistemas sem servidor são anteriores ao advento do AWS Lambda. O BigQuery do Google Cloud
não tem servidor, pois os engenheiros de dados não precisam gerenciar a infraestrutura de back-
end, e o sistema é dimensionado para zero e dimensionado automaticamente para lidar com
grandes consultas. Basta carregar os dados no sistema e começar a consultar. Você paga pela
quantidade de dados que sua consulta consome e um pequeno custo para armazenar seus dados.
Esse modelo de pagamento – pagando pelo consumo e armazenamento – está se tornando mais
prevalente.
Quando o serverless faz sentido? Tal como acontece com muitos outros serviços em nuvem,
depende; e os engenheiros de dados fariam bem em entender os detalhes dos preços da nuvem
para prever quando as implantações sem servidor se tornarão caras. Olhando especificamente
para o caso do AWS Lambda, vários engenheiros descobriram hacks para executar cargas de
trabalho em lote a custos baixos. Por outro lado, as funções sem servidor sofrem de uma 11
ineficiência de sobrecarga inerente. Manipular um evento por chamada de função em uma alta
taxa de eventos pode ser catastroficamente caro.
Machine Translated by Google
Recipientes
AVISO
Os clusters de contêiner não fornecem a mesma segurança e isolamento que as VMs completas oferecem.
A fuga de contêiner – amplamente, uma classe de explorações em que o código em um contêiner
ganha privilégios fora do contêiner no nível do sistema operacional – é comum o suficiente para ser
considerado um risco para multilocação. Embora o Amazon EC2 seja um ambiente verdadeiramente
multilocatário com VMs de muitos clientes hospedadas no mesmo hardware, um cluster Kubernetes deve
hospedar código apenas em um ambiente de confiança mútua (por exemplo, dentro dos muros de uma única
empresa). Além disso, os processos de revisão de código e a verificação de vulnerabilidades são essenciais
para garantir que um desenvolvedor não introduza uma falha de segurança.
Personalização, poder e controle são outras razões principais para favorecer servidores em vez de servidores sem
servidor. Algumas estruturas sem servidor podem ser fracas ou limitadas para determinados casos de uso. Aqui
estão algumas coisas a serem consideradas ao usar servidores, principalmente na nuvem, onde os recursos do
A falha do servidor acontecerá. Evite usar um servidor “floco de neve especial” que seja excessivamente
recursos que você pode criar conforme necessário e, em seguida, excluir. Se seu aplicativo exigir
a instalação de um código específico no servidor, use um script de inicialização ou crie uma imagem.
Pipeline CI/CD.
infraestrutura sempre que possível. Implante sua infraestrutura (servidores ou não) usando
Manager.
Use recipientes.
Para cargas de trabalho mais sofisticadas ou pesadas com dependências instaladas complexas,
Kubernetes.
Nosso Conselho
Aqui estão algumas considerações importantes para ajudá-lo a determinar se o serverless é ideal para
você:
O Serverless funciona melhor para tarefas e cargas de trabalho simples e discretas. Não é
Quanto tempo cada solicitação levará para ser processada? Plataformas sem servidor em nuvem
aplicativo não pode funcionar perfeitamente dentro desses limites, é hora de considerar
Pedidos e networking
As plataformas sem servidor geralmente utilizam alguma forma de rede simplificada e não
e firewalls.
Linguagem
Qual idioma você costuma usar? Se não for um dos idiomas oficialmente suportados pela
abstrações. Em vez disso, você está limitado a uma imagem de tempo de execução específica.
Custo
seus custos são baixos; os custos aumentam rapidamente à medida que a contagem de eventos
No final, a abstração tende a vencer. Sugerimos usar primeiro sem servidor e depois servidores - com
contêineres e orquestração, se possível - uma vez
Machine Translated by Google
Otimização, Desempenho e o
Guerras de referência
Imagine que você é um bilionário comprando novos meios de transporte. Você reduziu sua
escolha a duas opções:
Potência: 1020
Qual dessas opções oferece melhor desempenho? Você não precisa saber muito sobre carros
ou aeronaves para reconhecer que esta é uma comparação idiota.
Machine Translated by Google
Uma opção é um jato particular de fuselagem larga projetado para operação intercontinental,
enquanto a outra é um supercarro elétrico.
Vemos essas comparações de maçãs com laranjas feitas o tempo todo no espaço do banco
de dados. Os benchmarks comparam bancos de dados otimizados para casos de uso completamente
diferentes ou usam cenários de teste que não têm nenhuma semelhança com as necessidades do
mundo real.
Recentemente, vimos uma nova rodada de guerras de benchmark entre os principais fornecedores
no espaço de dados. Aplaudimos os benchmarks e estamos felizes em ver muitos fornecedores de
banco de dados finalmente eliminando as cláusulas DeWitt de seus contratos com clientes. Mesmo
13com o comprador: o espaço de dados está cheio de benchmarks sem sentido. Aqui
assim, cuidado
14 para colocar o polegar na escala de referência.
estão alguns truques comuns usados
preços.
Para comparar casos de uso do mundo real, você deve simular dados do mundo real e tamanho de
consulta previstos. Avalie o desempenho da consulta e os custos dos recursos com base em uma
avaliação detalhada de suas necessidades.
base de custo por segundo não faz sentido, mas vemos isso o tempo todo em benchmarks.
Otimização assimétrica
O engano da otimização assimétrica aparece em muitas formas, mas aqui está um exemplo. Muitas
vezes, um fornecedor compara um sistema MPP baseado em linha com um banco de dados colunar
usando um benchmark que executa consultas de junção complexas em dados altamente normalizados.
O modelo de dados normalizado é ideal para o sistema baseado em linhas, mas o sistema colunar
realizaria todo o seu potencial apenas com algumas alterações de esquema. Para piorar as coisas,
os fornecedores complementam seus sistemas com uma dose extra de otimização de junção (por
exemplo, junções pré-indexação) sem aplicar ajustes comparáveis no banco de dados concorrente (por
exemplo, colocando junções em uma visualização materializada).
Advertência Emptor
Tal como acontece com todas as coisas na tecnologia de dados, o comprador deve ficar
atento. Faça sua lição de casa antes de confiar cegamente em benchmarks de fornecedores para
avaliar e escolher a tecnologia.
Gestão de dados
O gerenciamento de dados é uma área ampla e, em relação às tecnologias, nem sempre é
aparente se uma tecnologia adota o gerenciamento de dados como uma preocupação principal.
Por exemplo, nos bastidores, um fornecedor terceirizado pode
Machine Translated by Google
Como você está protegendo os dados contra violações, tanto de fora quanto de dentro?
Como você garante a qualidade dos dados e que estou visualizando os dados corretos
em sua solução?
Há muitas outras perguntas a serem feitas, e essas são apenas algumas das maneiras de pensar
sobre o gerenciamento de dados no que se refere à escolha das tecnologias certas. Essas
mesmas perguntas também devem se aplicar às soluções de OSS que você está considerando.
DataOps
Problemas vão acontecer. Eles simplesmente vão. Um servidor ou banco de dados pode
morrer, a região de uma nuvem pode ter uma interrupção, você pode implantar código de buggy,
dados ruins podem ser introduzidos em seu data warehouse e outros problemas imprevistos
podem ocorrer.
Ao avaliar uma nova tecnologia, quanto controle você tem sobre a implantação de um novo
código, como você será alertado se houver um problema e como você responderá quando houver
um problema? A resposta depende muito do tipo de tecnologia que você está considerando. Se
a tecnologia for OSS, você provavelmente será responsável por configurar o monitoramento,
hospedagem e implantação de código.
Como você vai lidar com os problemas? Qual é a sua resposta ao incidente?
Muitas das operações estão fora de seu controle se você estiver usando uma oferta gerenciada.
Considere o SLA do fornecedor, a maneira como eles alertam você sobre problemas e
Machine Translated by Google
se eles são transparentes sobre como estão abordando o caso, incluindo fornecer
um ETA para uma correção.
Arquitetura de dados
O Airflow desfruta de muitas vantagens, em grande parte devido à sua posição dominante no
mercado de código aberto. Primeiro, o projeto de código aberto Airflow é extremamente ativo,
com uma alta taxa de commits e um tempo de resposta rápido para bugs e problemas de
segurança, e o projeto lançou recentemente o Airflow 2, uma grande refatoração da base de
código. Em segundo lugar, o Airflow desfruta de um enorme compartilhamento de ideias.
O Airflow tem uma comunidade vibrante e ativa em muitas plataformas de
comunicação, incluindo Slack, Stack Overflow e GitHub. Os usuários podem encontrar
facilmente respostas para perguntas e problemas. Terceiro, o Airflow está disponível
comercialmente como um serviço gerenciado ou distribuição de software por meio de muitos
fornecedores, incluindo GCP, AWS e Astronomer.io.
Machine Translated by Google
Não tentamos uma discussão exaustiva das alternativas do Airflow aqui, mas apenas
mencionamos alguns dos principais candidatos à orquestração no momento da redação.
Prefect e Dagster visam resolver alguns dos problemas discutidos anteriormente repensando
os componentes da arquitetura Airflow. Haverá outras estruturas e tecnologias de
orquestração não discutidas aqui?
Planeje-se.
Engenharia de software
Como engenheiro de dados, você deve se esforçar para simplificar e abstrair toda a
pilha de dados. Compre ou use soluções de código aberto pré-criadas sempre que
possível. Eliminar o trabalho pesado indiferenciado deve ser seu grande objetivo.
Concentre seus recursos - codificação e ferramentas personalizadas - em áreas que
oferecem uma vantagem competitiva sólida. Por exemplo, a codificação manual de uma
conexão de banco de dados entre seu banco de dados de produção e seu data warehouse
na nuvem é uma vantagem competitiva para você? Provavelmente não. Este é um problema
muito resolvido. Escolha uma solução pronta para uso (código aberto ou SaaS gerenciado).
O mundo não precisa do milionésimo conector +1 de banco de dados para armazenamento
de dados em nuvem.
Por outro lado, por que os clientes compram de você? Sua empresa provavelmente tem
algo especial na maneira como faz as coisas. Talvez seja um algoritmo específico que
alimenta sua plataforma fintech. Ao abstrair muitos
Machine Translated by Google
Conclusão
Escolher as tecnologias certas não é tarefa fácil, especialmente quando novas tecnologias e
padrões surgem diariamente. Hoje é possivelmente o momento mais confuso da história para
avaliar e selecionar tecnologias.
A escolha de tecnologias é um equilíbrio entre caso de uso, custo, construção versus compra e
modularização. Sempre aborde a tecnologia da mesma forma que a arquitetura: avalie as compensações
e aponte para decisões reversíveis.
1 Para mais detalhes, veja “Total Opportunity Cost of Ownership” de Joseph Reis em 97 Things
Todo Engenheiro de Dados Deve Saber (O'Reilly).
5 Raghav Bhargava, “Evolution of Dropbox's Edge Network”, Dropbox.Tech, 19 de junho de 2017, https:// oreil.ly/
RAwPf.
7 “O Dropbox migra 34 PB de dados para um Amazon S3 Data Lake for Analytics”, site da AWS, 2020, https:// oreil.ly/
wpVoM.
8 Todd Hoff, “The Eternal Cost Savings of Netflix's Internal Spot Market,” High Scalability, 4 de dezembro de 2017,
https:// oreil.ly/ LLoFt.
9 Todd Spangler, “Consumo de largura de banda Netflix eclipsado pelo streaming de mídia da Web
Applications”, Variety, 10 de setembro de 2019, https:// oreil.ly/ tTm3k.
10 Amir Efrati e Kevin McLaughlin, “Os gastos da Apple com o armazenamento em nuvem do Google estão a caminho de
Soar 50% This Year”, The Information, 29 de junho de 2021, https:// oreil.ly/ OlFyR.
11 Evan Sangaline, “Executando o FFmpeg no AWS Lambda por 1,9% do custo do AWS Elastic
Transcoder”, blog Intoli, 2 de maio de 2018, https:// oreil.ly/ myzOv.
13 Justin Olsson e Reynold Xin, “Elimming the Anti-competitive DeWitt Clause for Database
Benchmarking”, Databricks, 8 de novembro de 2021, https:// oreil.ly/ 3iFOE.
14 Para um clássico do gênero, ver William McKnight e Jake Dolezal, “Data Warehouse in the
Cloud Benchmark”, GigaOm, 7 de fevereiro de 2019, https:// oreil.ly/ QjCmA.
Machine Translated by Google
Figura 5-1. Os sistemas de origem geram os dados para o restante do ciclo de vida da engenharia de dados
Machine Translated by Google
A criação de dados analógicos ocorre no mundo real, como fala vocal, linguagem de
sinais, escrita em papel ou tocar um instrumento. Esses dados analógicos geralmente são
transitórios; com que frequência você teve uma conversa verbal cujo conteúdo se perdeu
no éter após o término da conversa?
Os dados digitais são criados pela conversão de dados analógicos em formato digital ou
são o produto nativo de um sistema digital. Um exemplo de analógico para digital é um
aplicativo de mensagens de texto para dispositivos móveis que converte a fala analógica em
texto digital. Um exemplo de criação de dados digitais é uma transação com cartão de crédito
em uma plataforma de comércio eletrônico. Um cliente faz um pedido, a transação é cobrada
em seu cartão de crédito e as informações da transação são salvas em vários bancos de dados.
Utilizaremos alguns exemplos comuns neste capítulo, como dados criados ao interagir com
um site ou aplicativo móvel. Mas, na verdade, os dados estão em todo o mundo ao nosso
redor. Capturamos dados de dispositivos IoT, terminais de cartão de crédito, sensores de
telescópio, negociações de ações e muito mais.
Familiarize-se com seu sistema de origem e como ele gera dados. Esforce-se para ler a
documentação do sistema de origem e entender seus padrões e peculiaridades. Se o seu
sistema de origem for um RDBMS, saiba como ele funciona
Machine Translated by Google
(gravações, confirmações, consultas, etc.); aprenda os meandros do sistema de origem que podem
afetar sua capacidade de ingerir a partir dele.
Além disso, os arquivos são um meio universal de troca de dados. Por mais que os engenheiros de
dados desejem obter dados programaticamente, grande parte do mundo ainda envia e recebe arquivos.
Por exemplo, se você estiver obtendo dados de uma agência governamental, há uma grande chance de
você baixar os dados como um arquivo Excel ou CSV ou receber o arquivo em um e-mail.
Os principais tipos de formatos de arquivo de origem que você encontrará como engenheiro de dados
— arquivos que se originam manualmente ou como saída de um processo do sistema de origem —
são Excel, CSV, TXT, JSON e XML. Esses arquivos têm suas peculiaridades e podem ser estruturados
(Excel, CSV), semiestruturados (JSON, XML, CSV) ou não estruturados (TXT, CSV). Embora você
use fortemente certos formatos como engenheiro de dados (como Parquet, ORC e Avro), abordaremos
isso mais tarde e colocaremos o destaque aqui nos arquivos do sistema de origem. O Capítulo 6
cobre os detalhes técnicos dos arquivos.
API
As interfaces de programação de aplicativos (APIs) são uma forma padrão de troca de
dados entre sistemas. Em teoria, as APIs simplificam a tarefa de ingestão de dados para
engenheiros de dados. Na prática, muitas APIs ainda expõem uma grande quantidade de complexidade
de dados para os engenheiros gerenciarem. Mesmo com o surgimento de vários serviços e frameworks
e serviços para automatizar dados de API
Machine Translated by Google
ingestão, os engenheiros de dados geralmente devem investir uma boa quantidade de energia
na manutenção de conexões de API personalizadas. Discutiremos as APIs com mais detalhes
posteriormente neste capítulo.
De forma mais geral, os bancos de dados OLTP suportam baixa latência e alta simultaneidade.
Um banco de dados RDBMS pode selecionar ou atualizar uma linha em menos de um milissegundo
(sem considerar a latência da rede) e lidar com milhares de leituras e gravações por segundo. Um
cluster de banco de dados de documentos pode gerenciar taxas de confirmação de documentos ainda
mais altas às custas de uma possível inconsistência. Alguns bancos de dados gráficos também podem
lidar com casos de uso transacionais.
ÁCIDO
da mesma forma, o estado final do banco de dados será consistente com a execução
sequencial dessas atualizações na ordem em que foram enviadas.
A durabilidade indica que os dados comprometidos nunca serão perdidos, mesmo em
caso de perda de energia.
Observe que as características ACID não são necessárias para oferecer suporte a
back-ends de aplicativos e relaxar essas restrições pode ser um benefício considerável
para o desempenho e a escala. No entanto, as características do ACID garantem que o
banco de dados manterá uma imagem consistente do mundo, simplificando drasticamente
a tarefa do desenvolvedor do aplicativo.
Todos os engenheiros (dados ou não) devem entender a operação com e sem ACID.
Por exemplo, para melhorar o desempenho, alguns bancos de dados distribuídos usam
restrições de consistência relaxadas, como consistência eventual, para melhorar o
desempenho. Compreender o modelo de consistência com o qual você está trabalhando
ajuda a evitar desastres.
Transações atômicas
Uma transação atômica é um conjunto de várias alterações que são confirmadas como
uma unidade. No exemplo da Figura 5-2, um aplicativo bancário tradicional executado em um
RDBMS executa uma instrução SQL que verifica os saldos de duas contas, uma na Conta A
(a origem) e outra na Conta B (o destino).
O dinheiro é então movido da Conta A para a Conta B se houver fundos suficientes na Conta
A. A transação inteira deve ser executada com atualizações nos saldos de ambas as contas
ou falhar sem atualizar o saldo de nenhuma das contas. Ou seja, toda a operação deve
acontecer como uma transação.
Machine Translated by Google
Figura 5-2. Exemplo de uma transação atômica: uma transferência de conta bancária usando OLTP
OLTP e análise
o deixará de joelhos, a menos que seja combinado com uma camada de cache projetada para este caso de
uso.
Observe que estamos usando o termo OLAP para nos referirmos a qualquer sistema de banco de dados
que suporte consultas analíticas interativas de alta escala; não estamos nos limitando a sistemas que
suportam cubos OLAP (arrays multidimensionais de dados). A parte on -line do OLAP implica que o sistema
escute constantemente as consultas recebidas, tornando os sistemas OLAP adequados para análises
interativas.
Embora este capítulo aborde os sistemas de origem, os OLAPs geralmente são sistemas de armazenamento
e consulta para análise. Por que estamos falando sobre eles em nosso capítulo sobre sistemas de origem?
Em casos de uso práticos, os engenheiros geralmente precisam ler dados de um sistema OLAP. Por
exemplo, um data warehouse pode fornecer dados usados para treinar um modelo de ML. Ou um sistema
OLAP pode atender a um fluxo de trabalho de ETL reverso, em que os dados derivados em um sistema
de análise são enviados de volta a um sistema de origem, como um CRM, plataforma SaaS ou aplicativo
transacional.
A captura de dados de alteração (CDC) é um método para extrair cada evento de alteração (inserir,
atualizar, excluir) que ocorre em um banco de dados. O CDC é frequentemente aproveitado para replicar
entre bancos de dados quase em tempo real ou criar um fluxo de eventos para processamento downstream.
dados”.) Muitos bancos de dados NoSQL em nuvem podem enviar um log ou fluxo de eventos para um
local de armazenamento de destino.
Histórico
Um log captura informações sobre eventos que ocorrem nos sistemas. Por exemplo, um log pode capturar
padrões de tráfego e uso em um servidor web. Sua área de trabalho
Machine Translated by Google
o sistema operacional do computador (Windows, macOS, Linux) registra eventos à medida que o sistema é
Os logs são uma fonte de dados rica, potencialmente valiosa para análise de dados downstream, ML
Sistemas operacionais
Formulários
Servidores
Recipientes
Redes
dispositivos IoT
Todos os logs rastreiam eventos e metadados de eventos. No mínimo, um log deve capturar quem, o
quê e quando:
Quem
O que aconteceu
Quando
Codificação de registro
Eles codificam dados em um formato compacto personalizado para eficiência de espaço e E/S
exemplo.
Registros semiestruturados
Eles são codificados como texto em um formato de serialização de objetos (JSON, mais
muitas vezes não). Os logs semiestruturados são legíveis por máquina e portáteis.
No entanto, eles são muito menos eficientes que os logs binários. E embora sejam nominalmente
legíveis por máquina, extrair valor deles geralmente requer um código personalizado significativo.
Estes essencialmente armazenam a saída do console do software. Como tal, não existem
Resolução de registro
Os logs são criados em várias resoluções e níveis de log. A resolução do log refere-se à quantidade
de dados de eventos capturados em um log. Por exemplo, os logs do banco de dados capturam
informações suficientes dos eventos do banco de dados para permitir a reconstrução do estado do
banco de dados a qualquer momento.
Por outro lado, capturar todas as alterações de dados em logs para um sistema de big data geralmente
não é prático. Em vez disso, esses logs podem observar apenas que ocorreu um tipo específico de
evento de confirmação. O nível de log refere-se às condições necessárias para registrar uma entrada
de log, especificamente no que diz respeito a erros e depuração.
O software geralmente é configurável para registrar todos os eventos ou apenas erros, por exemplo.
Os logs em lote geralmente são gravados continuamente em um arquivo. As entradas de log individuais
podem ser gravadas em um sistema de mensagens como Kafka ou Pulsar para aplicativos em tempo
real.
Os logs de banco de dados são essenciais o suficiente para merecerem uma cobertura
mais detalhada. Os logs de gravação antecipada — normalmente, arquivos binários armazenados
em um formato específico nativo do banco de dados — desempenham um papel crucial nas
garantias e na capacidade de recuperação do banco de dados. O servidor de banco de dados recebe
solicitações de gravação e atualização em uma tabela de banco de dados (consulte a Figura 5-3),
armazenando cada operação no log antes de confirmar a solicitação. A confirmação vem com uma
garantia associada ao log: mesmo que o servidor falhe, ele pode recuperar seu estado na
reinicialização completando o trabalho inacabado dos logs.
Os logs de banco de dados são extremamente úteis na engenharia de dados, especialmente para o
CDC gerar fluxos de eventos a partir de alterações no banco de dados.
CRUD
Machine Translated by Google
CRUD, que significa criar, ler, atualizar e excluir, é um padrão transacional comumente usado
em programação e representa as quatro operações básicas de armazenamento persistente.
CRUD é o padrão mais comum para armazenar o estado do aplicativo em um banco de dados.
Um princípio básico do CRUD é que os dados devem ser criados antes de serem usados. Após
a criação dos dados, os dados podem ser lidos e atualizados. Finalmente, os dados podem
precisar ser destruídos. O CRUD garante que essas quatro operações ocorrerão nos dados,
independentemente de seu armazenamento.
Somente inserção
O padrão somente inserção retém o histórico diretamente em uma tabela que contém dados.
Em vez de atualizar registros, novos registros são inseridos com um carimbo de data/hora
indicando quando foram criados (Tabela 5-1). Por exemplo, suponha que você tenha uma
tabela de endereços de clientes. Seguindo um padrão CRUD, você simplesmente atualizaria o
registro se o cliente mudasse de endereço. Com o padrão somente inserção, um novo registro
de endereço é inserido com o mesmo ID do cliente. Para ler o endereço do cliente atual por ID
de cliente, você deve procurar o registro mais recente sob esse ID.
Machine Translated by Google
c
e
s
m
você
eu
t
eu
pl
e
v
e
r
s
eu
o
n
s
o
f
uma
r
e
c
o
r
d
1 40 2021-09-19T00:10:23+00:00
1 51 2021-09-30T00:12:00+00:00
Machine Translated by Google
Insert-only tem algumas desvantagens. Primeiro, as tabelas podem ficar muito grandes,
especialmente se os dados forem alterados com frequência, pois cada alteração é inserida na
tabela. Às vezes, os registros são limpos com base em uma data de expiração de registro ou em
um número máximo de versões de registro para manter o tamanho da tabela razoável. A segunda
desvantagem é que as pesquisas de registro incorrem em sobrecarga extra porque pesquisar o
estado atual envolve a execução de MAX(created_timestamp). Se centenas ou milhares de
registros estiverem em um único ID, essa operação de pesquisa será cara para ser executada.
Mensagens e fluxos
Relacionados à arquitetura orientada a eventos, dois termos que você verá frequentemente
usados de forma intercambiável são fila de mensagens e plataforma de streaming, mas existe
uma diferença sutil, mas essencial, entre os dois. Vale a pena definir e contrastar esses termos,
pois eles abrangem muitas grandes ideias relacionadas a sistemas e práticas de origem e
tecnologias que abrangem todo o ciclo de vida da engenharia de dados.
Por outro lado, um fluxo é um log somente de acréscimo de registros de eventos. (Os
fluxos são ingeridos e armazenados em plataformas de fluxo de eventos, que
discutiremos mais detalhadamente em “Mensagens e fluxos”.) À medida que os eventos
ocorrem, eles são acumulados em uma sequência ordenada (Figura 5-5); um carimbo de
data/hora ou um ID pode ordenar eventos. (Observe que os eventos nem sempre são
entregues na ordem exata devido às sutilezas dos sistemas distribuídos.)
Você usará streams quando se preocupar com o que aconteceu em muitos eventos.
Devido à natureza somente anexada dos fluxos, os registros em um fluxo são
persistidos por uma longa janela de retenção, geralmente semanas ou meses, permitindo
Machine Translated by Google
Vale a pena notar que os sistemas que processam fluxos podem processar mensagens, e
as plataformas de fluxo são frequentemente usadas para passagem de mensagens. Muitas
vezes acumulamos mensagens em fluxos quando queremos realizar análises de mensagens.
Em nosso exemplo de IoT, as leituras de temperatura que acionam o forno para ligar ou
desligar também podem ser analisadas posteriormente para determinar tendências e
estatísticas de temperatura.
Tipos de tempo
Embora o tempo seja uma consideração essencial para toda a ingestão de dados, ele se
torna muito mais crítico e sutil no contexto de streaming, onde vemos os dados como
contínuos e esperamos consumi-los logo após serem produzidos. Vejamos os principais
tipos de tempo que você terá ao ingerir dados: o tempo em que o evento é gerado, quando é
ingerido e processado e quanto tempo o processamento levou (Figura 5-6).
Depois que os dados são criados, eles são ingeridos em algum lugar. O tempo de ingestão
indica quando um evento é ingerido dos sistemas de origem em uma fila de mensagens, cache,
memória, armazenamento de objetos, banco de dados ou qualquer outro local em que os dados
estejam armazenados (consulte o Capítulo 6). Após a ingestão, os dados podem ser processados
imediatamente; ou em minutos, horas ou dias; ou simplesmente persistir no armazenamento indefinidamente.
O tempo de processo ocorre após o tempo de ingestão, quando os dados são processados
(normalmente, uma transformação). O tempo de processamento é quanto tempo os dados levaram
para processar, medido em segundos, minutos, horas, etc.
Você vai querer gravar essas várias vezes, de preferência de forma automatizada.
Configure o monitoramento ao longo de seus fluxos de trabalho de dados para capturar quando os
eventos ocorrem, quando são ingeridos e processados e quanto tempo levou para processar os eventos.
Bancos de dados
Nesta seção, veremos tecnologias comuns de banco de dados do sistema de origem que você
encontrará como engenheiro de dados e considerações de alto nível para trabalhar com esses
sistemas. Existem tantos tipos de bancos de dados quanto casos de uso para dados.
Aqui, apresentamos as principais ideias que ocorrem em uma variedade de tecnologias de banco de dados,
incluindo aquelas que suportam aplicativos de software e aquelas que suportam casos de uso de análise:
Um sistema de banco de dados usado para armazenar e servir dados. Abreviado como DBMS, consiste em
Pesquisas
Como o banco de dados encontra e recupera dados? Os índices podem ajudar a acelerar
pesquisas, mas nem todos os bancos de dados têm índices. Saiba se o seu
banco de dados usa índices; em caso afirmativo, quais são os melhores padrões para projetá-los e mantê-los?
Otimizador de consultas
Dimensionamento e distribuição
O banco de dados é dimensionado com a demanda? Qual estratégia de dimensionamento ele implanta?
Padrões de modelagem
Quais padrões de modelagem funcionam melhor com o banco de dados (por exemplo, dados
modelagem.)
Machine Translated by Google
CRUD
Consistência
modos de consistência para leituras e gravações (por exemplo, leituras fortemente consistentes)?
Os dados são armazenados em uma tabela de relações (linhas), e cada relação contém vários
campos (colunas); consulte a Figura 5-7. Observe que usamos os termos coluna e campo
de forma intercambiável ao longo deste livro. Cada relação na tabela tem o mesmo esquema (uma
sequência de colunas com tipos estáticos atribuídos, como string, integer ou float). As linhas
geralmente são armazenadas como uma sequência contígua de bytes no disco.
Machine Translated by Google
As tabelas são indexadas por uma chave primária, um campo exclusivo para cada linha da tabela.
A estratégia de indexação para a chave primária está intimamente ligada ao layout da tabela no disco.
As tabelas também podem ter várias chaves estrangeiras — campos com valores conectados aos
valores das chaves primárias em outras tabelas, facilitando junções e permitindo esquemas
complexos que distribuem dados por várias tabelas. Em particular, é possível projetar um esquema
normalizado. A normalização é uma estratégia para garantir que os dados nos registros não sejam
duplicados em vários locais, evitando assim a necessidade de atualizar estados em vários locais ao
mesmo tempo e evitando inconsistências (consulte o Capítulo 8).
Uma discussão completa da teoria, história e tecnologia do RDBMS está além do escopo deste
livro. Incentivamos você a estudar sistemas RDBMS, álgebra relacional e estratégias para
normalização porque eles são difundidos e você os encontrará com frequência. Consulte “Recursos
Adicionais” para livros sugeridos.
Embora os bancos de dados relacionais sejam ótimos para muitos casos de uso, eles não são uma
solução de tamanho único. Muitas vezes vemos que as pessoas começam com um relacionamento
Machine Translated by Google
Um grande tema deste livro é que a inovação de dados é constante. Vamos dar uma olhada
rápida na história do NoSQL, pois é útil obter uma perspectiva sobre por que e como as
inovações de dados afetam seu trabalho como engenheiro de dados. No início dos anos 2000,
empresas de tecnologia como Google e Amazon começaram a superar seus bancos de dados
relacionais e foram pioneiras em novos bancos de dados não relacionais distribuídos para
dimensionar suas plataformas da web.
Enquanto o termo NoSQL apareceu pela primeira vez em 1998, a versão moderna foi
1
cunhada por Eric Evans na década de 2000. Ele conta a história em um post de blog de 2009:
Meu arrependimento, no entanto, não é sobre o que o nome diz; é sobre o que não
faz. Quando Johan originalmente teve a ideia para o primeiro encontro, ele parecia
estar pensando em Big Data e sistemas distribuídos linearmente escaláveis, mas o
nome é tão vago que abriu a porta para falar sobre envios para literalmente qualquer
coisa que armazenasse dados e não fosse um RDBMS.
Machine Translated by Google
O NoSQL permanece vago em 2022, mas tem sido amplamente adotado para descrever um universo
de bancos de dados da “nova escola”, alternativas aos bancos de dados relacionais.
Existem vários tipos de banco de dados NoSQL projetados para quase todos os casos de uso
imagináveis. Como há muitos bancos de dados NoSQL para cobrir exaustivamente nesta seção,
consideramos os seguintes tipos de banco de dados: valor-chave, documento, coluna larga, gráfico,
pesquisa e série temporal.
Esses bancos de dados são muito populares e desfrutam de ampla adoção. Um engenheiro de
dados deve entender esses tipos de bancos de dados, incluindo considerações de uso, a estrutura
dos dados que eles armazenam e como aproveitar cada um no ciclo de vida da engenharia de dados.
Armazenamentos de valores-chave
Um banco de dados de valor-chave é um banco de dados não relacional que recupera registros
usando uma chave que identifica exclusivamente cada registro. Isso é semelhante ao mapa de hash ou
às estruturas de dados de dicionário apresentadas em muitas linguagens de programação, mas
potencialmente mais escaláveis. Os armazenamentos de valores-chave abrangem vários tipos de banco
de dados NoSQL—por exemplo, armazenamentos de documentos e bancos de dados de colunas largas
(discutidos a seguir).
Armazenamentos de documentos
Nesse contexto, um documento é um objeto aninhado; geralmente podemos pensar em cada documento como um objeto JSON
para fins práticos. Os documentos são armazenados em coleções e recuperados por chave. Uma coleção é aproximadamente
e
n
t
t
e
r
m
eu
n
o
eu
o
g
y
Mesa Coleção
Em muitos casos, os mesmos dados devem ser armazenados em vários documentos espalhados
por várias coleções; engenheiros de software devem ter o cuidado de atualizar uma propriedade em
todos os lugares em que ela está armazenada. (Muitos armazenamentos de documentos suportam
uma noção de transações para facilitar isso.)
isso permite que o esquema seja altamente flexível e expressivo. O esquema também pode evoluir à
medida que um aplicativo cresce. Por outro lado, vimos bancos de dados de documentos se tornarem
pesadelos absolutos para gerenciar e consultar. Se os desenvolvedores não forem cuidadosos ao
gerenciar a evolução do esquema, os dados podem se tornar inconsistentes e inchados ao longo do
tempo. A evolução do esquema também pode interromper a ingestão de downstream e causar dores
de cabeça para engenheiros de dados se não for comunicada em tempo hábil (antes da implantação).
Veja a seguir um exemplo de dados armazenados em uma coleção chamada users. A chave de
coleta é o id. Também temos um nome (junto com primeiro e último como elementos filhos) e uma
matriz das bandas favoritas da pessoa em cada documento:
usuários:
[ { id:
1234
nome:
primeiro: "Joe"
último: "Reis"
{ ID: 1235
nome:
primeiro: "Matt" último:
"Housley" favorite_bands:
["Dave Matthews Band", "Creed",
"Nickelback"]
}
]
Para consultar os dados neste exemplo, você pode recuperar registros por chave. Observe que a
maioria dos bancos de dados de documentos também suporta a criação de índices e tabelas de
pesquisa para permitir a recuperação de documentos por propriedades específicas. Isso geralmente é
inestimável no desenvolvimento de aplicativos quando você precisa pesquisar documentos de várias
maneiras. Por exemplo, você pode definir um índice no nome.
Outro detalhe técnico crítico para engenheiros de dados é que os armazenamentos de documentos
geralmente não são compatíveis com ACID, ao contrário dos bancos de dados relacionais. Técnico
Machine Translated by Google
etc. Por exemplo, muitos armazenamentos de documentos acabam sendo consistentes. Permitir a distribuição
de dados em um cluster é um benefício para dimensionamento e desempenho, mas pode levar a catástrofes
uma verificação completa para extrair todos os dados de uma coleção ou empregar uma estratégia de CDC para
enviar eventos a um fluxo de destino. A abordagem de varredura completa pode ter implicações de desempenho e
custo. A verificação geralmente diminui a velocidade do banco de dados enquanto ele é executado, e muitas ofertas
de nuvem sem servidor cobram uma taxa significativa por cada verificação completa.
Em bancos de dados de documentos, geralmente é útil criar um índice para ajudar a acelerar as consultas.
Coluna larga
Um banco de dados de colunas amplas é otimizado para armazenar grandes quantidades de dados com altas
taxas de transação e latência extremamente baixa. Esses bancos de dados podem ser dimensionados para taxas
de gravação extremamente altas e grandes quantidades de dados. Especificamente, bancos de dados de coluna
larga podem suportar petabytes de dados, milhões de solicitações por segundo e latência abaixo de 10 ms. Essas
características tornaram os bancos de dados de colunas amplas populares em aplicativos de comércio eletrônico,
fintech, ad tech, IoT e personalização em tempo real. Os engenheiros de dados devem estar cientes das
características operacionais dos bancos de dados de colunas amplas com os quais trabalham para definir uma
configuração adequada, projetar o esquema e escolher uma chave de linha apropriada para otimizar o
Esses bancos de dados suportam verificações rápidas de grandes quantidades de dados, mas não suportam
consultas complexas. Eles têm apenas um único índice (a chave de linha) para pesquisas. Os engenheiros de
dados geralmente devem extrair dados e enviá-los a um sistema de análise secundário para executar consultas
complexas para lidar com essas limitações. Isso pode ser feito executando grandes varreduras para a extração ou
Os bancos de dados gráficos armazenam dados explicitamente com uma estrutura gráfica
3
matemática (como um conjunto de nós e arestas). O Neo4j provou ser extremamente popular,
enquanto Amazon, Oracle e outros fornecedores oferecem seus produtos de banco de dados gráfico.
Grosso modo, os bancos de dados de gráficos são uma boa opção quando você deseja analisar a
conectividade entre os elementos.
Por exemplo, você pode usar um banco de dados de documentos para armazenar um documento
para cada usuário descrevendo suas propriedades. Você pode adicionar um elemento de matriz para
conexões que contenham IDs de usuários conectados diretamente em um contexto de mídia social.
É muito fácil determinar o número de conexões diretas que um usuário possui, mas suponha que
você queira saber quantos usuários podem ser alcançados por meio de duas conexões diretas. Você
poderia responder a essa pergunta escrevendo um código complexo, mas cada consulta seria
executada lentamente e consumiria recursos significativos. O armazenamento de documentos
simplesmente não é otimizado para isso
caso de uso.
Os bancos de dados gráficos são projetados exatamente para esse tipo de consulta. Suas
estruturas de dados permitem consultas baseadas na conectividade entre os elementos; bancos
de dados de grafos são indicados quando nos preocupamos em entender travessias complexas
entre elementos. Na linguagem dos gráficos, armazenamos nós (usuários no exemplo anterior) e
arestas (conexões entre usuários).
Os bancos de dados de gráfico suportam modelos de dados avançados para nós e arestas.
Dependendo do mecanismo de banco de dados gráfico subjacente, os bancos de dados gráficos
utilizam linguagens de consulta especializadas, como SPARQL, Resource Description Framework
(RDF), Graph Query Language (GQL) e Cypher.
Como exemplo de gráfico, considere uma rede de quatro usuários. O usuário 1 segue o usuário 2,
que segue o usuário 3 e o usuário 4; O usuário 3 também segue o usuário 4 (Figura 5-8).
Machine Translated by Google
Prevemos que os aplicativos de banco de dados gráfico crescerão dramaticamente fora das empresas de
4
tecnologia; análises de mercado também preveem um crescimento rápido. É claro que os bancos de dados
gráficos são benéficos do ponto de vista operacional e suportam os tipos de relacionamentos sociais complexos
críticos para os aplicativos modernos. As estruturas gráficas também são fascinantes do ponto de vista da ciência
de dados e ML, potencialmente revelando insights profundos sobre as interações e o comportamento humano.
Isso apresenta desafios exclusivos para engenheiros de dados que podem estar mais acostumados a lidar
com relações estruturadas, documentos ou dados não estruturados. Os engenheiros devem escolher se devem
fazer o seguinte:
existentes
Os dados do gráfico podem ser recodificados em linhas em um banco de dados relacional, o que pode ser uma
solução adequada dependendo do caso de uso de análise. Os bancos de dados de gráficos transacionais também
são projetados para análises, embora consultas grandes possam sobrecarregar os sistemas de produção. Os
bancos de dados de gráficos baseados em nuvem contemporâneos oferecem suporte a análises de gráficos de
Procurar
Um banco de dados de pesquisa é um banco de dados não relacional usado para pesquisar as características
existem casos de uso proeminentes para um banco de dados de pesquisa: pesquisa de texto e
A pesquisa de texto envolve pesquisar um corpo de texto por palavras-chave ou frases, correspondendo
para detecção de anomalias, monitoramento em tempo real, análise de segurança e análise operacional. As
Dependendo do tipo de empresa em que você trabalha, você pode usar bancos de dados de pesquisa
regularmente ou não. Independentemente disso, é bom estar ciente de que eles existem, caso você os
encontre na natureza. Os bancos de dados de pesquisa são populares para pesquisa e recuperação rápidas
e podem ser encontrados em vários aplicativos; um site de comércio eletrônico pode impulsionar sua
pesquisa de produtos usando um banco de dados de pesquisa. Como engenheiro de dados, pode-se
esperar que você traga dados de um banco de dados de pesquisa (como Elasticsearch, Apache Solr ou
Série temporal
Uma série temporal é uma série de valores organizados por tempo. Por exemplo, os preços das ações
podem se mover à medida que os negócios são executados ao longo do dia, ou um sensor climático mede
esporadicamente—são dados de série temporal. Um banco de dados de séries temporais é otimizado para
Embora os dados de séries temporais, como pedidos, remessas, logs e assim por diante, tenham sido
armazenados em bancos de dados relacionais por muito tempo, esses tamanhos e volumes de dados
geralmente eram pequenos. À medida que os dados cresciam cada vez mais rápido, novos bancos de
dados para fins especiais eram necessários. Os bancos de dados de série temporal atendem às
necessidades de volumes de dados crescentes e de alta velocidade de IoT, logs de eventos e aplicativos,
tecnologia de anúncios e fintech, entre muitos outros casos de uso. Muitas vezes, essas cargas de trabalho
são pesadas de gravação. Como resultado, os bancos de dados de séries temporais geralmente utilizam
Devemos distinguir entre dados de medição e baseados em eventos, comuns em bancos de dados
como sensores de temperatura ou de qualidade do ar. Os dados baseados em eventos são irregulares
e criados sempre que um evento ocorre, por exemplo, quando um sensor de movimento detecta
movimento.
O esquema para uma série temporal normalmente contém um carimbo de data/hora e um pequeno
conjunto de campos. Como os dados dependem do tempo, os dados são ordenados pelo carimbo de
data/hora. Isso torna os bancos de dados de séries temporais adequados para análises operacionais,
mas não ótimos para casos de uso de BI. As junções não são comuns, embora alguns bancos de dados
quase de séries temporais, como junções de suporte do Apache Druid. Muitos bancos de dados de
séries temporais estão disponíveis, tanto como opções de código aberto quanto pagas.
API
As APIs agora são uma maneira padrão e abrangente de troca de dados na nuvem, para
plataformas SaaS e entre sistemas internos da empresa. Muitos tipos de interfaces de API existem
na web, mas estamos principalmente interessados naquelas construídas em torno do HTTP, o tipo
mais popular na web e na nuvem.
DESCANSO
Falaremos primeiro sobre REST, atualmente o paradigma de API dominante. Conforme observado no
Capítulo 4, REST significa transferência de estado representacional. Esse conjunto de práticas e
filosofias para a construção de APIs web HTTP foi apresentado por Roy Fielding em 2000 em uma
dissertação de doutorado. REST é construído em torno de verbos HTTP, como GET e PUT; na prática,
o REST moderno usa apenas alguns dos mapeamentos verbais descritos na dissertação original.
Uma das principais ideias do REST é que as interações são stateless. Ao contrário de uma sessão de
terminal Linux, não há noção de uma sessão com variáveis de estado associadas, como um diretório
de trabalho; cada chamada REST é independente.
As chamadas REST podem alterar o estado do sistema, mas essas alterações são globais,
aplicando-se ao sistema completo e não a uma sessão atual.
5 REST
Os críticos apontam que REST não é de forma alguma uma especificação completa.
estipula propriedades básicas de interações, mas desenvolvedores que utilizam uma API
Machine Translated by Google
deve obter uma quantidade significativa de conhecimento de domínio para criar aplicativos ou
extrair dados de forma eficaz.
Vemos uma grande variação nos níveis de abstração da API. Em alguns casos, as APIs são
apenas um invólucro fino sobre os internos que fornecem a funcionalidade mínima necessária
para proteger o sistema das solicitações do usuário. Em outros exemplos, uma API de dados
REST é uma obra-prima de engenharia que prepara dados para aplicativos de análise e oferece
suporte a relatórios avançados.
Em segundo lugar, vários serviços e bibliotecas de código aberto surgiram para interagir com
APIs e gerenciar a sincronização de dados. Muitos fornecedores de SaaS e de código aberto
fornecem conectores prontos para uso para APIs comuns. As plataformas também simplificam
o processo de criação de conectores personalizados conforme necessário.
Existem várias APIs de dados sem bibliotecas de cliente ou suporte de conector pronto
para uso. Como enfatizamos ao longo do livro, os engenheiros fariam bem em reduzir o trabalho
pesado indiferenciado usando ferramentas prontas para uso.
No entanto, as tarefas de encanamento de baixo nível ainda consomem muitos
recursos. Em praticamente qualquer grande empresa, os engenheiros de dados
precisarão lidar com o problema de escrever e manter código personalizado para extrair
dados de APIs, o que requer entender a estrutura dos dados conforme fornecidos,
desenvolver código de extração de dados apropriado e determinar um dado adequado.
estratégia de sincronização.
GraphQL
O GraphQL foi criado no Facebook como uma linguagem de consulta para dados de aplicativos
e uma alternativa às APIs REST genéricas. Enquanto as APIs REST geralmente restringem
suas consultas a um modelo de dados específico, o GraphQL abre a possibilidade de recuperar
vários modelos de dados em uma única solicitação. este
Machine Translated by Google
permite consultas mais flexíveis e expressivas do que com REST. O GraphQL é construído em
torno de JSON e retorna dados em uma forma semelhante à consulta JSON.
Há uma espécie de guerra santa entre REST e GraphQL, com algumas equipes de engenharia
partidárias de um ou de outro e algumas usando ambos. Na realidade, os engenheiros encontrarão
ambos ao interagirem com os sistemas de origem.
Webhooks
O endpoint pode fazer várias coisas com os dados do evento POST, potencialmente acionando
um processo downstream ou armazenando os dados para uso futuro. Para fins de análise,
estamos interessados em coletar esses eventos. Os engenheiros geralmente usam filas de
mensagens para ingerir dados em alta velocidade e volume.
Falaremos sobre filas de mensagens e fluxos de eventos mais adiante neste capítulo.
RPC e gRPC
padrões técnicos específicos do REST, permitindo assim o uso de bibliotecas de cliente comuns e
permitindo que os engenheiros desenvolvam um conjunto de habilidades que se aplicará a qualquer
código de interação gRPC.
Compartilhamento de dados
O conceito central de compartilhamento de dados em nuvem é que um sistema multilocatário oferece suporte
a políticas de segurança para compartilhamento de dados entre locatários. Concretamente, qualquer sistema
de armazenamento de objetos em nuvem pública com um sistema de permissão refinado pode ser uma
plataforma para compartilhamento de dados. Plataformas populares de armazenamento de dados em nuvem
também suportam recursos de compartilhamento de dados. É claro que os dados também podem ser
compartilhados por meio de download ou troca por e-mail, mas um sistema multilocatário torna o processo
muito mais fácil.
O compartilhamento de dados também pode simplificar os pipelines de dados dentro de uma organização.
O compartilhamento de dados permite que as unidades de uma organização gerenciem seus dados e os
compartilhem seletivamente com outras unidades, enquanto ainda permite que unidades individuais
gerenciem seus custos de computação e consulta separadamente, facilitando a descentralização de dados.
Isso facilita padrões de gerenciamento de dados descentralizados, como malha de dados.
6
Compartilhamento de dados e malha de dados estão alinhados com nossa filosofia de componentes de
arquitetura comuns. Escolha componentes comuns (Capítulo 3) que permitam o intercâmbio simples e
eficiente de dados e conhecimentos, em vez de adotar a tecnologia mais empolgante e sofisticada.
A consumerização da tecnologia significa que toda empresa é essencialmente agora uma empresa de
tecnologia. A consequência é que essas empresas - e
Machine Translated by Google
cada vez mais agências governamentais—querem disponibilizar seus dados para seus clientes
e usuários, seja como parte de seu serviço ou como uma assinatura separada. Por exemplo,
o Bureau of Labor Statistics dos Estados Unidos publica várias estatísticas sobre o mercado
de trabalho dos EUA. A Administração Nacional de Aeronáutica e Espaço (NASA) publica
vários dados de suas iniciativas de pesquisa. O Facebook compartilha dados com empresas que
anunciam em sua plataforma.
Por que as empresas querem disponibilizar seus dados? Os dados são fixos e um flywheel é
criado permitindo que os usuários integrem e estendam seu aplicativo no aplicativo de um
usuário. Maior adoção e uso do usuário significa mais dados, o que significa que os usuários podem
integrar mais dados em seus aplicativos e sistemas de dados. O efeito colateral é que agora
existem fontes quase infinitas de dados de terceiros.
O acesso direto a dados de terceiros geralmente é feito por meio de APIs, por meio de
compartilhamento de dados em uma plataforma de nuvem ou por meio de download de dados.
As APIs geralmente fornecem recursos de integração profunda, permitindo que os clientes
extraiam e enviem dados. Por exemplo, muitos CRMs oferecem APIs que seus usuários podem
integrar em seus sistemas e aplicativos. Vemos um fluxo de trabalho comum para obter dados de
um CRM, combinar os dados do CRM por meio do modelo de pontuação do cliente e, em seguida,
usar o ETL reverso para enviar esses dados de volta ao CRM para que os vendedores entrem em
contato com leads mais qualificados.
Observe que o streaming de dados (neste caso, mensagens e streams) atravessa muitos
estágios do ciclo de vida da engenharia de dados. Ao contrário de um RDBMS, que geralmente
é conectado diretamente a um aplicativo, as linhas de dados de streaming às vezes são menos
nítidas. Esses sistemas são usados como sistemas de origem, mas geralmente atravessam o
ciclo de vida da engenharia de dados devido à sua natureza transitória. Por exemplo, você
pode usar uma plataforma de fluxo de eventos para transmissão de mensagens em um
aplicativo orientado a eventos, um sistema de origem. A mesma plataforma de streaming de
eventos pode ser usada no estágio de ingestão e transformação para processar dados para
análises em tempo real.
Filas de mensagens
Uma fila de mensagens é um mecanismo para enviar dados de forma assíncrona (geralmente
como pequenas mensagens individuais, nos kilobytes) entre sistemas discretos usando um
modelo de publicação e assinatura. Os dados são publicados em uma fila de mensagens e
entregues a um ou mais assinantes (Figura 5-9). O assinante confirma o recebimento da
mensagem, removendo-a da fila.
As filas de mensagens permitem que aplicativos e sistemas sejam desacoplados uns dos
outros e são amplamente utilizadas em arquiteturas de microsserviços. A fila de mensagens
armazena mensagens em buffer para lidar com picos de carga transitórios e torna as mensagens
duráveis por meio de uma arquitetura distribuída com replicação.
Machine Translated by Google
Por exemplo, filas padrão do Amazon SQS fazer o melhor esforço para preservar a ordem
das mensagens. O SQS também oferece filas FIFO, que oferecem garantias muito mais fortes
ao custo de despesas gerais extras.
Em geral, não assuma que suas mensagens serão entregues em ordem, a menos que
sua tecnologia de fila de mensagens garanta isso. Normalmente, você precisa projetar para
entrega de mensagens fora de ordem.
Frequência de entrega
As mensagens podem ser enviadas exatamente uma vez ou pelo menos uma vez. Se
uma mensagem for enviada exatamente uma vez, depois que o assinante reconhecer
a mensagem, a mensagem desaparecerá e não será entregue novamente. As mensagens
enviadas pelo menos uma vez podem ser consumidas por vários assinantes ou pelo
mesmo assinante mais de uma vez. Isso é ótimo quando duplicações ou redundância não importam.
Escalabilidade
De certa forma, uma plataforma de fluxo de eventos é uma continuação de uma fila de
mensagens em que as mensagens são passadas de produtores para consumidores. Conforme
discutido anteriormente neste capítulo, a grande diferença entre mensagens e fluxos é que uma
fila de mensagens é usada principalmente para rotear mensagens com certas garantias de
entrega. Em contraste, uma plataforma de streaming de eventos é usada para ingerir e processar
dados em um log ordenado de registros. Em uma plataforma de streaming de eventos, os dados
são retidos por um tempo e é possível reproduzir mensagens de um momento anterior.
Tópicos
Usando o exemplo de evento anterior, um tópico pode ser pedidos da web. Além disso,
vamos enviar este tópico para alguns consumidores, como atendimento e marketing.
Este é um excelente exemplo de linhas borradas entre análise e um sistema orientado
a eventos. O assinante de atendimento usará eventos para acionar um processo de
atendimento, enquanto o marketing executa análises em tempo real para ajustar as
campanhas de marketing (Figura 5-10).
Partições de fluxo
As partições de fluxo são subdivisões de um fluxo em vários fluxos. Uma boa analogia
é uma rodovia de várias faixas. Ter várias pistas permite paralelismo e maior taxa de
transferência. As mensagens são distribuídas entre partições por chave de partição. As
mensagens com a mesma chave de partição sempre terminarão na mesma partição.
Defina uma chave de partição para que as mensagens que devem ser processadas juntas
tenham a mesma chave de partição. Por exemplo, é comum nas configurações de IoT querer
enviar todas as mensagens de um determinado dispositivo para o mesmo servidor de processamento.
Podemos conseguir isso usando um ID de dispositivo como chave de partição e, em
seguida, configurando um servidor para consumir de cada partição.
Uma preocupação importante com o particionamento de fluxo é garantir que sua chave de
partição não gere pontos de acesso—um número desproporcional de mensagens entregues
a uma partição. Por exemplo, se cada dispositivo IoT estiver localizado em um determinado
estado dos EUA, podemos usar o estado como a chave de partição. Dada uma distribuição de
dispositivos proporcional à população do estado, as partições contendo Califórnia, Texas,
Flórida e Nova York podem ficar sobrecarregadas, com outras partições relativamente
subutilizadas. Certifique-se de que sua chave de partição distribuirá mensagens uniformemente
pelas partições.
Ao acessar os sistemas de origem, é essencial entender as pessoas com quem você trabalhará.
Em nossa experiência, a boa diplomacia e os relacionamentos com as partes interessadas dos
sistemas de origem são uma parte subestimada e crucial da engenharia de dados bem-sucedida.
Quem são esses interessados? Normalmente, você lidará com duas categorias de partes
interessadas: partes interessadas de sistemas e partes interessadas de dados (Figura 5-12).
Um stakeholder de sistemas constrói e mantém os sistemas de origem; estes podem ser
engenheiros de software, desenvolvedores de aplicativos e terceiros. As partes interessadas
de dados possuem e controlam o acesso aos dados que você deseja, geralmente manipulados
pela TI, um grupo de governança de dados ou terceiros. As partes interessadas em sistemas
e dados geralmente são pessoas ou equipes diferentes; às vezes, eles são os mesmos.
Muitas vezes, você fica à mercê da capacidade da parte interessada de seguir as práticas
corretas de engenharia de software, gerenciamento de banco de dados e desenvolvimento.
Idealmente, as partes interessadas estão fazendo DevOps e trabalhando de maneira ágil.
Sugerimos a criação de um ciclo de feedback entre engenheiros de dados e partes
interessadas dos sistemas de origem para conscientizar sobre como os dados são
consumidos e usados. Essa é uma das áreas mais negligenciadas em que os engenheiros de
dados podem obter muito valor. Quando algo acontece com os dados de origem upstream - e
algo vai acontecer, seja um esquema ou alteração de dados, um servidor ou banco de dados com
falha ou outros eventos importantes - você quer ter certeza de que está ciente do impacto que
esses problemas causarão tem em seus sistemas de engenharia de dados.
Machine Translated by Google
Pode ser útil ter um contrato de dados com os proprietários do sistema de origem
upstream. O que é um contrato de dados? James Denmore oferece esta definição:
Além disso, considere estabelecer um SLA com provedores upstream. Um SLA fornece
expectativas do que você pode esperar dos sistemas de origem nos quais você confia. Um
exemplo de SLA pode ser “os dados dos sistemas de origem estarão disponíveis de forma
confiável e de alta qualidade”. Um objetivo de nível de serviço (SLO) mede o desempenho
em relação ao que você concordou no SLA. Por exemplo, dado seu exemplo de SLA, um
SLO pode ser “os sistemas de origem terão 99% de tempo de atividade”. Se um contrato
de dados ou SLA/SLO parecer muito formal, pelo menos defina verbalmente as expectativas
para garantias do sistema de origem para tempo de atividade, qualidade dos dados e
qualquer outra coisa importante para você. Os proprietários upstream de sistemas de
origem precisam entender seus requisitos para que possam fornecer os dados de que você
precisa.
Engenharia. O engenheiro de dados deve obter o máximo de suporte upstream possível para garantir
que as subcorrentes sejam aplicadas quando os dados forem gerados nos sistemas de origem. Isso fará
com que o restante das etapas do ciclo de vida da engenharia de dados prossiga com muito mais facilidade.
Segurança
A segurança é fundamental, e a última coisa que você deseja é criar acidentalmente um ponto de
vulnerabilidade em um sistema de origem. Aqui estão algumas áreas a serem consideradas:
O sistema de origem é arquitetado para que os dados sejam seguros e criptografados, tanto com
os dados em repouso quanto enquanto os dados são transmitidos?
Você precisa acessar o sistema de origem pela Internet pública ou está usando uma rede virtual
privada (VPN)?
Mantenha senhas, tokens e credenciais para o sistema de origem bloqueados com segurança. Por
exemplo, se você estiver usando chaves Secure Shell (SSH), use um gerenciador de chaves para
proteger suas chaves; a mesma regra se aplica a senhas — use um gerenciador de senhas ou um
provedor de logon único (SSO).
Você confia no sistema de origem? Sempre certifique-se de confiar, mas verifique se o sistema de
origem é legítimo. Você não quer receber dados de um agente mal-intencionado.
Gestão de dados
O gerenciamento de dados de sistemas de origem é um desafio para engenheiros de dados. Na maioria
dos casos, você terá apenas controle periférico — se houver algum controle — sobre os sistemas de
origem e os dados que eles produzem. Na medida do possível, você deve entender a maneira como os
dados são gerenciados nos sistemas de origem, pois isso influenciará diretamente em como você ingere,
armazena e transforma os dados.
Gestão de dados
Trabalhar com equipes de sistema de origem para definir expectativas sobre dados e
comunicação.
Esquema
Espere que os esquemas upstream sejam alterados. Sempre que possível, colabore
com as equipes do sistema de origem para serem notificadas sobre mudanças iminentes no esquema.
Privacidade e ética
são as implicações dos dados de origem? Quanto tempo fica retido? Ele muda de local com
Regulatório
DataOps
A excelência operacional — DevOps, DataOps, MLOps, XOps — deve se estender para cima e para
baixo em toda a pilha e dar suporte à engenharia de dados e ao ciclo de vida.
Machine Translated by Google
Como você está trabalhando com partes interessadas que controlam os sistemas de origem e os
dados que eles produzem, você precisa garantir que possa observar e monitorar o tempo de atividade e
o uso dos sistemas de origem e responder quando ocorrerem incidentes. Por exemplo, quando o banco
de dados do aplicativo do qual você depende para o CDC excede sua capacidade de E/S e precisa ser
redimensionado, como isso afetará sua capacidade de receber dados desse sistema? Você poderá
acessar os dados ou eles ficarão indisponíveis até que o banco de dados seja redimensionado? Como
isso afetará os relatórios? Em outro exemplo, se a equipe de engenharia de software estiver implantando
continuamente, uma alteração de código pode causar falhas inesperadas no próprio aplicativo. Como a
falha afetará sua capacidade de acessar os bancos de dados que alimentam o aplicativo? Os dados
estarão atualizados?
Configure uma cadeia de comunicação clara entre a engenharia de dados e as equipes que dão suporte
aos sistemas de origem. Idealmente, essas equipes de partes interessadas incorporaram o DevOps em
seu fluxo de trabalho e cultura. Isso ajudará bastante a atingir os objetivos do DataOps (um irmão do
DevOps), para resolver e reduzir erros rapidamente. Como mencionamos anteriormente, os engenheiros
de dados precisam se integrar às práticas de DevOps das partes interessadas e vice-versa. O DataOps
bem-sucedido funciona quando todas as pessoas estão envolvidas e se concentram em fazer os sistemas
funcionarem de forma holística.
Automação
você configurou para seus fluxos de trabalho de dados. Faz um problema na fonte
afirmativo, considere desacoplar esses sistemas para que eles possam realizar a automação
de forma independente.
Observabilidade
Machine Translated by Google
Como você saberá quando houver um problema com um sistema de origem, como uma interrupção
uptime (ou use o monitoramento criado pela equipe que possui a fonte
sistema). Configure verificações para garantir que os dados do sistema de origem estejam
em conformidade com as expectativas de uso downstream. Por exemplo, os dados são de boa
Resposta a incidentes
Qual é o seu plano se algo ruim acontecer? Por exemplo, como será
seu pipeline de dados se comporta se um sistema de origem ficar offline? Qual é o seu
planeja preencher os dados “perdidos” assim que o sistema de origem estiver on-line novamente?
Arquitetura de dados
Aqui estão algumas coisas a serem consideradas em relação às arquiteturas do sistema de origem:
Confiabilidade
esperado. Bugs são introduzidos e falhas aleatórias acontecem. O sistema produz saídas
esperamos que o sistema falhe? Qual é o tempo médio de reparo para que o sistema volte
Durabilidade
Tudo falha. Um servidor pode morrer, a zona ou região de uma nuvem pode ficar offline ou
de rede? Qual é o plano para lidar com interrupções por um longo período e limitar o raio
Disponibilidade
Pessoas
Quem é responsável pelo design do sistema de origem e como você saberá se foram feitas
esses sistemas são arquitetados de forma confiável. Crie um SLA com a equipe do
Orquestração
Aqui estão algumas coisas para pensar em relação à orquestração para sistemas
de origem:
Cadência e frequência
Estruturas comuns
com a equipe de aplicativos upstream? Não há uma resposta correta aqui, mas
rígido.
Engenharia de software
À medida que o cenário de dados muda para ferramentas que simplificam e automatizam o
acesso aos sistemas de origem, você provavelmente precisará escrever código. Aqui estão
algumas considerações ao escrever código para acessar um sistema de origem:
Rede
sistema de origem reside. Além disso, sempre pense em redes seguras. São
você está acessando um URL HTTPS pela internet pública, SSH ou uma VPN?
Autenticação e autorização
acessar o sistema de origem? Onde você armazenará essas credenciais para que elas
Machine Translated by Google
não aparecem em seu código ou controle de versão? Você tem as funções corretas do IAM
Padrões de acesso
Como você está acessando os dados? Você está usando uma API e como está lidando com
paginação? Se você estiver acessando dados por meio de um driver de banco de dados, o driver
compatível com o banco de dados que você está acessando? Para qualquer padrão de
Orquestração
Paralelização
Como você está gerenciando e dimensionando o acesso paralelo aos sistemas de origem?
Implantação
Conclusão
Os sistemas de origem e seus dados são vitais no ciclo de vida da engenharia de dados.
Os engenheiros de dados tendem a tratar os sistemas de origem como “problema de outra pessoa” –
faça isso por sua conta e risco! Os engenheiros de dados que abusam dos sistemas de origem podem
precisar procurar outro emprego quando a produção cair.
Se há um pau, há também uma cenoura. Uma melhor colaboração com as equipes do sistema
de origem pode levar a dados de maior qualidade, resultados mais bem-sucedidos e melhores
produtos de dados. Crie um fluxo bidirecional de comunicação com seus colegas nessas equipes;
configurar processos para notificar o esquema
Machine Translated by Google
e alterações de aplicativos que afetam análises e ML. Comunique suas necessidades de dados
de forma proativa para ajudar as equipes de aplicativos na engenharia de dados
processo.
Agora que você entende os tipos de sistemas de origem e os dados que eles geram,
veremos a seguir maneiras de armazenar esses dados.
Recursos adicionais
“O que, por que e quando do design de tabela única com o DynamoDB” por Alex De Brie
“Testar a qualidade dos dados em escala com o Deequ” por Dustin Lange et al.
1 Keith D. Foote, “A Brief History of Non-Relational Databases”, Dataversity, 19 de junho de 2018, https:// oreil.ly/ 5Ukg2.
2 Excelente série de Nemil Dalal sobre a história do MongoDB conta algumas histórias angustiantes de
abuso de banco de dados e suas consequências para startups incipientes.
3 Martin Kleppmann, Designing Data Intensive Applications (Sebastopol, CA: O'Reilly, 2017),
49, https:// oreil.ly/ v1NhG.
4 Aashish Mehra, “Graph Database Market Worth $ 5,1 Billion by 2026: Exclusive Report by MarketsandMarkets”, Cision
PR Newswire, 30 de julho de 2021, https:// oreil.ly/ mGVkY.
5 Para um exemplo, veja Michael S. Mikowski, “RESTful APIs: The Big Lie”, 10 de agosto de 2015, https:// oreil.ly/ rqja3.
6 Martin Fowler, “How to Move Beyond a Monolithic Data Lake to a Distributed Data Mesh,”
MartinFowler.com, 20 de maio de 2019, https:// oreil.ly/ TEdJF.
7 Leia a referência de bolso de pipelines de dados (O'Reilly) para obter mais informações sobre como um
contrato de dados deve ser escrito.
Machine Translated by Google
Capítulo 6. Armazenamento
Figura 6-1. O armazenamento desempenha um papel central no ciclo de vida da engenharia de dados
Figura 6-3. O movimento e a rotação da cabeça do disco magnético são essenciais na latência de acesso aleatório
A IBM desenvolveu a tecnologia de unidade de disco magnético na década de 1950. Desde então,
as capacidades dos discos magnéticos cresceram de forma constante. O primeiro drive de disco
magnético comercial, o IBM 350, tinha capacidade de 3,75 megabytes. No momento da redação deste
artigo, unidades magnéticas que armazenam 20 TB estão disponíveis comercialmente. Na verdade, os
discos magnéticos continuam a ter uma inovação rápida, com métodos como gravação magnética
assistida por calor (HAMR), gravação magnética shingled (SMR) e compartimentos de disco preenchidos
com hélio sendo usados para obter densidades de armazenamento cada vez maiores. Apesar das
melhorias contínuas na capacidade da unidade, outros aspectos do desempenho do HDD são
prejudicados pela física.
Primeiro, a velocidade de transferência do disco, a taxa na qual os dados podem ser lidos e
gravados, não é proporcional à capacidade do disco. A capacidade do disco é dimensionada com
densidade de área (gigabits armazenados por polegada quadrada), enquanto a velocidade de
transferência é dimensionada com densidade linear (bits por polegada). Isso significa que, se a
capacidade do disco aumentar por um fator de 4, a velocidade de transferência aumentará apenas por
um fator de 2. Consequentemente, as unidades de data center atuais suportam velocidades máximas de
transferência de dados de 200–-300 MB/s. Para enquadrar isso de outra maneira, são necessárias mais
de 20 horas para ler todo o conteúdo de uma unidade magnética de 30 TB, assumindo uma velocidade
de transferência de 300 MB/s.
Uma segunda limitação importante é o tempo de busca. Para acessar os dados, a unidade deve
realocar fisicamente as cabeças de leitura/gravação para a trilha apropriada no disco.
Terceiro, para encontrar um dado específico no disco, o controlador de disco deve esperar
que esses dados girem sob as cabeças de leitura/gravação. Isso leva à latência rotacional. Unidades
comerciais típicas girando a 7.200 rotações por minuto (RPM) tempo de busca e latência rotacional
levam a mais de quatro milissegundos de latência média geral (tempo para acessar um dado
selecionado). Uma quarta limitação são as operações de entrada/saída por segundo (IOPS), críticas
para bancos de dados transacionais. Uma unidade magnética varia de 50 a 500 IOPS.
Machine Translated by Google
Como mencionado anteriormente, os discos magnéticos ainda são valorizados em data centers por
seus baixos custos de armazenamento de dados. Além disso, os drives magnéticos podem
sustentar taxas de transferência extraordinariamente altas por meio do paralelismo. Essa é a ideia
crítica por trás do armazenamento de objetos em nuvem: os dados podem ser distribuídos em
milhares de discos em clusters. As taxas de transferência de dados aumentam drasticamente ao
ler vários discos simultaneamente, limitados principalmente pelo desempenho da rede em vez da
taxa de transferência do disco. Assim, componentes de rede e CPUs também são matérias-primas
essenciais em sistemas de armazenamento, e retornaremos a esses tópicos em breve.
As unidades de estado sólido (SSDs) armazenam dados como cargas em células de memória
flash. Os SSDs eliminam os componentes mecânicos das unidades magnéticas; os dados são
lidos por meios puramente eletrônicos. Os SSDs podem pesquisar dados aleatórios em menos de
0,1 ms (100 microssegundos). Além disso, os SSDs podem dimensionar as velocidades de
transferência de dados e IOPS dividindo o armazenamento em partições com vários controladores
de armazenamento executados em paralelo. Os SSDs comerciais podem suportar velocidades de
transferência de muitos gigabytes por segundo e dezenas de milhares de IOPS.
No entanto, os SSDs não são atualmente a opção padrão para armazenamento de dados analíticos
de alta escala. Novamente, isso se resume ao custo. SSDs comerciais normalmente custam de 20
a 30 centavos (USD) por gigabyte de capacidade, quase 10 vezes o custo por capacidade de uma
unidade magnética. Assim, o armazenamento de objetos em discos magnéticos surgiu como a
principal opção para armazenamento de dados em larga escala em data lakes e data warehouses
em nuvem.
Os SSDs ainda desempenham um papel significativo nos sistemas OLAP. Alguns bancos de dados
OLAP aproveitam o cache SSD para dar suporte a consultas de alto desempenho em dados
acessados com frequência. À medida que o OLAP de baixa latência se torna mais popular,
esperamos que o uso de SSD nesses sistemas siga o exemplo.
Armazena o código que as CPUs executam e os dados que esse código processa
diretamente.
É volátil, enquanto unidades magnéticas e SSDs são não voláteis. Embora possam
ocasionalmente falhar e corromper ou perder dados, as unidades geralmente retêm dados
quando desligadas. A RAM perde dados em menos de um segundo quando está
desenergizada.
É significativamente mais caro que o armazenamento SSD, por aproximadamente US$ 10/GB
(no momento da redação deste artigo).
Isso aumenta ainda mais a complexidade e o custo. Servidores de alta memória normalmente
utilizam muitas CPUs interconectadas em uma placa, cada uma com um bloco de RAM
conectado.
Ainda é significativamente mais lento que o cache da CPU, um tipo de memória localizada
diretamente na matriz da CPU ou no mesmo pacote. O cache armazena dados acessados com
frequência e recentemente para recuperação ultrarrápida durante o processamento. Os designs
de CPU incorporam várias camadas de cache de tamanho e características de desempenho
variadas.
Quando falamos de memória do sistema, quase sempre queremos dizer RAM dinâmica, uma
forma de memória de alta densidade e baixo custo. A RAM dinâmica armazena dados como cargas em
capacitores. Esses capacitores vazam com o tempo, portanto, os dados devem ser atualizados com
frequência (lidos e reescritos) para evitar a perda de dados. O controlador de memória de hardware lida
com esses detalhes técnicos; os engenheiros de dados simplesmente precisam se preocupar com as
características de largura de banda e latência de recuperação.
Outras formas de memória, como RAM estática, são usadas em aplicativos especializados,
como caches de CPU.
As CPUs atuais quase sempre empregam a arquitetura von Neumann, com código e dados
armazenados juntos no mesmo espaço de memória. No entanto, as CPUs normalmente também
suportam a opção de desabilitar a execução de código em páginas específicas de memória para maior
segurança. Esse recurso lembra a arquitetura Harvard, que separa código e dados.
A RAM é usada em vários sistemas de armazenamento e processamento e pode ser usada para
armazenamento em cache, processamento de dados ou índices. Vários bancos de dados tratam a RAM
como uma camada de armazenamento primária, permitindo um desempenho ultrarrápido de leitura e
gravação. Nessas aplicações, os engenheiros de dados devem sempre ter em mente a volatilidade da
RAM. Mesmo que os dados armazenados na memória sejam replicados em um cluster, uma queda de
energia que desative vários nós pode causar perda de dados. As arquiteturas destinadas a armazenar
dados de forma durável podem usar backups de bateria e despejar automaticamente todos os dados no
disco em caso de perda de energia.
Machine Translated by Google
Rede e CPU
Por que estamos mencionando a rede e a CPU como ingredientes brutos para armazenar
dados? Cada vez mais, os sistemas de armazenamento são distribuídos para melhorar o
desempenho, a durabilidade e a disponibilidade. Mencionamos especificamente que os discos
magnéticos individuais oferecem desempenho de transferência relativamente baixo, mas um
cluster de discos paraleliza as leituras para uma escala de desempenho significativa. Enquanto
os padrões de armazenamento, como arrays redundantes de discos independentes (RAID), são
paralelizados em um único servidor, os clusters de armazenamento de objetos em nuvem
operam em uma escala muito maior, com discos distribuídos em uma rede e até vários data
centers e zonas de disponibilidade.
Os engenheiros de dados precisam entender como a rede afetará os sistemas que eles
constroem e usam. Os engenheiros equilibram constantemente a durabilidade e a
disponibilidade alcançadas ao distribuir os dados geograficamente versus o desempenho e os
benefícios de custo de manter o armazenamento em uma pequena área geográfica e próximo
aos consumidores ou gravadores de dados. O Apêndice B abrange a rede em nuvem e as
principais ideias relevantes.
Serialização
codificar dados de maneira baseada em linhas como um arquivo XML, JSON ou CSV e passá-los para
outro usuário que pode decodificá-los usando uma biblioteca padrão. Um algoritmo de serialização possui
lógica para manipulação de tipos, impõe regras na estrutura de dados e permite a troca entre linguagens
de programação e CPUs. O algoritmo de serialização também possui regras para tratamento de exceções.
Por exemplo, objetos Python podem conter referências cíclicas; o algoritmo de serialização pode gerar um
erro ou limitar a profundidade de aninhamento ao encontrar um ciclo.
Compressão
A compactação é outro componente crítico da engenharia de armazenamento. Em um nível básico,
a compactação torna os dados menores, mas os algoritmos de compactação interagem com outros
detalhes dos sistemas de armazenamento de maneiras complexas.
compressão aumenta a velocidade de varredura prática por disco. Com uma taxa de
compactação de 10:1, passamos da varredura de 200 MB/s por disco magnético para uma taxa efetiva
de 2 GB/s por disco.
A terceira vantagem está no desempenho da rede. Considerando que uma conexão de rede
entre uma instância do Amazon EC2 e o S3 fornece 10 gigabits por segundo (Gbps) de largura de
banda, uma taxa de compactação de 10:1 aumenta a largura de banda de rede efetiva para 100 Gbps.
Cache
Já mencionamos o cache em nossa discussão sobre RAM. A ideia central do cache é armazenar dados
acessados com frequência ou recentemente em uma camada de acesso rápido. Quanto mais rápido o
cache, maior o custo e menos espaço de armazenamento disponível. Os dados acessados com menos
frequência são armazenados em um armazenamento mais barato e mais lento.
Os caches são críticos para o serviço, processamento e transformação de dados.
À medida que analisamos os sistemas de armazenamento, é útil colocar todos os tipos de armazenamento
que utilizamos dentro de uma hierarquia de cache (Tabela 6-1). A maioria dos sistemas de dados
práticos depende de muitas camadas de cache montadas a partir do armazenamento com características
de desempenho variadas. Isso começa dentro das CPUs; os processadores podem implantar até quatro
camadas de cache. Descemos na hierarquia para RAM e SSDs. O armazenamento de objetos em
nuvem é um nível inferior que oferece suporte à retenção e durabilidade de dados de longo prazo, ao
mesmo tempo em que permite a veiculação de dados e a movimentação dinâmica de dados em pipelines.
Machine Translated by Google
Tabela 6-1.Aheuris
ticcachehierarchyd
Machine Translated by Google
é aproximadamente
Machine Translated by Google
r
eu
c
eu
n
g
uma
n
d
p
e
r
f
o
r
m
uma
n
c
e
c
h
uma
r
uma
c
t
e
r
eu
s
ti
c
s
Machine Translated by Google
uma
Armazenamento de objetos 100 milissegundos 3 GB/s por instância US$ 0,02/GB por
mês
Armazenamento de arquivo 12 horas O mesmo que armazenamento de objetos quando os dados são US$ 0,004/GB por
acessível mês
geralmente usado para backups de dados e para atender à conformidade de retenção de dados
emergência (por exemplo, dados em um banco de dados podem ser perdidos e precisam ser recuperados,
ou uma empresa pode precisar consultar dados históricos para fins legais
descoberta).
Esta seção abrange os principais sistemas de armazenamento de dados que você encontrará como
ingredientes. Por exemplo, os discos magnéticos são um ingrediente bruto de armazenamento, enquanto
principais plataformas de armazenamento de objetos em nuvem e HDFS são sistemas de armazenamento que
utilizar discos magnéticos. Existem níveis ainda mais altos de abstração de armazenamento, como
Abstrações”).
Os engenheiros de dados devem sempre estar cientes dos paradigmas de consistência dos
sistemas distribuídos, que exploraremos a seguir.
Basicamente disponível
A consistência não é garantida, mas os esforços nas leituras e gravações do banco de dados
são feitos com base no melhor esforço, o que significa que dados consistentes estão disponíveis
Estado suave
Consistência eventual
Se a leitura de dados em um sistema eventualmente consistente não é confiável, por que usá-lo?
A consistência eventual é uma compensação comum em sistemas distribuídos de grande escala.
Se você deseja dimensionar horizontalmente (em vários nós) para processar dados em grandes volumes,
eventualmente, a consistência geralmente é o preço que você pagará. A consistência eventual permite que
você recupere dados rapidamente sem verificar se você tem a versão mais recente em todos os nós.
O oposto da consistência eventual é a consistência forte. Com consistência forte, o banco de dados
distribuído garante que as gravações em qualquer nó sejam distribuídas primeiro com um consenso e que
todas as leituras no banco de dados retornem valores consistentes. Você usará uma consistência forte
quando puder tolerar uma latência de consulta mais alta e exigir dados corretos toda vez que ler o banco de
dados.
leituras consistentes são mais lentas e consomem mais recursos, portanto, é melhor usá-las com moderação,
Você deve entender como seu banco de dados lida com a consistência. Novamente, os engenheiros de dados
têm a tarefa de entender profundamente a tecnologia e usá-la para resolver problemas de forma adequada. Um
engenheiro de dados pode precisar negociar requisitos de consistência com outras partes interessadas técnicas
e de negócios.
Observe que isso é um problema de tecnologia e organizacional; certifique-se de ter reunido os requisitos de
Armazenamento de arquivo
Lidamos com arquivos todos os dias, mas a noção de arquivo é um tanto sutil. Um arquivo é uma entidade
de dados com características específicas de leitura, gravação e referência usadas por software e sistemas
Comprimento finito
Anexar operações
sistema.
Acesso aleatório
localização.
O armazenamento de objetos se comporta muito como o armazenamento de arquivos, mas com diferenças importantes.
de arquivos, o armazenamento de objetos é sem dúvida muito mais importante para o tipo de dados
Machine Translated by Google
engenharia que você fará hoje. Faremos referências à discussão sobre armazenamento de objetos
extensivamente nas próximas páginas.
/Users/matthewousley/output.txt
Quando forneço isso ao sistema operacional, ele inicia no diretório raiz /, encontra Users, matthewousley e,
finalmente, output.txt. Trabalhando da esquerda, cada diretório está contido dentro de um diretório pai, até
que finalmente chegamos ao arquivo output.txt. Este exemplo usa a semântica do Unix, mas a semântica
de referência de arquivo do Windows é semelhante. O sistema de arquivos armazena cada diretório como
metadados sobre os arquivos e diretórios que ele contém. Esses metadados consistem no nome de cada
entidade, detalhes de permissão relevantes e um ponteiro para a entidade real. Para localizar um arquivo no
disco, o sistema operacional analisa os metadados em cada nível de hierarquia e segue o ponteiro para a
próxima entidade do subdiretório até finalmente chegar ao próprio arquivo.
Observe que outras entidades de dados semelhantes a arquivos geralmente não têm necessariamente
todas essas propriedades. Por exemplo, objetos no armazenamento de objetos suportam apenas a
primeira característica, comprimento finito, mas ainda são extremamente úteis. Discutimos isso em
“Armazenamento de Objetos”.
Armazenamento em disco
Sistemas de arquivos locais geralmente suportam leitura completa após consistência de escrita;
a leitura imediatamente após uma gravação retornará os dados gravados. Os sistemas operacionais
também empregam várias estratégias de bloqueio para gerenciar tentativas de gravação simultâneas
em um arquivo.
Uma alternativa popular ao NAS é uma rede de área de armazenamento (SAN), mas os sistemas
SAN fornecem acesso em nível de bloco sem a abstração do sistema de arquivos. Cobrimos os
sistemas SAN em “Block Storage”.
muito parecido com as soluções NAS, mas os detalhes de rede, gerenciamento de clusters de
disco, falhas e configuração são totalmente tratados pelo fornecedor da nuvem.
Por exemplo, o Amazon Elastic File System (EFS) é um exemplo extremamente popular de um
serviço de sistema de arquivos em nuvem. O armazenamento é exposto por meio do protocolo NFS
4, que também é usado por sistemas NAS. O EFS oferece dimensionamento automático e preços de
pagamento por armazenamento sem necessidade de reserva avançada de armazenamento. O
serviço também fornece consistência de leitura após gravação local (ao ler da máquina que executou
a gravação). Ele também oferece consistência aberta após o fechamento em todo o sistema de
arquivos. Em outras palavras, quando um aplicativo fecha um arquivo, os leitores subsequentes verão
as alterações salvas no arquivo fechado.
Armazenamento em bloco
Em nossa discussão anterior sobre SSDs e discos magnéticos, mencionamos que, com esses
dispositivos de acesso aleatório, o sistema operacional pode buscar, ler e gravar quaisquer dados no
disco. Um bloco é a menor unidade de dados endereçável suportada por um disco. Isso geralmente
era 512 bytes de dados utilizáveis em discos mais antigos, mas agora aumentou para 4.096 bytes
para a maioria dos discos atuais, tornando as gravações menos refinadas, mas reduzindo drasticamente
a sobrecarga do gerenciamento de blocos. Os blocos normalmente contêm bits extras para detecção/
correção de erros e outros metadados.
Os sistemas de banco de dados transacionais geralmente acessam os discos em um nível de bloco para dispor os
dados para um desempenho ideal. Para bancos de dados orientados a linhas, isso originalmente significava que linhas
de dados eram gravadas como fluxos contínuos; a situação ficou mais complicada com a chegada dos SSDs e suas
melhorias de desempenho de tempo de busca associadas, mas os bancos de dados transacionais ainda contam com
o alto desempenho de acesso aleatório oferecido pelo acesso direto a um dispositivo de armazenamento em bloco.
O armazenamento em bloco também continua sendo a opção padrão para discos de inicialização do sistema
operacional em VMs na nuvem. O dispositivo de bloco é formatado da mesma forma que seria diretamente em
virtualizado em nuvem”.)
ATAQUE
O RAID controla simultaneamente vários discos para melhorar a durabilidade dos dados, aprimorar o desempenho
e combinar a capacidade de várias unidades. Uma matriz pode aparecer para o sistema operacional como um
dispositivo de bloco único. Muitos esquemas de codificação e paridade estão disponíveis, dependendo do equilíbrio
desejado entre largura de banda efetiva aprimorada e maior tolerância a falhas (tolerância para muitas falhas de disco).
virtualizados em uma rede, normalmente de um pool de armazenamento. A abstração de SAN pode permitir o
pode encontrar sistemas SAN se estiver trabalhando com sistemas de armazenamento no local; você também pode
dispensam os engenheiros de lidar com clusters SAN e detalhes de rede. Veremos o Amazon Elastic Block
nuvens públicas têm ofertas semelhantes. EBS é o armazenamento padrão para máquinas virtuais
Amazon EC2; outros provedores de nuvem também tratam o armazenamento de objetos virtualizados
como um componente-chave de suas ofertas de VM.
Os volumes do EBS armazenam dados separados do servidor host da instância, mas na mesma
zona para oferecer suporte a alto desempenho e baixa latência (Figura 6-5). Isso permite que os
volumes do EBS persistam quando uma instância do EC2 for encerrada, quando um servidor host
falhar ou mesmo quando a instância for excluída. O armazenamento EBS é adequado para
aplicativos como bancos de dados, onde a durabilidade dos dados é uma alta prioridade. Além
disso, o EBS replica todos os dados para pelo menos duas máquinas host separadas, protegendo
os dados se um disco falhar.
Figura 6-5. Os volumes do EBS replicam dados para vários hosts e discos para alta durabilidade
e disponibilidade, mas não são resilientes à falha de uma zona de disponibilidade
Os volumes do EBS também são altamente escaláveis. No momento da redação deste artigo,
algumas classes de volume do EBS podem ser dimensionadas para até 64 TiB, 256.000 IOPS e
4.000 MiB/s.
Figura 6-6. Os volumes de armazenamento de instâncias oferecem alto desempenho e baixo custo, mas não protegem os
dados em caso de falha de disco ou desligamento da VM
Machine Translated by Google
Os discos conectados localmente não suportam nenhum dos recursos avançados de virtualização
oferecidos por serviços de armazenamento virtualizado como o EBS. O disco conectado localmente
não é replicado, portanto, uma falha de disco físico pode perder ou corromper dados, mesmo que a
VM do host continue em execução. Além disso, os volumes anexados localmente não oferecem
suporte a instantâneos ou outros recursos de backup.
Apesar dessas limitações, os discos anexados localmente são extremamente úteis. Em muitos
casos, usamos discos como cache local e, portanto, não precisamos de todos os recursos
avançados de virtualização de um serviço como o EBS. Por exemplo, suponha que estamos
executando o AWS EMR em instâncias do EC2. Podemos estar executando um trabalho
efêmero que consome dados do S3, armazena-os temporariamente no sistema de arquivos
distribuído em execução nas instâncias, processa os dados e grava os resultados de volta no S3.
O sistema de arquivos EMR é construído em replicação e redundância e está servindo como
cache em vez de armazenamento permanente. O armazenamento de instâncias do EC2 é uma
solução perfeitamente adequada nesse caso e pode melhorar o desempenho, pois os dados
podem ser lidos e processados localmente sem fluir pela rede (consulte a Figura 6-7).
Figura 6-7. Os volumes de armazenamento de instâncias podem ser usados como um cache de processamento em um cluster
Hadoop efêmero
Machine Translated by Google
Armazenamento de objetos
Figura 6-8. O armazenamento de objetos contém objetos imutáveis de todas as formas e tamanhos. Ao contrário dos arquivos
em um disco local, os objetos não podem ser modificados no local.
nuvem. Amazon S3, Azure Blob Storage e Google Cloud Storage (GCS) são armazenamentos de objetos
amplamente usados. Além disso, muitos data warehouses em nuvem (e um número crescente de bancos de
dados) utilizam o armazenamento de objetos como sua camada de armazenamento, e os data lakes em nuvem
Embora muitos sistemas de armazenamento de objetos locais possam ser instalados em clusters de
servidores, vamos nos concentrar principalmente em armazenamentos de objetos em nuvem totalmente gerenciados.
Do ponto de vista operacional, uma das características mais atraentes do armazenamento de objetos em nuvem
O armazenamento de objetos foi sem dúvida um dos primeiros serviços “sem servidor”; os engenheiros não
A tendência geral é que a maioria das organizações moverá o processamento de dados para a nuvem,
usando um armazenamento de objetos como armazenamento essencial e camada de serviço enquanto
processa dados em clusters efêmeros.
Os armazenamentos de objetos agora são o padrão-ouro de armazenamento para data lakes. Nos
primórdios dos data lakes, escrever uma vez, ler muitos (WORM) era o padrão operacional, mas isso
tinha mais a ver com as complexidades do gerenciamento de versões e arquivos de dados do que
com as limitações do HDFS e armazenamentos de objetos. Desde então, sistemas como Apache Hudi
e Delta Lake surgiram para gerenciar essa complexidade, e regulamentações de privacidade, como
GDPR e CCPA, tornaram imperativos os recursos de exclusão e atualização. O gerenciamento de
atualizações para armazenamento de objetos é a ideia central por trás do conceito data lakehouse, que
apresentamos no Capítulo 3.
dados binários sem restrições de tipo ou estrutura e frequentemente desempenha um papel nos pipelines
de ML para texto bruto, imagens, vídeo e áudio.
Pesquisa de objetos
S3://oreilly-data-engineering-book/data-example.json
que aponta para um objeto específico. Os nomes de bucket do S3 devem ser exclusivos em toda a
AWS. As chaves são exclusivas em um bucket. Embora os armazenamentos de objetos na nuvem pareçam
oferecer suporte à semântica da árvore de diretórios, não existe uma hierarquia de diretórios verdadeira.
Podemos armazenar um objeto com o seguinte caminho completo:
S3://oreilly-data-engineering-book/project data/11/23/2021/
data.txt
Na superfície, isso se parece com subdiretórios que você pode encontrar em um sistema de pastas de
arquivos comum: project-data, 11, 23 e 2021. Muitas interfaces de console em nuvem permitem que os
objetos. No entanto, nos bastidores, o sistema de objetos não percorre uma árvore de diretórios para
alcançar o objeto. Em vez disso, ele simplesmente vê uma chave (project-data/11/23/2021/data.txt) que
corresponde à semântica do diretório. Isso pode parecer um detalhe técnico menor, mas os engenheiros
precisam entender que certas operações no nível de “diretório” são caras em um armazenamento de
objetos. Para executar aws ls S3://oreilly-data engineering-book/project-data/11/ o armazenamento de
objetos deve filtrar chaves no prefixo de chave project-data/11/. Se o balde contém
Machine Translated by Google
milhões de objetos, esta operação pode levar algum tempo, mesmo que o “subdiretório”
abrigue apenas alguns objetos.
Pode ser desejável impor uma consistência forte em um armazenamento de objetos por vários
motivos, e métodos padrão são usados para conseguir isso. Uma abordagem é adicionar um
banco de dados fortemente consistente (por exemplo, PostgreSQL) à mistura. Escrever um objeto
agora é um processo de duas etapas:
1. Escreva o objeto.
Os metadados de versão (um hash de objeto ou um carimbo de data/hora de objeto) podem identificar
exclusivamente uma versão de objeto em conjunto com a chave de objeto. Para ler um objeto, um
leitor realiza as seguintes etapas:
2. Consulte os metadados do objeto usando a chave do objeto. Leia os dados do objeto se eles
corresponderem aos metadados buscados no banco de dados consistente.
Machine Translated by Google
Uma implementação prática tem exceções e casos extremos a serem considerados, como quando
o objeto é reescrito durante esse processo de consulta. Essas etapas podem ser gerenciadas por
trás de uma API para que um leitor de objetos veja um armazenamento de objetos fortemente
consistente ao custo de maior latência para acesso a objetos.
Vejamos alguns exemplos no S3, pois a Amazon é uma referência para padrões de serviço em nuvem. A
classe de armazenamento S3 Standard-Infrequent Access oferece descontos nos custos mensais de
armazenamento para aumentar os custos de recuperação de dados. (Consulte “A Brief Detour on Cloud
Economics” para uma discussão teórica sobre a economia dos níveis de armazenamento em nuvem.) A
Amazon também oferece o nível Amazon S3 One Zone-Infrequent Access, replicando apenas para uma
única zona. A disponibilidade projetada cai de 99,9% para 99,5% para levar em conta a possibilidade de
uma interrupção zonal. A Amazon ainda alega durabilidade de dados extremamente alta, com a ressalva
de que os dados serão perdidos se uma zona de disponibilidade for destruída.
Esteja ciente de como você planeja utilizar o armazenamento de arquivamento, pois é fácil de acessar e
muitas vezes caro para acessar os dados, especialmente se você precisar deles com mais frequência do
que o esperado. Consulte o Capítulo 4 para uma discussão mais ampla sobre a economia do armazenamento
de arquivos.
Esses sistemas de cache ultrarrápidos são úteis quando os engenheiros de dados precisam fornecer dados
com latência de recuperação ultrarrápida.
resultados com latência muito baixa, além de aliviar a carga dos sistemas de back-end.
Muitas vezes vemos alegações de que o Hadoop está morto. Isso é apenas parcialmente verdade. O Hadoop
não é mais uma tecnologia de ponta. Muitas ferramentas do ecossistema Hadoop, como o Apache Pig, agora
estão em suporte de vida e são usadas principalmente para executar trabalhos legados. O modelo de
programação MapReduce puro caiu no esquecimento. O HDFS continua sendo amplamente utilizado em
vários aplicativos e organizações.
O Hadoop ainda aparece em muitas instalações legadas. Muitas organizações que adotaram o Hadoop
durante o pico da febre do big data não têm planos imediatos de migrar para tecnologias mais recentes.
Essa é uma boa opção para empresas que executam clusters Hadoop massivos (de mil nós) e têm recursos
para manter sistemas locais com eficiência. As empresas menores podem querer reconsiderar a sobrecarga
de custos e as limitações de escala da execução de um pequeno cluster Hadoop em relação à migração para
soluções em nuvem.
Além disso, o HDFS é um ingrediente-chave de muitos mecanismos de big data atuais, como o Amazon
EMR. Na verdade, o Apache Spark ainda é comumente executado em clusters HDFS. Discutimos isso
com mais detalhes em “Separação de computação do armazenamento”.
Armazenamento de streaming
Os dados de streaming têm requisitos de armazenamento diferentes dos dados que não são de streaming.
No caso de filas de mensagens, os dados armazenados são temporais e devem desaparecer após
um determinado período. No entanto, estruturas de streaming distribuídas e escaláveis, como o Apache
Kafka, agora permitem a retenção de dados de streaming de duração extremamente longa. O Kafka oferece
suporte à retenção de dados indefinida, enviando mensagens antigas e acessadas com pouca frequência
para o armazenamento de objetos. Os concorrentes do Kafka (incluindo Amazon Kinesis, Apache Pulsar e
Google Cloud Pub/Sub) também oferecem suporte a longa retenção de dados
Outros mecanismos de armazenamento surgiram para aplicativos de análise em tempo real. De certa
forma, os bancos de dados transacionais surgiram como os primeiros mecanismos de consulta em
tempo real; os dados se tornam visíveis para as consultas assim que são gravados. No entanto, esses
bancos de dados têm limitações conhecidas de dimensionamento e bloqueio, especialmente para
consultas analíticas executadas em grandes volumes de dados. Embora as versões escaláveis de
bancos de dados transacionais orientados a linhas tenham superado algumas dessas limitações, elas
Na maioria dos RDBMSs, os índices são usados para chaves de tabela primárias (permitindo identificação
exclusiva de linhas) e chaves estrangeiras (permitindo junções com outras tabelas).
Os índices também podem ser aplicados a outras colunas para atender às necessidades de aplicativos
específicos. Usando índices, um RDBMS pode pesquisar e atualizar milhares de linhas por segundo.
Um data warehouse inicial era normalmente construído no mesmo tipo de RDBMS usado para
aplicativos transacionais. A crescente popularidade dos sistemas MPP significou uma mudança para o
processamento paralelo para melhorias significativas no desempenho de varredura em grandes
quantidades de dados para fins de análise.
No entanto, esses MPPs orientados a linhas ainda usavam índices para dar suporte a junções e
verificação de condição.
Machine Translated by Google
Bancos de dados colunares têm um desempenho ruim para casos de uso transacionais, ou seja,
quando tentamos pesquisar um grande número de linhas individuais de forma assíncrona.
No entanto, eles têm um desempenho extremamente bom quando grandes quantidades de dados
precisam ser verificadas, por exemplo, para transformações complexas de dados, agregações,
cálculos estatísticos ou avaliação de condições complexas em grandes conjuntos de dados.
ONDE created_date='2017-01-02'
Nessa consulta, o Snowflake exclui todas as micropartições que não incluem essa data,
eliminando efetivamente esses dados. O Snowflake também permite micropartições
sobrepostas, potencialmente particionando em vários campos mostrando repetições
significativas.
Os principais tipos de abstrações com os quais nos preocuparemos são aqueles que dão suporte à
ciência de dados, análise e casos de uso de relatórios. Isso inclui data warehouse, data lake, data
lakehouse, plataformas de dados e catálogos de dados. Não abordaremos os sistemas de origem, pois
eles são discutidos no Capítulo 5.
A abstração de armazenamento que você precisa como engenheiro de dados se resume a algumas
considerações importantes:
por?
Atualizar padrões
upserts?
Custo
custos de oportunidade?
Você deve saber que a popularidade de separar o armazenamento da computação significa que as
linhas entre os bancos de dados OLAP e os data lakes estão cada vez mais embaçadas. Os principais
data warehouses e data lakes na nuvem estão em rota de colisão. No futuro, as diferenças entre
esses dois podem estar apenas no nome, pois podem ser funcional e tecnicamente muito semelhantes
sob o capô.
Machine Translated by Google
O armazém de dados
Os data warehouses são uma arquitetura de dados OLAP padrão. Conforme discutido no Capítulo
3, o termo data warehouse refere-se a plataformas de tecnologia (por exemplo, Google BigQuery
e Teradata), uma arquitetura para centralização de dados e um padrão organizacional dentro de uma
empresa. Em termos de tendências de armazenamento, evoluímos da construção de data warehouses
sobre bancos de dados transacionais convencionais, sistemas MPP baseados em linhas (por
exemplo, Teradata e IBM Netezza) e sistemas MPP colunares (por exemplo, Vertica e Teradata
Columnar) para data warehouses em nuvem e plataformas de dados. (Veja nossa discussão sobre
armazenamento de dados no Capítulo 3 para mais detalhes sobre sistemas MPP.)
Na prática, os data warehouses em nuvem são frequentemente usados para organizar dados
em um data lake, uma área de armazenamento para grandes quantidades de dados brutos não
3 James Dixon. Os data warehouses na nuvem
processados, conforme originalmente concebido por
podem lidar com grandes quantidades de texto bruto e documentos JSON complexos. A limitação é
que os data warehouses em nuvem não podem lidar com dados realmente não estruturados, como
imagens, vídeo ou áudio, ao contrário de um verdadeiro data lake. Os data warehouses em nuvem
podem ser acoplados ao armazenamento de objetos para fornecer uma solução completa de data lake.
O lago de dados
O data lake foi originalmente concebido como um armazenamento massivo onde os dados eram
retidos em forma bruta e não processada. Inicialmente, os data lakes foram construídos
principalmente em sistemas Hadoop, onde o armazenamento barato permitia a retenção de grandes
quantidades de dados sem a sobrecarga de custos de um sistema MPP proprietário.
É importante enfatizar que muitos dos dados em um data lakehouse podem não ter uma
estrutura de tabela imposta. Podemos impor recursos de data warehouse onde precisamos deles
em um lakehouse, deixando outros dados em um formato bruto ou até mesmo não estruturado.
Plataformas de dados
Cada vez mais, os fornecedores estão estilizando seus produtos como plataformas de dados.
Esses fornecedores criaram seus ecossistemas de ferramentas interoperáveis com forte
integração na camada principal de armazenamento de dados. Ao avaliar as plataformas, os
engenheiros devem garantir que as ferramentas oferecidas atendam às suas necessidades.
Ferramentas não fornecidas diretamente na plataforma ainda podem interoperar, com sobrecarga
de dados extra para troca de dados. As plataformas também enfatizam a integração próxima com
o armazenamento de objetos para casos de uso não estruturados, conforme mencionado em nossa
discussão sobre data warehouses em nuvem.
Neste ponto, a noção de plataforma de dados francamente ainda precisa ser totalmente
desenvolvida. No entanto, a corrida está em andamento para criar um jardim murado de ferramentas
de dados, simplificando o trabalho de engenharia de dados e gerando uma dependência significativa
do fornecedor.
Alguns desses consumidores podem ser sistemas de processamento em tempo real que
geram estatísticas sobre o fluxo. Além disso, um consumidor de armazenamento em lote grava
dados para retenção de longo prazo e consultas em lote. O consumidor do lote pode ser o AWS
Kinesis Firehose, que pode gerar objetos do S3 com base em gatilhos configuráveis (por exemplo,
tempo e tamanho do lote). Sistemas como o BigQuery ingerem dados de streaming em um buffer de
streaming. Esse buffer de streaming é reserializado automaticamente no armazenamento de objeto
colunar. O mecanismo de consulta oferece suporte à consulta contínua do buffer de streaming e dos
dados do objeto para fornecer aos usuários uma visão atual da tabela quase em tempo real.
Machine Translated by Google
Catálogo de dados
Os catálogos de dados são frequentemente usados para fornecer um local central onde as
pessoas podem visualizar seus dados, consultas e armazenamento de dados. Como engenheiro
de dados, você provavelmente será responsável por configurar e manter as várias integrações
de dados de pipeline de dados e sistemas de armazenamento que se integrarão ao catálogo de
dados e à integridade do próprio catálogo de dados.
Idealmente, os aplicativos de dados são projetados para integração com APIs de catálogo
para lidar diretamente com seus metadados e atualizações. Como os catálogos são mais
amplamente utilizados em uma organização, fica mais fácil aproximar-se desse ideal.
Verificação automatizada
metadados existentes e também podem usar ferramentas de varredura para inferir metadados, como relacionamentos
Os catálogos de dados geralmente também fornecem uma camada de acesso humano por meio de uma
interface da Web, na qual os usuários podem pesquisar dados e visualizar relacionamentos de dados. Os catálogos
de dados podem ser aprimorados com uma camada social que oferece a funcionalidade Wiki.
Isso permite que os usuários forneçam informações sobre seus conjuntos de dados, solicitem
catálogos de dados têm casos de uso organizacionais e técnicos. Os catálogos de dados tornam os
metadados facilmente disponíveis para os sistemas. Por exemplo, um catálogo de dados é um ingrediente
Compartilhamento de dados
O compartilhamento de dados permite que organizações e indivíduos compartilhem dados específicos e permissões
cuidadosamente definidas com entidades específicas. O compartilhamento de dados permite que os cientistas de
dados compartilhem dados de um sandbox com seus colaboradores dentro de uma organização. Entre as
organizações, o compartilhamento de dados facilita a colaboração entre empresas parceiras. Por exemplo, uma
empresa de tecnologia de anúncios pode compartilhar dados de publicidade com seus clientes.
Um ambiente multilocatário na nuvem torna a colaboração interorganizacional muito mais fácil. No entanto,
As organizações devem controlar cuidadosamente as políticas que controlam quem pode compartilhar dados
Esquema
Observe que o esquema não precisa ser relacional. Em vez disso, os dados se tornam mais úteis
quando temos o máximo de informações sobre sua estrutura e organização. Para imagens
armazenadas em um data lake, essas informações de esquema podem explicar o formato da imagem,
a resolução e a maneira como as imagens se encaixam em uma hierarquia maior.
O esquema pode funcionar como uma espécie de pedra de Roseta, instruções que nos dizem como
ler os dados. Existem dois padrões de esquema principais: esquema na gravação e esquema na
leitura. O esquema na gravação é essencialmente o padrão tradicional de data warehouse: uma
tabela tem um esquema integrado; quaisquer gravações na tabela devem estar em conformidade.
Para dar suporte ao esquema na gravação, um data lake deve integrar um metastore de esquema.
produtos OLAP gerenciados agora contam com armazenamento de objetos nos bastidores. Para
entender as motivações para separar computação e armazenamento, devemos primeiro examinar
a colocação de computação e armazenamento.
Efemeridade e escalabilidade
Na nuvem, vimos uma mudança dramática em direção à efemeridade. Em geral, é mais barato
comprar e hospedar um servidor do que alugá-lo de um provedor de nuvem, desde que você o
execute 24 horas por dia sem parar por anos a fio. Na prática, as cargas de trabalho variam
drasticamente e eficiências significativas são obtidas com um modelo de pagamento conforme o
uso, se os servidores puderem ser dimensionados para cima e para baixo. Isso vale para servidores
da Web no varejo online e também para trabalhos em lote de big data que podem ser executados
apenas periodicamente.
Machine Translated by Google
Os recursos de computação efêmeros permitem que os engenheiros criem clusters massivos para
concluir os trabalhos no prazo e, em seguida, excluam os clusters quando esses trabalhos forem concluídos.
Os benefícios de desempenho de operar temporariamente em escala ultra-alta podem superar as
limitações de largura de banda do armazenamento de objetos.
O potencial de uma configuração incorreta que destrói dados no armazenamento de objetos ainda é
um pouco assustador, mas mitigações simples de implantar estão disponíveis.
Copiar dados para várias regiões de nuvem reduz esse risco, pois as alterações de configuração
geralmente são implantadas em apenas uma região por vez. A replicação de dados para vários
provedores de armazenamento pode reduzir ainda mais o risco.
Serviços de big data, como o Amazon EMR, criam clusters HDFS temporários para processar
dados. Os engenheiros têm a opção de referenciar o S3 e o HDFS como um sistema de
arquivos. Um padrão comum é colocar o HDFS em unidades SSD, extrair do S3 e salvar dados
de etapas de processamento intermediárias no HDFS local.
Fazer isso pode obter ganhos de desempenho significativos em relação ao processamento
diretamente do S3. Os resultados completos são gravados de volta no S3 assim que o cluster
conclui suas etapas e o cluster e o HDFS são excluídos. Outros consumidores lêem os dados de
saída diretamente do S3.
O Apache Druid depende muito de SSDs para obter alto desempenho. Como os SSDs são
significativamente mais caros que os discos magnéticos, o Druid mantém apenas uma cópia
dos dados em seu cluster, reduzindo os custos de armazenamento “ao vivo” por um fator de três.
É claro que manter a durabilidade dos dados ainda é fundamental, então o Druid usa um
armazenamento de objetos como sua camada de durabilidade. Quando os dados são
ingeridos, eles são processados, serializados em colunas compactadas e gravados em SSDs de
cluster e armazenamento de objetos. No caso de falha do nó ou corrupção de dados do cluster,
os dados podem ser recuperados automaticamente para novos nós. Além disso, o cluster pode
ser encerrado e recuperado totalmente do armazenamento SSD.
local, permitindo largura de banda ultra-alta para consultas nesse local. Referimo-nos4a
isso como armazenamento de objetos híbridos porque combina as abstrações limpas do
armazenamento de objetos com algumas vantagens de colocar computação e armazenamento.
A Amazon também oferece alguma noção de armazenamento de objetos híbridos por meio do
S3 Select, um recurso que permite aos usuários filtrar dados do S3 diretamente em clusters
do S3 antes que os dados sejam retornados pela rede.
Enquanto estamos vendo uma migração em massa de dados para nuvens públicas,
acreditamos que muitos fornecedores de serviços de dados em hiperescala que atualmente
rodam em nuvens públicas fornecidas por outros fornecedores podem construir seus data
centers no futuro, embora com profunda integração de rede em nuvens públicas.
A clonagem de cópia zero é um recurso atraente, mas os engenheiros devem entender seus
pontos fortes e limitações. Por exemplo, clonando um objeto em um data lake
Machine Translated by Google
ambiente e, em seguida, excluir os arquivos no objeto original também pode eliminar o novo objeto.
Armazenar dados não é tão simples quanto salvá-los no armazenamento de objetos ou em disco e
esquecê-los. Você precisa pensar no ciclo de vida do armazenamento de dados e na retenção de
dados. Ao pensar na frequência de acesso e nos casos de uso, pergunte: “Qual a importância dos
dados para os usuários downstream e com que frequência eles precisam acessá-los?” Este é o ciclo
de vida do armazenamento de dados. Outra pergunta que você deve fazer é: “Por quanto tempo devo
manter esses dados?” Você precisa reter dados indefinidamente ou pode descartá-los após um
determinado período de tempo?
Isso é retenção de dados. Vamos mergulhar em cada um deles.
Você sabia que os dados têm uma temperatura? Dependendo da frequência com que os dados são
acessados, podemos agrupar aproximadamente a maneira como eles são armazenados em três
categorias de persistência: quente, morno e frio. Os padrões de acesso à consulta diferem para cada
conjunto de dados (Figura 6-9). Normalmente, os dados mais recentes são consultados com mais
frequência do que os dados mais antigos. Vejamos os dados quentes, frios e quentes nessa ordem.
Machine Translated by Google
Figura 6-9. Custos de dados quentes, mornos e frios associados à frequência de acesso
Dados quentes
Os dados quentes têm requisitos de acesso instantâneo ou frequente. O armazenamento subjacente para
dados ativos é adequado para acesso e leituras rápidos, como SSD ou memória. Por causa do tipo de hardware
envolvido com dados quentes, armazenar dados quentes geralmente é a forma mais cara de armazenamento.
Exemplos de casos de uso para dados quentes incluem a recuperação de recomendações de produtos e resultados da
página do produto. O custo de armazenamento de dados quentes é o mais alto desses três níveis de armazenamento,
O cache de resultados da consulta é outro exemplo de dados quentes. Quando uma consulta é executada, alguns
mecanismos de consulta persistirão os resultados da consulta no cache. Por um tempo limitado, quando a mesma
consulta é executada, em vez de executar novamente a mesma consulta no armazenamento, o cache de resultados da
consulta exibe os resultados armazenados em cache. Isso permite tempos de resposta de consulta muito mais rápidos
em comparação com a emissão redundante da mesma consulta repetidamente. Nos próximos capítulos, abordaremos
Dados quentes
Os dados quentes são acessados semi-regularmente, digamos, uma vez por mês. Nenhuma regra rígida e rápida
indica com que frequência os dados quentes são acessados, mas são menos do que dados quentes e mais do que
dados frios. Os principais provedores de nuvem oferecem camadas de armazenamento de objetos que acomodam
dados quentes. Por exemplo, o S3 oferece um nível de acesso pouco frequente e o Google Cloud tem um nível de
armazenamento semelhante chamado Nearline. Os fornecedores fornecem seus modelos de frequência de acesso
O armazenamento de dados quentes é mais barato do que os dados quentes, com custos de recuperação um pouco
mais caros.
Dados frios
No outro extremo, os dados frios são dados acessados com pouca frequência. O hardware usado para arquivar
dados frios geralmente é barato e durável, como HDD, armazenamento em fita e sistemas de arquivamento baseados
em nuvem. Os dados frios destinam-se principalmente ao arquivamento de longo prazo, quando há pouca ou
Embora armazenar dados frios seja barato, recuperar dados frios geralmente é caro.
Ao considerar a camada de armazenamento para seus dados, considere os custos de cada camada. Se você
armazenar todos os seus dados em armazenamento a quente, todos os dados poderão ser acessados rapidamente.
Mas isso tem um preço tremendo! Por outro lado, se você armazenar todos os dados em armazenamento frio para
economizar custos, certamente reduzirá seus custos de armazenamento, mas às custas de tempos de recuperação
prolongados e altos custos de recuperação se precisar acessar dados. O preço do armazenamento diminui de
O armazenamento a frio é popular para arquivar dados. Historicamente, o armazenamento a frio envolvia
backups físicos e muitas vezes o envio desses dados para terceiros que os arquivavam em um cofre literal. O
armazenamento a frio é cada vez mais popular na nuvem. Todo fornecedor de nuvem oferece uma solução de dados
frios e você deve pesar o custo de enviar dados para o armazenamento frio versus o custo e o tempo para recuperar
os dados.
Os engenheiros de dados precisam levar em conta o transbordamento do armazenamento quente para o quente/frio.
A memória é cara e finita. Por exemplo, se os dados quentes estiverem armazenados na memória, eles
poderão ser despejados no disco quando houver muitos dados novos para armazenar e memória insuficiente.
Alguns bancos de dados podem mover dados acessados com pouca frequência para camadas quentes ou frias,
descarregando os dados para HDD ou armazenamento de objetos. Este último é cada vez mais comum devido à
relação custo-benefício do armazenamento de objetos. Se você estiver na nuvem e usando serviços gerenciados,
Se você estiver usando armazenamento de objetos baseado em nuvem, crie políticas de ciclo de
vida automatizadas para seus dados. Isso reduzirá drasticamente seus custos de armazenamento. Por
exemplo, se seus dados precisarem ser acessados apenas uma vez por mês, mova os dados para uma
camada de armazenamento de acesso pouco frequente. Se seus dados tiverem 180 dias e não forem
acessados para consultas atuais, mova-os para uma camada de armazenamento de arquivamento. Em
ambos os casos, você pode automatizar a migração de dados para fora do armazenamento regular de
objetos e economizará dinheiro. Dito isso, considere os custos de recuperação — tanto em tempo quanto
em dinheiro — usando camadas de armazenamento pouco frequentes ou de estilo de arquivamento.
Os tempos e custos de acesso e recuperação podem variar dependendo do provedor de nuvem.
Alguns provedores de nuvem tornam simples e barato migrar dados para armazenamento de arquivo,
mas é caro e lento para recuperar seus dados.
Retenção de dados
Nos primórdios do “big data”, havia uma tendência a errar por acumular todos os dados possíveis,
independentemente de sua utilidade.
A expectativa era: “podemos precisar desses dados no futuro”. Esse armazenamento de dados
inevitavelmente se tornou pesado e sujo, dando origem a pântanos de dados e repressão regulatória à
retenção de dados, entre outras consequências e pesadelos. Atualmente, os engenheiros de dados
precisam considerar a retenção de dados: quais dados você precisa manter e por quanto tempo você
deve mantê-los? Aqui estão algumas coisas para pensar com a retenção de dados.
Valor
Os dados são um ativo, portanto, você deve saber o valor dos dados que está armazenando. É claro que o
valor é subjetivo e depende de quanto vale para seu caso de uso imediato e sua organização mais ampla.
Esses dados são impossíveis de recriar ou podem ser facilmente recriados consultando sistemas upstream?
Qual é o impacto para os usuários a jusante se esses dados estiverem disponíveis versus se não estiverem?
Tempo
O valor para os usuários a jusante também depende da idade dos dados. Os novos dados geralmente são
mais valiosos e acessados com frequência do que os dados mais antigos.
As limitações técnicas podem determinar por quanto tempo você pode armazenar dados em determinados
Machine Translated by Google
Observância
Certos regulamentos (por exemplo, HIPAA e Payment Card Industry, ou PCI) podem exigir que
você mantenha os dados por um determinado período. Nessas situações, os dados simplesmente
precisam estar acessíveis mediante solicitação, mesmo que a probabilidade de uma solicitação
de acesso seja baixa. Outras regulamentações podem exigir que você mantenha os dados
apenas por um período limitado de tempo, e você precisará ter a capacidade de excluir
informações específicas no prazo e dentro das diretrizes de conformidade. Você precisará de um
processo de armazenamento e arquivamento de dados — juntamente com a capacidade de
pesquisar os dados — que atenda aos requisitos de retenção do regulamento específico que
você precisa cumprir. Claro, você vai querer equilibrar a conformidade com o custo.
Custo
Os dados são um ativo que (espero) tem um ROI. No lado do custo do ROI, uma despesa
óbvia de armazenamento está associada aos dados. Considere a linha do tempo na qual
você precisa reter dados. Dada nossa discussão sobre dados quentes, mornos e frios,
implemente práticas de gerenciamento de ciclo de vida de dados automáticos e mova os
dados para armazenamento frio se você não precisar dos dados após a data de retenção
exigida. Ou exclua dados se realmente não forem necessários.
Adotar o armazenamento de locatário único significa que cada locatário obtém seu armazenamento
dedicado. No exemplo da Figura 6-10, cada locatário obtém um banco de dados. Nenhum dado é
compartilhado entre esses bancos de dados e o armazenamento é totalmente isolado. Um exemplo
de uso de armazenamento de locatário único é que os dados de cada cliente devem ser
armazenados isoladamente e não podem ser combinados com os dados de nenhum outro cliente.
Nesse caso, cada cliente recebe seu próprio banco de dados.
Figura 6-10. No armazenamento de locatário único, cada locatário obtém seu próprio banco de dados
Figura 6-11. Neste armazenamento multilocatário, quatro inquilinos ocupam o mesmo banco de dados
O engenheiro de dados precisa garantir que os sistemas de armazenamento usados pelos usuários
downstream estejam disponíveis com segurança, contenham dados de alta qualidade, tenham ampla capacidade
Subcorrentes
As subcorrentes do armazenamento são significativas porque o armazenamento é um hub crítico para todos os
estágios do ciclo de vida da engenharia de dados. Ao contrário de outras subcorrentes para as quais os dados
Segurança
Embora os engenheiros muitas vezes vejam a segurança como um impedimento ao seu trabalho, eles devem
abraçar a ideia de que a segurança é um facilitador fundamental. A segurança robusta com controle de acesso a
dados refinado permite que os dados sejam compartilhados e consumidos de forma mais ampla dentro de uma
Como sempre, exerça o princípio do privilégio mínimo. Não dê acesso total ao banco de dados a ninguém, a menos
que seja necessário. Isso significa que a maioria dos engenheiros de dados não precisa de acesso total ao banco
de dados na prática. Além disso, preste atenção aos controles de acesso em nível de coluna, linha e célula em seu
banco de dados. Dê aos usuários apenas as informações de que precisam e nada mais.
Gestão de dados
O gerenciamento de dados é fundamental à medida que lemos e gravamos dados com sistemas de armazenamento.
Os dados são aprimorados por metadados robustos. A catalogação habilita cientistas de dados,
analistas e engenheiros de ML, permitindo a descoberta de dados. A linhagem de dados acelera o
tempo para rastrear problemas de dados e permite que os consumidores localizem fontes brutas upstream.
À medida que você constrói seus sistemas de armazenamento, invista em seus metadados. A integração
de um dicionário de dados com essas outras ferramentas permite que os usuários compartilhem e registrem
o conhecimento institucional de forma robusta.
Privacidade
DataOps
O DataOps não é ortogonal ao gerenciamento de dados e existe uma área significativa de sobreposição.
A DataOps se preocupa com o monitoramento operacional tradicional de sistemas de armazenamento
e o monitoramento dos próprios dados, indissociáveis de metadados e qualidade.
Machine Translated by Google
Monitoramento de sistemas
Embora os sistemas de metadados, como descrevemos, sejam críticos, uma boa engenharia deve
considerar a natureza entrópica dos dados, procurando ativamente entender suas características e
observando grandes mudanças. Os engenheiros podem monitorar estatísticas de dados, aplicar métodos
de detecção de anomalias ou regras simples e testar e validar ativamente inconsistências lógicas.
Arquitetura de dados
Considere as seguintes dicas de arquitetura de dados. Design para confiabilidade e durabilidade exigidas.
Entenda os sistemas de origem upstream e como esses dados, uma vez ingeridos, serão armazenados
e acessados. Entenda os tipos de modelos de dados e consultas que ocorrerão no downstream.
Se for esperado que os dados cresçam, você pode negociar o armazenamento com seu provedor
de nuvem? Adote uma abordagem ativa para FinOps e trate-o como uma parte central das conversas
sobre arquitetura. Não otimize prematuramente, mas prepare-se para escalar se houver oportunidades de
negócios operando em grandes volumes de dados.
Orquestração
Machine Translated by Google
Engenharia de software
Podemos pensar em engenharia de software no contexto de armazenamento de duas maneiras.
Primeiro, o código que você escreve deve funcionar bem com seu sistema de armazenamento.
Certifique-se de que o código que você escreve armazena os dados corretamente e não causa
dados acidentalmente, vazamentos de memória ou problemas de desempenho. Segundo, defina sua
infraestrutura de armazenamento como código e use recursos de computação efêmeros na hora de
processar seus dados. Como o armazenamento é cada vez mais distinto da computação, você pode
aumentar e diminuir os recursos automaticamente enquanto mantém seus dados no armazenamento
de objetos. Isso mantém sua infraestrutura limpa e evita o acoplamento de suas camadas de
armazenamento e consulta.
Conclusão
O armazenamento está em toda parte e está subjacente a muitos estágios do ciclo de vida da
engenharia de dados. Neste capítulo, você aprendeu sobre os ingredientes brutos, tipos, abstrações
e grandes ideias em torno dos sistemas de armazenamento. Obtenha um conhecimento profundo do
funcionamento interno e das limitações dos sistemas de armazenamento que você usará. Conheça os
tipos de dados, atividades e cargas de trabalho apropriados para seu armazenamento.
Recursos adicionais
“SGBD orientado a colunas” Página da Wikipédia
“Banco de dados Rowise vs. Colunar? Teoria e prática” por Mangat Rai Modi
A “Criação e replicação de dados da IDC crescerão a uma taxa mais rápida do que
Capacidade de armazenamento instalada, de acordo com o comunicado de imprensa
do IDC Global DataSphere e StorageSphere Forecasts”
“Dados quentes versus dados frios: por que é importante” por Afzaal Ahmad Zeeshan
1 Andy Klein, “Hard Disk Drive (HDD) vs. Solid-State Drive (SSD): Qual é a diferença?”
Blog Backblaze, 5 de outubro de 2021, https:// oreil.ly/ XBps8.
2 Benoit Dageville, “The Snowflake Elastic Data Warehouse,” SIGMOD '16: Proceedings of the
2016 International Conference on Management of Data (junho de 2016): 215–226, https://
oreil.ly/ Tc1su.
3 James Dixon, “Data Lakes Revisited”, James Dixon's Blog, 25 de setembro de 2014,
https:// oreil.ly/ FH25v.
4 Valliappa Lakshmanan e Jordan Tigani, GoogleBig Query: The Definitive Guide
(Seastopol, CA: O'Reilly, 2019), página 15, https:// oreil.ly/ 5aXXu
Machine Translated by Google
Capítulo 7. Ingestão
Você aprendeu sobre os vários sistemas de origem que provavelmente encontrará como
engenheiro de dados e sobre maneiras de armazenar dados. Vamos agora voltar nossa atenção
para os padrões e escolhas que se aplicam à ingestão de dados de vários sistemas de origem.
Neste capítulo, discutimos a ingestão de dados (consulte a Figura 7-1), as principais considerações
de engenharia para a fase de ingestão, os principais padrões para ingestão em lote e streaming,
tecnologias que você encontrará, com quem trabalhará ao desenvolver seu pipeline de ingestão de
dados e como as correntes secundárias aparecem na fase de ingestão.
Vale a pena comparar rapidamente a ingestão de dados com a integração de dados. Enquanto
a ingestão de dados é a movimentação de dados do ponto A para o B, a integração de dados
combina dados de fontes diferentes em um novo conjunto de dados. Por exemplo, você pode
usar a integração de dados para combinar dados de um sistema de CRM, dados de análise de
publicidade e análise da web para criar um perfil de usuário, que é salvo em seu data warehouse.
Além disso, usando o ETL reverso, você pode enviar esse perfil de usuário recém-criado de
volta ao seu CRM para que os vendedores possam usar os dados para priorizar leads.
Descrevemos a integração de dados mais detalhadamente no Capítulo 8, onde discutimos as
transformações de dados; ETL reverso é abordado no Capítulo 9.
Os pipelines de dados começam nos sistemas de origem, mas a ingestão é o estágio em que
os engenheiros de dados começam a projetar ativamente as atividades do pipeline de dados.
No espaço de engenharia de dados, uma grande quantidade de cerimônias ocorre em torno de
padrões de movimentação e processamento de dados, com padrões estabelecidos como ETL,
padrões mais recentes como ELT e novos nomes para práticas estabelecidas há muito tempo
(ETL reverso) e compartilhamento de dados.
Vamos manter essa noção de pipelines de dados em mente à medida que avançamos neste
capítulo.
Machine Translated by Google
Posso reutilizar esses dados e evitar a ingestão de várias versões do mesmo conjunto de
dados?
Os dados de origem estão em boas condições para uso imediato a jusante? Ou seja, os
dados são de boa qualidade? Que pós-processamento é necessário para atendê-lo?
Quais são os riscos de qualidade de dados (por exemplo, o tráfego de bots para um site
pode contaminar os dados)?
Frequência
Serialização e desserialização
Confiabilidade e durabilidade
Carga útil
Vamos adotar este mantra: Todos os dados são ilimitados até que sejam limitados.
Como muitos mantras, este não é preciso 100% do tempo. A lista de compras que
rabisquei esta tarde é de dados limitados. Eu o escrevi como um fluxo de consciência
(dados ilimitados) em um pedaço de papel de rascunho, onde os pensamentos agora
existem como uma lista de coisas (dados limitados) que preciso comprar no supermercado.
No entanto, a ideia é correta para fins práticos para a grande maioria dos dados que você
manipulará em um contexto de negócios. Por exemplo, um varejista on-line processará
transações de clientes 24 horas por dia até que o negócio falhe, a economia pare ou o sol
exploda.
Os processos de negócios há muito impõem limites artificiais aos dados cortando lotes
discretos. Tenha em mente a verdadeira falta de limites de seus dados; os sistemas de
ingestão de streaming são simplesmente uma ferramenta para preservar a natureza ilimitada
dos dados para que as etapas subsequentes do ciclo de vida também possam processá-los
continuamente.
Machine Translated by Google
Frequência
Uma das decisões críticas que os engenheiros de dados devem tomar ao projetar
processos de ingestão de dados é a frequência de ingestão de dados. Os processos de
ingestão podem ser em lote, microlote ou em tempo real.
As frequências de ingestão variam drasticamente de lenta a rápida (Figura 7-4). No lado mais
lento, uma empresa pode enviar seus dados fiscais para uma empresa de contabilidade uma
vez por ano. No lado mais rápido, um sistema CDC pode recuperar novas atualizações de log
de um banco de dados de origem uma vez por minuto. Ainda mais rápido, um sistema pode
ingerir continuamente eventos de sensores de IoT e processá-los em segundos. As frequências
de ingestão de dados geralmente são misturadas em uma empresa, dependendo do caso de
uso e das tecnologias.
Observamos que os padrões de ingestão “em tempo real” estão se tornando cada vez
mais comuns. Colocamos “tempo real” entre aspas porque nenhum sistema de ingestão
é genuinamente em tempo real. Qualquer banco de dados, fila ou pipeline tem latência inerente
na entrega de dados a um sistema de destino. É mais preciso falar em tempo quase real, mas
geralmente usamos o tempo real para ser breve. O padrão quase em tempo real geralmente
elimina uma frequência de atualização explícita; os eventos são processados no pipeline um
por um à medida que chegam ou em microlotes (ou seja, lotes em intervalos de tempo
concisos). Para este livro, usaremos tempo real e streaming de forma intercambiável.
Além disso, os sistemas de streaming são os mais adequados para muitos tipos de fontes de
dados. Em aplicativos de IoT, o padrão típico é que cada sensor grave eventos ou medições
em sistemas de streaming à medida que eles acontecem. Embora esses dados possam ser
gravados diretamente em um banco de dados, uma plataforma de ingestão de streaming, como
Amazon Kinesis ou Apache Kafka, é mais adequada para o aplicativo.
Os aplicativos de software podem adotar padrões semelhantes gravando eventos em
uma fila de mensagens à medida que eles acontecem, em vez de esperar que um processo
de extração extraia eventos e informações de estado de um banco de dados de back-end.
Esse padrão funciona excepcionalmente bem para arquiteturas orientadas a eventos que já
trocam mensagens por meio de filas. E, novamente, as arquiteturas de streaming geralmente
coexistem com o processamento em lote.
Figura 7-5. Um processo de ingestão síncrona é executado como etapas em lote discretas
Machine Translated by Google
Aqui está um mini estudo de caso de como não projetar seus pipelines de dados. Em
uma empresa, o próprio processo de transformação era uma série de dezenas de fluxos
de trabalho síncronos fortemente acoplados, com todo o processo levando mais de 24
horas para ser concluído. Se alguma etapa desse pipeline de transformação falhar, todo o
processo de transformação terá que ser reiniciado desde o início! Nesse caso, vimos
processo após processo falhar e, devido a mensagens de erro inexistentes ou enigmáticas,
consertar o pipeline foi um jogo de golpe que levou mais de uma semana para diagnosticar
e curar. Enquanto isso, a empresa não tinha relatórios atualizados durante esse período.
As pessoas não estavam felizes.
Serialização e desserialização
Ao ingerir dados, certifique-se de que seu destino possa desserializar os dados que recebe. Vimos
dados ingeridos de uma origem, mas que ficam inertes e inutilizáveis no destino porque os dados não
podem ser desserializados adequadamente.
Veja a discussão mais extensa sobre serialização no Apêndice A.
Em teoria, sua ingestão nunca deve ser um gargalo. Na prática, os gargalos de ingestão são bastante
comuns. A taxa de transferência de dados e a escalabilidade do sistema tornam-se críticas à medida
que seus volumes de dados crescem e os requisitos mudam.
Projete seus sistemas para dimensionar e reduzir para corresponder com flexibilidade à taxa de transferência
de dados desejada.
De onde você está ingerindo dados importa muito. Se você estiver recebendo dados conforme são
gerados, o sistema upstream terá algum problema que possa afetar seus pipelines de ingestão
downstream? Por exemplo, suponha que um banco de dados de origem fique inativo. Quando ele
voltar a ficar on-line e tentar preencher as cargas de dados decorridos, sua ingestão será capaz de
acompanhar esse influxo repentino de dados em atraso?
Outra coisa a considerar é sua capacidade de lidar com a ingestão de dados em rajadas.
A geração de dados raramente acontece a uma taxa constante e muitas vezes vai e vem.
O buffer integrado é necessário para coletar eventos durante picos de taxa para evitar que os dados
sejam perdidos. O armazenamento em buffer preenche o tempo enquanto o sistema é dimensionado
e permite que os sistemas de armazenamento acomodem intermitências mesmo em um sistema
dinamicamente escalável.
Sempre que possível, use serviços gerenciados que lidam com o dimensionamento da taxa de
transferência para você. Embora você possa realizar essas tarefas manualmente adicionando mais
servidores, fragmentos ou trabalhadores, muitas vezes isso não é um trabalho de valor agregado e
Machine Translated by Google
há uma boa chance de você perder alguma coisa. Grande parte desse trabalho pesado agora é
automatizado. Não reinvente a roda de ingestão de dados se você não tiver
para.
Confiabilidade e Durabilidade
Confiabilidade e durabilidade são vitais nos estágios de ingestão de pipelines de dados.
A confiabilidade envolve alto tempo de atividade e failover adequado para sistemas de ingestão.
A durabilidade implica garantir que os dados não sejam perdidos ou corrompidos.
Algumas fontes de dados (por exemplo, dispositivos IoT e caches) podem não reter dados se não
forem ingeridos corretamente. Uma vez perdido, ele se foi para sempre. Nesse sentido, a
confiabilidade dos sistemas de ingestão leva diretamente à durabilidade dos dados gerados. Se
os dados forem ingeridos, os processos downstream podem, teoricamente, ficar atrasados se forem
interrompidos temporariamente.
Não assuma que você pode construir um sistema que irá ingerir dados de forma confiável e
durável em todos os cenários possíveis. Mesmo o orçamento quase infinito do governo federal dos
EUA não pode garantir isso. Em muitos cenários extremos, a ingestão de dados realmente não
importa. Haverá pouco a ingerir se a internet cair, mesmo se você construir vários data centers com
lacunas de ar em bunkers subterrâneos com energia independente. Avalie continuamente as
compensações e os custos de confiabilidade e durabilidade.
Machine Translated by Google
Carga útil
Uma carga útil é o conjunto de dados que você está ingerindo e tem características como
tipo, forma, tamanho, esquema e tipos de dados e metadados. Vejamos algumas dessas
características para entender por que isso é importante.
Gentil
O tipo de dados que você manipula afeta diretamente como eles são tratados
no downstream no ciclo de vida da engenharia de dados. Tipo consiste em tipo e formato.
Os dados têm um tipo — tabular, imagem, vídeo, texto, etc. O tipo influencia diretamente o
formato dos dados ou a forma como são expressos em bytes, nomes e extensões de arquivo.
Por exemplo, um tipo de dados tabular pode estar em formatos como CSV ou Parquet, com
cada um desses formatos tendo diferentes padrões de bytes para serialização e desserialização.
Outro tipo de dado é uma imagem, que tem o formato JPG ou PNG e é inerentemente não
estruturada.
Forma
Cada carga útil tem uma forma que descreve suas dimensões. A forma dos dados é
crítica em todo o ciclo de vida da engenharia de dados. Por exemplo, as dimensões de pixel e
vermelho, verde, azul (RGB) de uma imagem são necessárias para treinar modelos de
aprendizado profundo. Como outro exemplo, se você estiver tentando importar um arquivo CSV
para uma tabela de banco de dados e seu CSV tiver mais colunas do que a tabela de banco de
dados, você provavelmente receberá um erro durante o processo de importação. Aqui estão
alguns exemplos das formas de vários tipos de dados:
Tabular
JSON semiestruturado
Imagens
A largura, altura e profundidade de cor RGB (por exemplo, 8 bits por pixel)
Áudio descompactado
Número de canais (por exemplo, dois para estéreo), profundidade da amostra (por exemplo, 16 bits
por amostra), taxa de amostragem (por exemplo, 48 kHz) e duração (por exemplo, 10.003
segundos)
Tamanho
O tamanho dos dados descreve o número de bytes de uma carga útil. Uma carga útil pode variar em
tamanho de bytes únicos a terabytes e maiores. Para reduzir o tamanho de uma carga útil, ela pode ser
compactada em vários formatos, como ZIP e TAR (consulte a discussão sobre compactação no Apêndice
A).
Uma carga útil massiva também pode ser dividida em partes, o que reduz efetivamente o tamanho da carga
ou data warehouse, essa é uma prática comum, pois os pequenos arquivos individuais são mais fáceis de
transmitir em uma rede (especialmente se estiverem compactados). Os arquivos fragmentados menores são
cargas de dados têm um esquema, como dados tabulares e semiestruturados. Conforme mencionado
anteriormente neste livro, um esquema descreve os campos e tipos de dados dentro desses campos.
Outros dados, como texto não estruturado, imagens e áudio, não terão um esquema ou tipos de dados
explícitos. No entanto, eles podem vir com descrições de arquivos técnicos sobre forma, dados e formato de
Embora você possa se conectar a bancos de dados de várias maneiras (como exportação de arquivos, CDC,
Schema não é apenas para bancos de dados. Conforme discutimos, as APIs apresentam suas
complicações de esquema. Muitas APIs de fornecedores têm métodos de relatório amigáveis que
preparam dados para análise. Em outros casos, os engenheiros não têm tanta sorte.
A API é um invólucro fino em torno de sistemas subjacentes, exigindo que os engenheiros entendam
os componentes internos do aplicativo para usar os dados.
As alterações de esquema ocorrem com frequência em sistemas de origem e geralmente estão fora
do controle dos engenheiros de dados. Exemplos de alterações de esquema incluem o seguinte:
Está se tornando cada vez mais comum que as ferramentas de ingestão automatizem a
detecção de alterações de esquema e até mesmo atualizem automaticamente as tabelas de destino.
Em última análise, isso é uma espécie de bênção mista. As alterações de esquema ainda podem
interromper os pipelines a jusante do preparo e da ingestão.
Registros de esquema
No streaming de dados, cada mensagem tem um esquema, e esses esquemas podem evoluir
entre produtores e consumidores. Um registro de esquema é um repositório de metadados usado
para manter a integridade do esquema e do tipo de dados diante de esquemas em constante
mudança. Os registros de esquema também podem rastrear versões e histórico de esquema. Ele
descreve o modelo de dados para mensagens, permitindo serialização e desserialização consistente
entre produtores e consumidores. Os registros de esquema são usados na maioria das principais
ferramentas de dados e nuvens.
Metadados
Além das características aparentes que acabamos de abordar, uma carga útil geralmente
contém metadados, que discutimos primeiro no Capítulo 2. Metadados são dados sobre dados. Os
metadados podem ser tão críticos quanto os próprios dados. Uma das limitações significativas da
abordagem inicial do data lake – ou pântano de dados, que poderia se tornar um site de superfundo
de dados – foi a completa falta de atenção aos metadados. Sem uma descrição detalhada dos
dados, pode ser
Machine Translated by Google
A ingestão de lote com intervalo de tempo é generalizada no ETL de negócios tradicional para
armazenamento de dados. Esse padrão é frequentemente usado para processar dados uma vez por dia,
Machine Translated by Google
durante a noite fora do horário comercial, para fornecer relatórios diários, mas outras frequências também
podem ser usadas.
A ingestão de lotes baseada em tamanho (Figura 7-11) é bastante comum quando os dados são
movidos de um sistema baseado em streaming para o armazenamento de objetos; em última análise,
você deve cortar os dados em blocos discretos para processamento futuro em um data lake.
Alguns sistemas de ingestão baseados em tamanho podem dividir dados em objetos com base em
vários critérios, como o tamanho em bytes do número total de eventos.
Alguns padrões de ingestão em lote comumente usados, que discutimos nesta seção, incluem o
seguinte:
Migração de dados
Embora as atualizações diferenciais sejam ideais para minimizar o tráfego de rede e o uso de
armazenamento de destino, as leituras completas de instantâneos permanecem extremamente comuns
devido à sua simplicidade.
Os dados são frequentemente movidos entre bancos de dados e sistemas usando arquivos. Os dados
são serializados em arquivos em um formato intercambiável e esses arquivos são fornecidos a um
sistema de ingestão. Consideramos a exportação baseada em arquivo como um padrão de ingestão
baseado em push . Isso ocorre porque o trabalho de exportação e preparação de dados é feito no
lado do sistema de origem.
A ingestão baseada em arquivo tem várias vantagens em potencial sobre uma abordagem de conexão
direta com o banco de dados. Muitas vezes, é indesejável permitir o acesso direto aos sistemas de
back-end por motivos de segurança. Com a ingestão baseada em arquivo, os processos de exportação
são executados no lado da fonte de dados, dando aos engenheiros do sistema de origem controle
total sobre quais dados são exportados e como os dados são pré-processados. Depois que os arquivos
são concluídos, eles podem ser fornecidos ao sistema de destino de várias maneiras. Os métodos
comuns de troca de arquivos são armazenamento de objetos, protocolo de transferência segura de
arquivos (SFTP), intercâmbio eletrônico de dados (EDI) ou cópia segura (SCP).
Extrair
Extrair significa obter dados de um sistema de origem. Embora a extração pareça implicar a
extração de dados, ela também pode ser baseada em push. A extração também pode exigir a
leitura de metadados e alterações de esquema.
Carregar
Machine Translated by Google
Depois que os dados são extraídos, eles podem ser transformados (ETL) antes de carregá-los
em um destino de armazenamento ou simplesmente carregados no armazenamento para
transformação futura. Ao carregar dados, você deve estar atento ao tipo de sistema que está
carregando, ao esquema dos dados e ao impacto no desempenho do carregamento. Cobrimos
ETL e ELT no Capítulo 8.
Os sistemas orientados a lotes geralmente têm um desempenho ruim quando os usuários tentam
executar muitas operações em lotes pequenos em vez de um número menor de operações grandes.
Por exemplo, embora seja comum inserir uma linha por vez em um banco de dados transacional,
esse é um padrão ruim para muitos bancos de dados colunares, pois força a criação de muitos
arquivos pequenos e subótimos e força o sistema a executar um grande número de criar operações
de objeto. A execução de muitas pequenas operações de atualização no local é um problema ainda
maior porque faz com que o banco de dados verifique cada arquivo de coluna existente para
executar a atualização.
Migração de dados
A migração de dados para um novo banco de dados ou ambiente geralmente não é trivial e os
dados precisam ser movidos em massa. Às vezes, isso significa mover tamanhos de dados de
centenas de terabytes ou muito maiores, geralmente envolvendo a migração de tabelas específicas
e a movimentação de bancos de dados e sistemas inteiros.
As migrações de dados provavelmente não são uma ocorrência regular como engenheiro de dados,
mas você deve estar familiarizado com elas. Como costuma ser o caso da ingestão de dados, o
gerenciamento de esquema é uma consideração crucial. Suponha que você esteja migrando
Machine Translated by Google
dados de um sistema de banco de dados para outro (digamos, SQL Server para
Snowflake). Não importa o quanto os dois bancos de dados se pareçam, diferenças sutis quase
sempre existem na maneira como eles lidam com o esquema.
Felizmente, geralmente é fácil testar a ingestão de uma amostra de dados e encontrar problemas
de esquema antes de realizar uma migração completa da tabela.
A maioria dos sistemas de dados funciona melhor quando os dados são movidos em massa e
não como linhas ou eventos individuais. O armazenamento de arquivos ou objetos geralmente
é um excelente estágio intermediário para a transferência de dados. Além disso, um dos maiores
desafios da migração de banco de dados não é a movimentação dos dados em si, mas a
movimentação das conexões de pipeline de dados do sistema antigo para o novo.
Esteja ciente de que muitas ferramentas estão disponíveis para automatizar vários tipos de
migrações de dados. Especialmente para migrações grandes e complexas, sugerimos
examinar essas opções antes de fazer isso manualmente ou escrever sua própria solução de
migração.
Evolução do esquema
Para aliviar os problemas relacionados à evolução do esquema, aqui estão algumas sugestões.
Primeiro, se sua estrutura de processamento de eventos tiver um registro de esquema (discutido
Machine Translated by Google
anteriormente neste capítulo), use-o para versionar suas mudanças de esquema. Em seguida,
uma fila de mensagens mortas (descrita em “Tratamento de erros e filas de mensagens mortas”)
pode ajudá-lo a investigar problemas com eventos que não são tratados adequadamente.
Por fim, a rota de baixa fidelidade (e a mais eficaz) é comunicar regularmente com as
partes interessadas upstream sobre possíveis alterações de esquema e abordar proativamente as
alterações de esquema com as equipes que introduzem essas alterações, em vez de reagir ao
destinatário das alterações importantes.
Embora você provavelmente prefira que todos os dados do evento cheguem no horário, os
dados do evento podem chegar atrasados. Um grupo de eventos pode ocorrer no mesmo
período (horários de eventos semelhantes), mas alguns podem chegar mais tarde do que
outros (tempos de ingestão tardia) devido a várias circunstâncias.
Por exemplo, um dispositivo IoT pode atrasar o envio de uma mensagem devido a problemas
de latência da Internet. Isso é comum ao ingerir dados. Você deve estar ciente dos dados de
chegada tardia e do impacto nos sistemas e usos downstream.
Suponha que você suponha que o tempo de ingestão ou processo seja o mesmo que o tempo do
evento. Você pode obter alguns resultados estranhos se seus relatórios ou análises dependerem
de um retrato preciso de quando os eventos ocorrem. Para lidar com dados de chegada tardia,
você precisa definir um horário limite para quando os dados de chegada tardia não serão mais
processados.
Repetir
O Replay permite que os leitores solicitem uma série de mensagens do histórico, permitindo
que você retroceda o histórico de eventos até um determinado momento.
O replay é um recurso essencial em muitas plataformas de ingestão de streaming e é
Machine Translated by Google
particularmente útil quando você precisa re-ingerir e reprocessar dados para um intervalo de
tempo específico. Por exemplo, o RabbitMQ normalmente exclui mensagens depois que todos
os assinantes as consomem. Kafka, Kinesis e Pub/Sub são compatíveis com retenção e repetição de
eventos.
Tempo de Viver
Por quanto tempo você preservará o registro do seu evento? Um parâmetro chave é o
tempo máximo de retenção de mensagens, também conhecido como tempo de vida (TTL).
O TTL geralmente é uma configuração que você definirá por quanto tempo você deseja que os
eventos vivam antes de serem reconhecidos e ingeridos. Qualquer evento não confirmado que
não seja ingerido após a expiração do TTL desaparece automaticamente.
Isso é útil para reduzir a contrapressão e o volume de eventos desnecessários em seu pipeline
de ingestão de eventos.
Encontre o equilíbrio certo do impacto do TTL em nosso pipeline de dados. Um TTL extremamente
curto (milissegundos ou segundos) pode fazer com que a maioria das mensagens desapareça
antes do processamento. Um TTL muito longo (várias semanas ou meses) criará uma lista de
pendências de muitas mensagens não processadas, resultando em longos tempos de espera.
Vejamos como algumas plataformas populares lidam com o TTL no momento da redação deste
artigo. O Google Cloud Pub/Sub é compatível com períodos de retenção de até 7 dias.
A retenção do Amazon Kinesis Data Streams pode ser ativada em até 365 dias.
O Kafka pode ser configurado para retenção indefinida, limitada pelo espaço em disco disponível.
(O Kafka também suporta a opção de gravar mensagens mais antigas no armazenamento de
objetos em nuvem, desbloqueando espaço de armazenamento e retenção praticamente ilimitados.)
Tamanho da mensagem
Uma dead letter queue separa eventos problemáticos de eventos que podem ser aceitos
pelo consumidor (Figura 7-12). Se os eventos não forem redirecionados para uma fila de
mensagens mortas, esses eventos errôneos correm o risco de bloquear a ingestão de outras
mensagens. Os engenheiros de dados podem usar uma fila de mensagens mortas para
diagnosticar por que ocorrem erros de ingestão de eventos e resolver problemas de pipeline
de dados e podem reprocessar algumas mensagens na fila após corrigir a causa subjacente
dos erros.
Figura 7-12. Eventos “bons” são passados para o consumidor, enquanto eventos “ruins” são armazenados em
uma dead letter queue
Um consumidor que assina um tópico pode obter eventos de duas maneiras: push e
pull. Vejamos como algumas tecnologias de streaming extraem e enviam dados.
Kafka e Kinesis suportam apenas assinaturas pull. Os assinantes lêem as
mensagens de um tópico e confirmam quando elas foram processadas. Além disso,
para receber assinaturas, Pub/Sub e RabbitMQ são compatíveis com assinaturas
push, permitindo que esses serviços gravem mensagens para um ouvinte.
formulários. Observe que os sistemas de ingestão de mensagens somente pull ainda podem enviar por push se
Localização
Muitas vezes, é desejável integrar o streaming em vários locais para obter redundância
aprimorada e consumir dados próximos de onde são gerados.
Como regra geral, quanto mais próxima sua ingestão estiver de onde os dados se originam,
melhor será a largura de banda e a latência. No entanto, você precisa equilibrar isso com os
custos de movimentação de dados entre regiões para executar análises em um conjunto de
dados combinado. Como sempre, os custos de saída de dados podem aumentar rapidamente.
Faça uma avaliação cuidadosa das compensações à medida que você cria sua arquitetura.
Os dados podem ser extraídos de bancos de dados para ingestão consultando e lendo em uma
conexão de rede. Mais comumente, essa conexão é feita usando ODBC ou JDBC.
O ODBC usa um driver hospedado por um cliente que acessa o banco de dados para traduzir
os comandos emitidos para a API ODBC padrão em comandos emitidos para o banco de dados.
O banco de dados retorna os resultados da consulta pela rede, onde o driver os recebe e os traduz
de volta em um formulário padrão e lido pelo cliente. Para ingestão, o aplicativo que utiliza o driver
ODBC é uma ferramenta de ingestão. A ferramenta de ingestão pode extrair dados por meio de
várias consultas pequenas ou de uma única consulta grande.
API JDBC e a interface de rede nativa do banco de dados de destino. Pode parecer
estranho ter uma API de banco de dados dedicada a uma única linguagem de programação,
mas há fortes motivações para isso. A Java Virtual Machine (JVM) é padrão, portátil em
arquiteturas de hardware e sistemas operacionais e fornece o desempenho de código
compilado por meio de um compilador just-in-time (JIT). A JVM é uma VM de compilação
extremamente popular para executar código de maneira portátil.
JDBC e ODBC são usados extensivamente para ingestão de dados de bancos de dados
relacionais, retornando ao conceito geral de conexões diretas de banco de dados.
Vários aprimoramentos são usados para acelerar a ingestão de dados. Muitas
estruturas de dados podem paralelizar várias conexões simultâneas e consultas de partição
para extrair dados em paralelo. Por outro lado, nada é de graça; o uso de conexões
paralelas também aumenta a carga no banco de dados de origem.
JDBC e ODBC foram por muito tempo os padrões ouro para ingestão de dados de
bancos de dados, mas esses padrões de conexão estão começando a mostrar sua idade
para muitos aplicativos de engenharia de dados. Esses padrões de conexão lutam com
dados aninhados e enviam dados como linhas. Isso significa que os dados aninhados
nativos devem ser recodificados como dados de string a serem enviados pela rede, e as
colunas de bancos de dados colunares devem ser serializadas novamente como linhas.
Figura 7-13. Um processo de ingestão lê de um banco de dados de origem usando JDBC e, em seguida, grava objetos no
armazenamento de objetos. Um banco de dados de destino (não mostrado) pode ser acionado para ingerir os dados
com uma chamada de API de um sistema de orquestração.
Observe que nossa discussão aqui não é exaustiva. Apresentamos padrões comuns, mas
sugerimos que você leia a documentação em um banco de dados específico para lidar com os
detalhes das estratégias do CDC.
Se a tabela de banco de dados em questão tiver um campo updated_at contendo a última vez
que um registro foi gravado ou atualizado, podemos consultar a tabela para encontrar todas as
linhas atualizadas desde um horário especificado. Definimos o carimbo de data/hora do filtro com
base na última vez em que capturamos as linhas alteradas das tabelas. Esse processo nos permite
extrair alterações e atualizar diferencialmente uma tabela de destino.
Essa forma de CDC orientado a lotes tem uma limitação importante: embora possamos
determinar facilmente quais linhas foram alteradas desde um determinado momento, não
obtemos necessariamente todas as alterações aplicadas a essas linhas. Considere o exemplo de
execução do CDC em lote em uma tabela de conta bancária a cada 24 horas.
Machine Translated by Google
Esta tabela operacional mostra o saldo da conta corrente para cada conta.
Quando o dinheiro entra e sai das contas, o aplicativo bancário executa uma transação para atualizar
o saldo.
Quando executarmos uma consulta para retornar todas as linhas da tabela de contas que foram
alteradas nas últimas 24 horas, veremos os registros de cada conta que registrou uma transação.
Suponha que um determinado cliente tenha sacado dinheiro cinco vezes usando um cartão de débito
nas últimas 24 horas. Nossa consulta retornará apenas o último saldo da conta registrado no período
de 24 horas; outros registros durante o período não aparecerão. Esse problema pode ser mitigado
utilizando um esquema somente de inserção, em que cada transação de conta é registrada como
um novo registro na tabela (consulte “Somente inserção”).
CDC contínuo
O CDC contínuo captura todo o histórico da tabela e pode oferecer suporte à ingestão de dados
quase em tempo real, seja para replicação de banco de dados em tempo real ou para alimentar
análises de streaming em tempo real. Em vez de executar consultas periódicas para obter um lote
de alterações de tabela, o CDC contínuo trata cada gravação no banco de dados como um evento.
O CDC pode ser usado para replicar entre bancos de dados: os eventos são armazenados em buffer
em um fluxo e gravados de forma assíncrona em um segundo banco de dados. Porém muitos
Machine Translated by Google
As réplicas de leitura geralmente são usadas em padrões de ingestão de dados em lote para
permitir que grandes varreduras sejam executadas sem sobrecarregar o banco de dados de
produção primário. Além disso, um aplicativo pode ser configurado para fazer failover para a
réplica se o banco de dados primário ficar indisponível. Nenhum dado será perdido no failover
porque a réplica está totalmente sincronizada com o banco de dados primário.
Considerações do CDC
Como tudo em tecnologia, o CDC não é gratuito. O CDC consome vários recursos de
banco de dados, como memória, largura de banda do disco, armazenamento, tempo de CPU
e largura de banda da rede. Os engenheiros devem trabalhar com equipes de produção e
executar testes antes de ativar o CDC em sistemas de produção para evitar problemas
operacionais. Considerações semelhantes se aplicam à replicação síncrona.
Para CDC em lote, esteja ciente de que executar qualquer consulta em lote grande em um
sistema de produção transacional pode causar carga excessiva. Execute essas consultas
apenas fora do horário comercial ou use uma réplica de leitura para evitar sobrecarregar o
banco de dados primário.
Machine Translated by Google
API
—Karl Hughes
Como mencionamos no Capítulo 5, as APIs são uma fonte de dados que continua crescendo
em importância e popularidade. Uma organização típica pode ter centenas de fontes de
dados externas, como plataformas SaaS ou empresas parceiras. A dura realidade é que não
existe um padrão adequado para troca de dados por APIs. Os engenheiros de dados podem
gastar uma quantidade significativa de tempo lendo documentação, comunicando-se com
proprietários de dados externos e escrevendo e mantendo o código de conexão da API.
Três tendências estão mudando lentamente essa situação. Primeiro, muitos fornecedores fornecem
bibliotecas cliente de API para várias linguagens de programação que removem grande parte da
complexidade do acesso à API.
Em segundo lugar, várias plataformas de conector de dados estão disponíveis agora como
SaaS, código aberto ou código aberto gerenciado. Essas plataformas fornecem conectividade
de dados pronta para uso a muitas fontes de dados; eles oferecem estruturas para escrever
conectores personalizados para fontes de dados sem suporte. Consulte “Conectores de Dados
Gerenciados”.
Não reinvente a roda quando o compartilhamento de dados não for uma opção e o acesso direto
à API for necessário. Embora um serviço gerenciado possa parecer uma opção cara, considere o
valor do seu tempo e o custo de oportunidade de criar conectores de API quando você pode gastar
seu tempo em trabalhos de maior valor.
Além disso, muitos serviços gerenciados agora oferecem suporte à criação de conectores
de API personalizados. Isso pode fornecer especificações técnicas de API em um padrão
Machine Translated by Google
Reserve seu trabalho de conexão personalizado para APIs que não são bem suportadas por
estruturas existentes; você descobrirá que ainda há muitos deles para trabalhar. O manuseio
de conexões de API personalizadas tem dois aspectos principais: desenvolvimento de software
e operações. Seguir as melhores práticas de desenvolvimento de software; você deve usar
controle de versão, entrega contínua e testes automatizados. Além de seguir as melhores
práticas de DevOps, considere uma estrutura de orquestração, que pode simplificar drasticamente
a carga operacional da ingestão de dados.
Lembre-se das diferenças entre mensagens e fluxos. Uma mensagem é tratada no nível de
evento individual e deve ser transitória. Depois que uma mensagem é consumida, ela é
reconhecida e removida da fila. Por outro lado, um fluxo ingere eventos em um log ordenado. O
log persiste pelo tempo que você desejar, permitindo que os eventos sejam consultados em vários
intervalos, agregados e combinados com outros fluxos para criar novas transformações publicadas
para consumidores downstream. Na Figura 7-14, temos dois produtores (produtores 1 e 2)
enviando eventos para dois consumidores (consumidores
Machine Translated by Google
Figura 7-14. Dois conjuntos de dados são produzidos e consumidos (produtores 1 e 2) e, em seguida,
combinados, com os dados combinados publicados para um novo produtor (produtor 3)
O último ponto é uma diferença essencial entre ingestão em lote e streaming. Enquanto
o lote geralmente envolve fluxos de trabalho estáticos (ingestão de dados, armazená-los,
transformá-los e servi-los), as mensagens e os fluxos são fluidos. A ingestão pode ser não
linear, com dados sendo publicados, consumidos, republicados e consumidos novamente. Ao
projetar seus fluxos de trabalho de ingestão em tempo real, lembre-se de como os dados fluirão.
Geralmente, as opções no espaço permitem que os usuários definam um destino e uma origem,
ingeram de várias maneiras (por exemplo, CDC, replicação, trunque e recarregue), definam
permissões e credenciais, configurem uma frequência de atualização e comecem a sincronizar
dados. O fornecedor ou a nuvem nos bastidores gerencia e monitora totalmente as sincronizações
de dados. Se a sincronização de dados falhar, você receberá um alerta com informações
registradas sobre a causa do erro.
Em nossa opinião, o armazenamento de objetos é a maneira mais otimizada e segura de lidar com
a troca de arquivos. O armazenamento em nuvem pública implementa os mais recentes padrões
de segurança, possui um histórico robusto de escalabilidade e confiabilidade, aceita arquivos de
tipos e tamanhos arbitrários e fornece movimentação de dados de alto desempenho. Discutimos o
armazenamento de objetos muito mais extensivamente no Capítulo 6.
EDI
geralmente se refere a meios um tanto arcaicos de troca de arquivos, como por e-mail ou pen drive. Os
engenheiros de dados descobrirão que algumas fontes de dados não suportam meios mais modernos
de transporte de dados, geralmente devido a sistemas de TI arcaicos ou limitações de processos
humanos.
Os engenheiros podem pelo menos aprimorar o EDI por meio da automação. Por exemplo, eles
podem configurar um servidor de e-mail baseado em nuvem que salva arquivos no armazenamento
de objetos da empresa assim que são recebidos. Isso pode acionar processos de orquestração para
ingerir e processar dados. Isso é muito mais robusto do que um funcionário baixar o arquivo anexado
e carregá-lo manualmente em um sistema interno, o que ainda vemos com frequência.
Os engenheiros devem estar cientes de como os sistemas de banco de dados de origem lidam com
a exportação de arquivos. A exportação envolve grandes varreduras de dados que carregam
significativamente o banco de dados para muitos sistemas transacionais. Os engenheiros do sistema
de origem devem avaliar quando essas verificações podem ser executadas sem afetar o desempenho
do aplicativo e podem optar por uma estratégia para mitigar a carga. As consultas de exportação
podem ser divididas em exportações menores consultando intervalos de chaves ou uma partição por vez.
Como alternativa, uma réplica de leitura pode reduzir a carga. As réplicas de leitura são
especialmente apropriadas se as exportações ocorrerem muitas vezes ao dia e coincidirem com
uma alta carga do sistema de origem.
Os principais data warehouses em nuvem são altamente otimizados para exportação direta de arquivos.
Por exemplo, Snowflake, BigQuery, Redshift e outros são compatíveis com exportação direta para
armazenamento de objetos em vários formatos.
Os engenheiros também devem estar cientes dos formatos de arquivo a serem exportados. O
CSV ainda é onipresente e altamente propenso a erros no momento da redação deste artigo. Ou
seja, o delimitador padrão do CSV também é um dos caracteres mais familiares no idioma inglês
de dados de cadeia. O CSV também não codifica nativamente informações de esquema nem
dá suporte direto a estruturas aninhadas. A codificação do arquivo CSV e as informações de
esquema devem ser configuradas no sistema de destino para garantir a ingestão apropriada. A
detecção automática é um recurso de conveniência fornecido em muitos ambientes de nuvem,
mas é inadequado para ingestão de produção. Como prática recomendada, os engenheiros
devem registrar a codificação CSV e os detalhes do esquema nos metadados do arquivo.
Formatos de exportação mais robustos e expressivos incluem Parquet, Avro, Flecha, e ORC ou
JSON. Esses formatos codificam nativamente informações de esquema e manipulam dados de
string arbitrários sem nenhuma intervenção específica. Muitos deles também lidam com estruturas
de dados aninhadas nativamente para que os campos JSON sejam armazenados usando
estruturas aninhadas internas em vez de strings simples. Para bancos de dados colunares, os
formatos colunares (Parquet, Arrow, ORC) permitem uma exportação de dados mais eficiente
porque as colunas podem ser transcodificadas diretamente entre os formatos.
Esses formatos também são geralmente mais otimizados para mecanismos de consulta. O
formato de arquivo Arrow foi projetado para mapear dados diretamente na memória do
mecanismo de processamento, proporcionando alto desempenho em ambientes de data lake.
A desvantagem desses formatos mais recentes é que muitos deles não são suportados
nativamente pelos sistemas de origem. Os engenheiros de dados geralmente são forçados a
trabalhar com dados CSV e, em seguida, criar um tratamento robusto de exceções e detecção
de erros para garantir a qualidade dos dados na ingestão. Consulte o Apêndice A para uma
discussão mais ampla sobre os formatos de arquivo.
Casca
O shell é uma interface pela qual você pode executar comandos para ingerir dados. O shell
pode ser usado para scripts de fluxos de trabalho para praticamente qualquer ferramenta de
software, e o shell script ainda é usado extensivamente em processos de ingestão. Um script
de shell pode ler dados de um banco de dados, reserializá-los em um formato de arquivo
diferente, carregá-los no armazenamento de objetos e acionar um processo de ingestão em um
banco de dados de destino. Embora o armazenamento de dados em uma única instância ou
servidor não seja altamente escalável, muitas de nossas fontes de dados não são particularmente
grandes e essas abordagens funcionam bem.
Machine Translated by Google
Além disso, os fornecedores de nuvem geralmente fornecem ferramentas robustas baseadas em CLI.
É possível executar processos de ingestão complexos simplesmente emitindo comandos para a AWS CLI.
À medida que os processos de ingestão se tornam mais complicados e o SLA se torna mais rigoroso, os
engenheiros devem considerar a mudança para um sistema de orquestração adequado.
SSH
O SSH não é uma estratégia de ingestão, mas um protocolo usado com outras estratégias de
ingestão. Usamos SSH de algumas maneiras. Primeiro, o SSH pode ser usado para transferência de
arquivos com SCP, conforme mencionado anteriormente. Em segundo lugar, os túneis SSH são
usados para permitir conexões seguras e isoladas com bancos de dados.
SFTP e SCP
Acessar e enviar dados de FTP seguro (SFTP) e cópia segura (SCP) são técnicas com as quais você
deve estar familiarizado, mesmo que os engenheiros de dados normalmente não as usem regularmente
(TI ou segurança/secOps cuidarão disso).
Os engenheiros se assustam com a menção do SFTP (ocasionalmente, até ouvimos casos de FTP
sendo usados na produção). Independentemente disso, o SFTP ainda é uma realidade prática para muitas
empresas. Eles trabalham com empresas parceiras que consomem ou fornecem dados usando SFTP e
não estão dispostos a confiar em outros padrões. Para evitar vazamentos de dados, a análise de
segurança é fundamental nessas situações.
SCP é um protocolo de troca de arquivos que é executado em uma conexão SSH relacionada ao SSH. O
SCP pode ser uma opção segura de transferência de arquivos se estiver configurado corretamente.
Machine Translated by Google
Webhooks
Webhooks, como discutimos no Capítulo 5, são frequentemente chamados de APIs
reversas. Para uma API de dados REST típica, o provedor de dados fornece especificações de
API aos engenheiros que eles usam para escrever seu código de ingestão de dados. O código
faz solicitações e recebe dados em respostas.
Com um webhook (Figura 7-15), o provedor de dados define uma especificação de solicitação
de API, mas o provedor de dados faz chamadas de API em vez de recebê-las; é
responsabilidade do consumidor de dados fornecer um endpoint de API para o provedor chamar.
O consumidor é responsável por ingerir cada solicitação e manipular a agregação, armazenamento
e processamento de dados.
Figura 7-15. Uma arquitetura básica de ingestão de webhook criada a partir de serviços em nuvem
Você notará que essa arquitetura faz muito mais do que simplesmente ingerir os dados. Isso
ressalta o emaranhamento da ingestão com os outros estágios do
Machine Translated by Google
ciclo de vida da engenharia de dados; muitas vezes é impossível definir sua arquitetura de ingestão sem
Interface web
As interfaces da Web para acesso a dados continuam sendo uma realidade prática para engenheiros de dados.
Frequentemente nos deparamos com situações em que nem todos os dados e funcionalidades em uma
plataforma SaaS são expostos por meio de interfaces automatizadas, como APIs e descartes de arquivos.
Em vez disso, alguém deve acessar manualmente uma interface da Web, gerar um relatório e baixar um arquivo
para uma máquina local. Isso tem desvantagens óbvias, como pessoas que se esquecem de executar o relatório
ou que seus laptops morrem. Sempre que possível, escolha ferramentas e fluxos de trabalho que permitam o
Raspagem da web
combinando os vários elementos HTML da página da Web. Você pode raspar sites de comércio
eletrônico para extrair informações de preços de produtos ou raspar vários sites de notícias para seu
agregador de notícias. A raspagem da Web é generalizada e você pode encontrá-la como engenheiro de
dados. É também uma área obscura onde as linhas éticas e legais são borradas.
Aqui estão alguns conselhos de alto nível a serem observados antes de iniciar qualquer projeto de raspagem
na web. Primeiro, pergunte a si mesmo se você deveria estar raspando na web ou se os dados estão disponíveis
de terceiros. Se sua decisão é raspar na web, seja um bom cidadão. Não crie inadvertidamente um ataque de
negação de serviço (DoS) e não bloqueie seu endereço IP. Entenda a quantidade de tráfego que você gera e
regule adequadamente suas atividades de rastreamento na Web. Só porque você pode criar milhares de funções
Lambda simultâneas para raspar não significa que você deveria; a extração excessiva da web pode levar à
Em segundo lugar, esteja ciente das implicações legais de suas atividades. Novamente, gerar
ataques DoS pode acarretar consequências legais. Ações que violam os termos de serviço podem causar
Terceiro, as páginas da web mudam constantemente sua estrutura de elementos HTML, tornando
difícil manter seu web scraper atualizado. Pergunte a si mesmo, a dor de cabeça de manter esses
sistemas vale o esforço?
nuvens, as taxas de saída de dados tornam isso uma proposta cara. Os dispositivos de transferência
física são uma alternativa mais barata quando os volumes de dados são significativos.
ingestão de dados únicos e não são sugeridos para cargas de trabalho contínuas. Suponha que você tenha
cargas de trabalho que exigem movimentação constante de dados em um cenário híbrido ou multicloud. Nesse
caso, seus tamanhos de dados provavelmente estão agrupando ou transmitindo tamanhos de dados muito
menores continuamente.
Compartilhamento de dados
O compartilhamento de dados está crescendo como uma opção popular para o consumo de
dados (consulte os Capítulos 5 e 6.) Os provedores de dados oferecerão conjuntos de dados para
assinantes de terceiros, gratuitamente ou a um custo. Esses conjuntos de dados geralmente são
compartilhados de forma somente leitura, o que significa que você pode integrar esses conjuntos de dados
com seus próprios dados (e outros conjuntos de dados de terceiros), mas você não possui o conjunto de dados compartilhado.
No sentido estrito, isso não é ingestão, onde você obtém a posse física do conjunto de dados. Se o provedor
de dados decidir remover seu acesso a um conjunto de dados, você não terá mais acesso a ele.
Muitas plataformas de nuvem oferecem compartilhamento de dados, permitindo que você compartilhe
seus dados e consuma dados de vários provedores. Algumas dessas plataformas também fornecem
marketplaces de dados onde empresas e organizações podem oferecer seus dados para venda.
pipelines de ingestão de dados, os engenheiros de dados trabalharão com pessoas e sistemas localizados
Muitas vezes existe uma desconexão significativa entre os responsáveis pela geração de dados
Muitas vezes, vemos engenheiros de dados buscando projetos sofisticados (por exemplo,
barramentos de streaming em tempo real ou sistemas de dados complexos), enquanto os
gerentes de marketing digital ao lado ficam baixando relatórios do Google Ads manualmente.
Veja a engenharia de dados como um negócio e reconheça quem são seus clientes. Muitas
vezes, a automação básica dos processos de ingestão tem um valor significativo,
especialmente para departamentos como marketing, que controlam orçamentos enormes e
estão no centro da receita dos negócios. O trabalho básico de ingestão pode parecer tedioso,
mas entregar valor a essas partes principais da empresa abrirá mais orçamento e oportunidades
de engenharia de dados de longo prazo mais empolgantes.
Mais uma vez, comunicação é a palavra de ordem. A comunicação honesta desde o início e
com frequência com as partes interessadas ajudará bastante a garantir que sua ingestão de
dados agregue valor.
Subcorrentes
Praticamente todas as subcorrentes tocam a fase de ingestão, mas vamos enfatizar
as mais salientes aqui.
Segurança
A movimentação de dados apresenta vulnerabilidades de segurança porque você precisa
transferir dados entre locais. A última coisa que você deseja é capturar ou comprometer os
dados durante a movimentação.
Machine Translated by Google
Considere onde os dados estão e para onde estão indo. Os dados que precisam ser
movidos em sua VPC devem usar endpoints seguros e nunca sair dos limites da VPC.
Use uma VPN ou uma conexão privada dedicada se precisar enviar dados entre a nuvem
e uma rede local. Isso pode custar dinheiro, mas a segurança é um bom investimento. Se
seus dados atravessarem a internet pública, certifique-se de que a transmissão seja
criptografada. É sempre uma boa prática criptografar dados pela rede.
Gestão de dados
Naturalmente, o gerenciamento de dados começa na ingestão de dados. Este é o ponto
de partida para catalogação de linhagem e dados; a partir deste ponto, os engenheiros
de dados precisam pensar no gerenciamento de dados mestre, ética, privacidade e
conformidade.
Alterações de esquema
Uma solução possível, sobre a qual nós, os autores, meditamos por um tempo, é uma
abordagem pioneira no controle de versão do Git. Quando Linus Torvalds estava
desenvolvendo o Git, muitas de suas escolhas foram inspiradas nas limitações do
Concurrent Versions System (CVS). O CVS é totalmente centralizado; ele suporta
apenas uma versão oficial atual do código, armazenada em um servidor de projeto central.
Para tornar o Git um sistema verdadeiramente distribuído, Torvalds
Machine Translated by Google
usou a noção de árvore; cada desenvolvedor pode manter sua ramificação processada do
código e, em seguida, mesclar de ou para outras ramificações.
Há alguns anos, tal abordagem aos dados era impensável. Os sistemas MPP locais são
normalmente operados perto da capacidade máxima de armazenamento.
No entanto, o armazenamento é barato em ambientes de big data e data
warehouse em nuvem. Pode-se facilmente manter várias versões de uma tabela com
diferentes esquemas e até mesmo diferentes transformações upstream. As equipes podem
oferecer suporte a várias versões de “desenvolvimento” de uma tabela usando ferramentas de
orquestração, como Airflow; alterações de esquema, transformação upstream e alterações de
código podem aparecer nas tabelas de desenvolvimento antes das alterações oficiais na tabela
principal .
Os engenheiros de dados devem sempre se treinar para fazer essa pergunta ao configurar
pipelines de ingestão. Eles inevitavelmente encontrarão dados confidenciais; a tendência natural
é ingeri-lo e encaminhá-lo para a próxima etapa do pipeline. Mas se esses dados não são
necessários, por que coletá-los? Por que não simplesmente descartar os campos confidenciais
antes que os dados sejam armazenados? Os dados não podem vazar se nunca forem coletados.
Os engenheiros de dados não podem evitar trabalhar com dados altamente confidenciais
em alguns casos. Alguns sistemas analíticos devem apresentar informações confidenciais e
identificáveis. Os engenheiros devem agir de acordo com os mais altos padrões éticos
sempre que lidarem com dados confidenciais. Além disso, eles podem implementar uma
variedade de práticas para reduzir o manuseio direto de dados confidenciais. Apontar como
Machine Translated by Google
tanto quanto possível para a produção sem toque onde estão envolvidos dados sensíveis.
Isso significa que os engenheiros desenvolvem e testam código em dados simulados ou
limpos em ambientes de desenvolvimento e preparação, mas implantações de código
automatizadas para produção.
A produção sem toque é um ideal pelo qual os engenheiros devem lutar, mas
inevitavelmente surgem situações que não podem ser totalmente resolvidas em ambientes
de desenvolvimento e preparação. Alguns bugs podem não ser reproduzíveis sem olhar para os
dados ao vivo que estão acionando uma regressão. Para esses casos, implemente um processo
de vidro quebrado: exija pelo menos duas pessoas para aprovar o acesso a dados confidenciais
no ambiente de produção. Esse acesso deve ter um escopo restrito para um problema específico
e ter uma data de expiração.
DataOps
Pipelines de dados confiáveis são a base do ciclo de vida da engenharia de dados.
Quando eles falham, todas as dependências downstream param bruscamente.
Data warehouses e data lakes não são reabastecidos com dados atualizados, e os cientistas e
analistas de dados não podem fazer seu trabalho com eficiência; o negócio é forçado a voar às
cegas.
Machine Translated by Google
Garantir que seus pipelines de dados sejam monitorados adequadamente é uma etapa crucial
para a confiabilidade e a resposta eficaz a incidentes. Se há um estágio no ciclo de vida da
engenharia de dados em que o monitoramento é crítico, é no estágio de ingestão. Monitoramento
fraco ou inexistente significa que as tubulações podem ou não estar funcionando. Voltando à
nossa discussão anterior sobre o tempo, certifique-se de acompanhar os vários aspectos do
tempo – criação de eventos, ingestão, processo e tempos de processamento. Seus pipelines de
dados devem processar dados de forma previsível em lotes ou fluxos. Vimos inúmeros exemplos
de relatórios e modelos de ML gerados a partir de dados obsoletos. Em um caso extremo, uma
falha no pipeline de ingestão não foi detectada por seis meses. (Pode-se questionar a utilidade
concreta dos dados neste caso, mas isso é outra questão.) Isso era muito evitável por meio de
monitoramento adequado.
O que você deve monitorar? O tempo de atividade, a latência e os volumes de dados processados
são bons pontos de partida. Se um trabalho de ingestão falhar, como você responderá? Em geral,
crie monitoramento em seus pipelines desde o início, em vez de aguardar a implantação.
Isso também se aplica a serviços de terceiros. No caso desses serviços, o que você ganhou em
termos de eficiência operacional enxuta (redução do número de funcionários) é substituído por
sistemas dos quais você depende de estar fora de seu controle. Se você estiver usando um
serviço de terceiros (nuvem, serviço de integração de dados etc.), como você será alertado se
houver uma interrupção? Qual é o seu plano de resposta se um serviço do qual você depende de
repente ficar offline?
Infelizmente, não existe um plano de resposta universal para falhas de terceiros. Se você puder
fazer failover para outros servidores, de preferência em outra zona ou região, configure isso
definitivamente.
Machine Translated by Google
Se seus processos de ingestão de dados são criados internamente, você tem a automação adequada de
teste e implantação para garantir que o código funcione em produção? E se o código estiver com bugs ou
Muitas vezes nos referimos aos dados como um assassino silencioso. Se dados válidos e de
qualidade são a base do sucesso nos negócios de hoje, usar dados ruins para tomar decisões é
muito pior do que não ter dados. Dados incorretos causaram danos incalculáveis às empresas; esses
Os dados são entrópicos; muitas vezes muda de maneiras inesperadas sem aviso prévio. Uma das diferenças
inerentes entre DevOps e DataOps é que esperamos regressões de software apenas quando implantamos
alterações, enquanto os dados geralmente apresentam regressões de forma independente devido a eventos
Os engenheiros de DevOps normalmente são capazes de detectar problemas usando condições binárias.
A taxa de falha de solicitação violou um determinado limite? Como sobre a latência de resposta? No espaço
de dados, as regressões geralmente se manifestam como distorções estatísticas sutis. Uma mudança nas
estatísticas dos termos de pesquisa é resultado do comportamento do cliente? De um pico no tráfego de bots
que escapou da rede? De uma ferramenta de teste de site implantada em alguma outra parte da empresa?
Assim como as falhas do sistema no DevOps, algumas regressões de dados são imediatamente visíveis.
Por exemplo, no início dos anos 2000, o Google fornecia termos de pesquisa para sites quando os usuários
chegavam da pesquisa. Em 2011, o Google começou a reter essas informações em alguns casos para
As regressões de dados verdadeiramente perigosas são silenciosas e podem vir de dentro ou de fora de uma
empresa. Os desenvolvedores de aplicativos podem alterar o significado dos campos do banco de dados sem
Alterações nos dados de fontes de terceiros podem passar despercebidas. Na melhor das hipóteses, os
relatórios quebram de maneiras óbvias. Muitas vezes, as métricas de negócios são distorcidas sem o
conhecimento dos tomadores de decisão.
Machine Translated by Google
Sempre que possível, trabalhe com engenheiros de software para corrigir problemas de qualidade
de dados na origem. É surpreendente quantos problemas de qualidade de dados podem ser
tratados respeitando as melhores práticas básicas de engenharia de software, como logs para
capturar o histórico de alterações de dados, verificações (nulls, etc.) e tratamento de exceções
(try, catch, etc.) .
Orquestração
A ingestão geralmente fica no início de um gráfico de dados grande e complexo; como a ingestão
é o primeiro estágio do ciclo de vida da engenharia de dados, os dados ingeridos fluirão para
muitas outras etapas de processamento de dados e os dados de muitas fontes se misturarão de
maneiras complexas. Como enfatizamos ao longo deste livro, a orquestração é um processo crucial
para coordenar essas etapas.
Engenharia de software
O estágio de ingestão do ciclo de vida da engenharia de dados é intensivo em
engenharia. Esse estágio fica na borda do domínio da engenharia de dados e geralmente faz
interface com sistemas externos, onde os engenheiros de software e dados precisam construir
uma variedade de encanamentos personalizados.
Machine Translated by Google
Ao escrever software, seu código precisa ser desacoplado. Evite escrever sistemas monolíticos
com fortes dependências nos sistemas de origem ou destino.
Conclusão
Em seu trabalho como engenheiro de dados, a ingestão provavelmente consumirá uma parte
significativa de sua energia e esforço. No centro, a ingestão é o encanamento, conectando canos
a outros canos, garantindo que os dados fluam de forma consistente e segura para seu destino.
Às vezes, as minúcias da ingestão podem parecer tediosas, mas os aplicativos de dados
empolgantes (por exemplo, análise e ML) não podem acontecer sem ela.
Como enfatizamos, também estamos no meio de uma mudança radical, passando de lote para
pipelines de dados de streaming. Esta é uma oportunidade para os engenheiros de dados
descobrirem aplicativos interessantes para streaming de dados, comunicá-los aos negócios e
implantar novas tecnologias interessantes.
Recursos adicionais
Os "pipelines de streaming" do Google Cloud página da Internet
2 Danny Sullivan, “Dark Google: um ano desde que os termos de pesquisa foram 'não fornecidos'”
MarTech, 19 de outubro de 2012, https://oreil.ly/Fp8ta
Machine Translated by Google
Até este ponto, os estágios do ciclo de vida da engenharia de dados consistiam principalmente em passar dados de um lugar para outro ou armazená-
los. Neste capítulo, você aprenderá como tornar os dados úteis. Ao compreender as consultas, modelagem e transformações (consulte a Figura 8-1),
você terá as ferramentas para transformar os ingredientes de dados brutos em algo consumível pelas partes interessadas a jusante.
Figura 8-1. As transformações nos permitem criar valor a partir dos dados
Discutiremos primeiro as consultas e os padrões significativos subjacentes a elas. Em segundo lugar, veremos os principais padrões de
modelagem de dados que você pode usar para introduzir a lógica de negócios em seus dados. Em seguida, abordaremos as transformações, que
pegam a lógica de seus modelos de dados e os resultados das consultas e os tornam úteis para um consumo downstream mais direto. Por fim,
abordaremos com quem você trabalhará e as tendências ocultas relacionadas a este capítulo.
Uma variedade de técnicas pode ser usada para consultar, modelar e transformar dados em bancos de dados SQL e NoSQL. Esta seção se
concentra nas consultas feitas em um sistema OLAP, como um data warehouse ou data lake. Embora existam muitas linguagens para
consulta, por conveniência e familiaridade, ao longo da maior parte deste capítulo, vamos nos concentrar fortemente no SQL, a linguagem de
consulta mais popular e universal. A maioria dos conceitos para bancos de dados OLAP e SQL serão traduzidos para outros tipos de bancos de
dados e linguagens de consulta. Este capítulo pressupõe que você entenda a linguagem SQL e conceitos relacionados, como chaves primárias e
estrangeiras. Se essas ideias não são familiares para você, inúmeros recursos estão disponíveis para ajudá-lo a começar.
Uma nota sobre os termos usados neste capítulo. Por conveniência, usaremos o termo banco de dados como um atalho para um mecanismo de
consulta e o armazenamento que ele está consultando; pode ser um data warehouse na nuvem ou o Apache Spark consultando dados armazenados
no S3. Assumimos que o banco de dados possui um mecanismo de armazenamento que organiza os dados sob o capô. Isso se estende a consultas
baseadas em arquivo (carregar um arquivo CSV em um bloco de anotações Python) e consultas em formatos de arquivo como Parquet.
Além disso, observe que este capítulo se concentra principalmente na consulta, nos padrões de modelagem e nas transformações
relacionadas a dados estruturados e semiestruturados, que os engenheiros de dados usam com frequência. Muitas das práticas discutidas
também podem ser aplicadas ao trabalho com dados não estruturados, como imagens, vídeo e texto bruto.
Antes de começarmos a modelar e transformar dados, vejamos as consultas — o que são, como funcionam, considerações para melhorar
o desempenho da consulta e consultas sobre dados de streaming.
Consultas
Machine Translated by Google
As consultas são uma parte fundamental da engenharia de dados, ciência de dados e análise. Antes de aprender sobre os padrões
e tecnologias subjacentes para transformações, você precisa entender o que são as consultas, como elas funcionam em vários dados e técnicas
para melhorar o desempenho da consulta.
Esta seção se preocupa principalmente com consultas em dados tabulares e semiestruturados. Como engenheiro de dados, você consultará
e transformará com mais frequência esses tipos de dados. Antes de entrarmos em tópicos mais complicados sobre consultas e transformações,
vamos começar respondendo a uma pergunta bem simples: o que é uma consulta?
Muitas vezes encontramos pessoas que sabem escrever SQL, mas não estão familiarizadas com o funcionamento de uma consulta.
Parte desse material introdutório sobre consultas será familiar para engenheiros de dados experientes; sinta-se à vontade para pular adiante se
isso se aplicar a você.
Uma consulta permite que você recupere e atue nos dados. Lembre-se de nossa conversa no Capítulo 5 sobre CRUD. Quando uma consulta
recupera dados, ela está emitindo uma solicitação para ler um padrão de registros. Este é o R (lido) no CRUD. Você pode emitir uma consulta
que obtém todos os registros de uma tabela foo, como SELECT * FROM foo. Ou, você pode aplicar um predicado (condição lógica) para filtrar
seus dados recuperando apenas registros onde o id é 1, usando a consulta SQL SELECT
* DE foo ONDE id=1.
Muitos bancos de dados permitem que você crie, atualize e exclua dados. Estes são os CUD em CRUD; sua consulta criará, modificará ou
destruirá registros existentes. Vamos revisar alguns outros acrônimos comuns que você encontrará ao trabalhar com linguagens de consulta.
Em alto nível, primeiro você precisa criar os objetos de banco de dados antes de adicionar dados. Você usará comandos de
linguagem de definição de dados (DDL) para realizar operações em objetos de banco de dados, como o próprio banco de dados, esquemas,
tabelas ou usuários; DDL define o estado dos objetos em seu banco de dados.
Os engenheiros de dados usam expressões SQL DDL comuns: CREATE, DROP e UPDATE. Por exemplo, você pode criar um banco de dados
usando a barra CREATE DATABASE da expressão DDL. Depois disso, você também pode criar novas tabelas (CREATE table bar_table) ou
excluir uma tabela (DROP table bar_table).
Depois de usar DDL para definir objetos de banco de dados, você precisa adicionar e alterar dados nesses objetos, que é o objetivo
principal da linguagem de manipulação de dados (DML). Alguns comandos DML comuns que você usará como engenheiro de dados
são os seguintes:
SELECIONAR
INSERIR
ATUALIZAR
EXCLUIR
CÓPIA DE
MERGE
Por exemplo, você pode INSERIR novos registros em uma tabela de banco de dados, ATUALIZAR os existentes e SELECIONAR registros
específicos.
Você provavelmente deseja limitar o acesso a objetos de banco de dados e controlar com precisão quem tem acesso a quê. A linguagem
de controle de dados (DCL) permite controlar o acesso aos objetos do banco de dados ou aos dados usando comandos SQL como GRANT,
DENY e REVOKE.
Vamos ver um breve exemplo usando comandos DCL. Uma nova cientista de dados chamada Sarah ingressa na sua empresa e precisa de
acesso somente leitura a um banco de dados chamado data_science_db. Você concede a Sarah acesso a esse banco de dados usando o
seguinte comando DCL:
Machine Translated by Google
É um mercado de trabalho aquecido, e Sarah trabalhou na empresa por apenas alguns meses antes de ser roubada por uma grande empresa de tecnologia. Até
mais, Sara! Sendo um engenheiro de dados preocupado com a segurança, você remove a capacidade de Sarah de ler o banco de dados:
Solicitações e problemas de controle de acesso são comuns, e entender a DCL ajudará você a resolver problemas se você ou um membro da equipe não puder
acessar os dados de que precisam, bem como impedir o acesso a dados de que não precisam.
TCL
TCL significa linguagem de controle de transações. Como o nome sugere, o TCL suporta comandos que controlam os detalhes das transações. Com o
TCL, podemos definir pontos de verificação de confirmação, condições em que as ações serão revertidas e muito mais. Dois comandos TCL comuns incluem
COMMIT e ROLLBACK.
funciona uma consulta e o que acontece quando uma consulta é executada? Vamos abordar os fundamentos de alto nível da execução de consultas (Figura
8-2), usando um exemplo de uma consulta SQL típica em execução em um banco de dados.
Embora a execução de uma consulta possa parecer simples – escreva código, execute-o e obtenha resultados – muita coisa está acontecendo nos bastidores.
Quando você executa uma consulta SQL, aqui está um resumo do que acontece:
1. O mecanismo de banco de dados compila o SQL, analisando o código para verificar a semântica adequada e garantindo que os objetos de banco de
dados referenciados existam e que o usuário atual tenha o acesso apropriado a esses objetos.
2. O código SQL é convertido em bytecode. Este bytecode expressa os passos que devem ser executados no
mecanismo de banco de dados em um formato eficiente e legível por máquina.
3. O otimizador de consultas do banco de dados analisa o bytecode para determinar como executar a consulta, reordenando e
etapas de refatoração para usar os recursos disponíveis da maneira mais eficiente possível.
podem ter tempos de execução muito diferentes, dependendo de como são executadas. O trabalho de um otimizador de consulta é otimizar o desempenho da
consulta e minimizar os custos dividindo a consulta em etapas apropriadas em uma ordem eficiente. O otimizador avaliará junções, índices, tamanho da varredura
de dados e outros fatores. O otimizador de consulta tenta executar a consulta da maneira menos dispendiosa.
Os otimizadores de consulta são fundamentais para o desempenho da sua consulta. Cada banco de dados é diferente e executa consultas de maneiras
que são óbvia e sutilmente diferentes umas das outras. Você não trabalhará diretamente com um otimizador de consulta, mas entender algumas de suas
funcionalidades o ajudará a escrever consultas com melhor desempenho. Você precisará saber como analisar o desempenho de uma consulta, usando itens
como um plano de explicação ou análise de consulta, descritos na seção a seguir.
Na engenharia de dados, você inevitavelmente encontrará consultas com desempenho insatisfatório. Saber identificar e corrigir essas consultas
é inestimável. Não lute contra seu banco de dados. Aprenda a trabalhar com seus pontos fortes e aumentar suas fraquezas. Esta seção mostra
várias maneiras de melhorar o desempenho da consulta.
conjunto de dados (como uma tabela ou arquivo) raramente é útil sozinho; criamos valor combinando-o com outros conjuntos de dados. As
junções são um dos meios mais comuns de combinar conjuntos de dados e criar novos. Presumimos que você esteja familiarizado com os
tipos significativos de junções (por exemplo, interna, externa, esquerda, cruzada) e os tipos de relacionamentos de junção (por exemplo, um
para um, um para muitos, muitos para um e muitos para muitos) .
As junções são críticas na engenharia de dados e têm bom suporte e desempenho em muitos bancos de dados. Mesmo bancos de dados
colunares, que no passado tinham uma reputação de desempenho lento de junção, agora geralmente oferecem excelente desempenho.
Uma técnica comum para melhorar o desempenho da consulta é pré-juntar dados. Se você achar que as consultas de análise estão juntando
os mesmos dados repetidamente, geralmente faz sentido juntar os dados com antecedência e fazer com que as consultas sejam lidas da
versão pré-juntada dos dados para que você não repita o trabalho computacionalmente intensivo. Isso pode significar alterar o esquema e
relaxar as condições de normalização para ampliar as tabelas e utilizar estruturas de dados mais recentes (como arrays ou structs) para substituir
relacionamentos de entidade frequentemente associados. Outra estratégia é manter um esquema mais normalizado, mas pré-juntar tabelas para
os casos de uso de análise e ciência de dados mais comuns. Podemos simplesmente criar tabelas pré-juntadas e treinar os usuários para utilizá-
las ou ingressar em visualizações materializadas (consulte “Visualizações materializadas, federação e virtualização de consultas”).
Em seguida, considere os detalhes e a complexidade de suas condições de associação. A lógica de junção complexa pode consumir recursos
computacionais significativos. Podemos melhorar o desempenho de junções complexas de algumas maneiras.
Muitos bancos de dados orientados a linhas permitem indexar um resultado calculado a partir de uma linha. Por exemplo, o PostgreSQL permite
que você crie um índice em um campo de string convertido para minúsculas; quando o otimizador encontra uma consulta onde a função lower()
aparece dentro de um predicado, ele pode aplicar o índice. Você também pode criar uma nova coluna derivada para ingressar, embora precise
treinar os usuários para ingressar nessa coluna.
EXPLOSÃO DE LINHA
1
Um problema obscuro, mas frustrante, é a explosão de linhas. Isso ocorre quando temos um grande número de correspondências muitos
para muitos, seja por repetição em chaves de junção ou como consequência da lógica de junção. Suponha que a chave de junção na tabela
A tenha o valor repetido cinco vezes e a chave de junção na tabela B contenha esse mesmo valor repetido 10 vezes. Isso leva a uma junção
cruzada dessas linhas: cada linha this da tabela A emparelhada com cada linha this da tabela B. Isso cria 5 × 10 = 50 linhas na saída. Agora
suponha que muitas outras repetições estejam na chave de junção. A explosão de linhas geralmente gera linhas suficientes para consumir
uma grande quantidade de recursos de banco de dados ou até mesmo causar a falha de uma consulta.
Também é essencial saber como seu otimizador de consulta lida com junções. Alguns bancos de dados podem reordenar junções e
predicados, enquanto outros não. Uma explosão de linha em um estágio de consulta inicial pode fazer com que a consulta falhe,
mesmo que um predicado posterior remova corretamente muitas das repetições na saída. A reordenação de predicados pode reduzir
significativamente os recursos computacionais exigidos por uma consulta.
Finalmente, use expressões de tabela comuns (CTEs) em vez de subconsultas aninhadas ou tabelas temporárias. Os CTEs permitem que os
usuários componham consultas complexas de forma legível, ajudando você a entender o fluxo de sua consulta. A importância da legibilidade
para consultas complexas não pode ser subestimada.
Em muitos casos, os CTEs também oferecem melhor desempenho do que um script que cria tabelas intermediárias; se você precisar criar
tabelas intermediárias, considere criar tabelas temporárias. Se você quiser saber mais sobre CTEs, uma rápida pesquisa na web trará muitas
informações úteis.
Como você aprendeu na seção anterior, o otimizador de consulta do banco de dados influencia a execução de uma consulta. O plano de explicação do
otimizador de consulta mostrará como o otimizador de consulta determinou sua consulta de custo mais baixo ideal, os objetos de banco de dados usados
(tabelas, índices, cache etc.) e várias estatísticas de consumo de recursos e desempenho em cada estágio de consulta. Alguns bancos de dados fornecem uma
representação visual dos estágios de consulta. Em contrapartida, outros disponibilizam o plano de explicação via SQL com o comando EXPLAIN, que exibe a
sequência de etapas que o banco de dados seguirá para executar a consulta.
Além de usar EXPLAIN para entender como sua consulta será executada, você deve monitorar o desempenho de sua consulta, visualizando
métricas de consumo de recursos do banco de dados. A seguir estão algumas áreas para monitorar:
Tempo de execução da consulta, número de registros, tamanho dos dados verificados e quantidade de dados embaralhados.
Consultas concorrentes que podem causar contenção de recursos em seu banco de dados.
Número de conexões simultâneas usadas versus conexões disponíveis. Conexões simultâneas com excesso de assinaturas podem ter efeitos negativos
Todas as consultas verificam os dados, mas nem todas as verificações são criadas da mesma forma. Como regra geral, você deve consultar apenas os dados
necessários. Ao executar SELECT * sem predicados, você está varrendo a tabela inteira e recuperando cada linha e coluna. Isso é muito ineficiente em termos
de desempenho e caro, especialmente se você estiver usando um banco de dados de pagamento conforme o uso que cobra por bytes verificados ou recursos
de computação utilizados durante a execução de uma consulta.
Sempre que possível, use a remoção para reduzir a quantidade de dados verificados em uma consulta. Bancos de dados colunares e orientados a linhas
requerem diferentes estratégias de poda. Em um banco de dados orientado a colunas, você deve selecionar apenas as colunas necessárias. A maioria dos
bancos de dados OLAP orientados a colunas também fornece ferramentas adicionais para otimizar suas tabelas para um melhor desempenho de consulta.
Por exemplo, se você tiver uma tabela muito grande (vários terabytes de tamanho ou mais)
O Snowflake e o BigQuery oferecem a opção de definir uma chave de cluster em uma tabela, que ordena os dados da tabela de forma a permitir que as
consultas acessem com mais eficiência partes de conjuntos de dados muito grandes. O BigQuery também permite particionar uma tabela em segmentos
menores, permitindo consultar apenas partições específicas em vez de toda a tabela.
(Esteja ciente de que estratégias inadequadas de clustering e distribuição de chaves podem prejudicar o desempenho.)
Em bancos de dados orientados a linhas, a poda geralmente se concentra em índices de tabela, que você aprendeu no Capítulo 6. A estratégia geral é
criar índices de tabela que melhorarão o desempenho de suas consultas mais sensíveis ao desempenho, sem sobrecarregar a tabela com tantos índices
que você degrada o desempenho.
confirmação de banco de dados é uma alteração em um banco de dados, como criar, atualizar ou excluir um registro, tabela ou outros objetos de banco de
dados. Muitos bancos de dados suportam transações — ou seja, uma noção de confirmação de várias operações simultaneamente de forma a manter um
estado consistente. Observe que o termo transação está um pouco sobrecarregado; consulte o Capítulo 5. O propósito de uma transação é manter um
estado consistente de um banco de dados enquanto estiver ativo e em caso de falha. As transações também tratam do isolamento quando vários eventos
simultâneos podem estar lendo, gravando e excluindo dos mesmos objetos de banco de dados. Sem transações, os usuários obteriam informações
potencialmente conflitantes ao consultar um banco de dados.
Você deve estar intimamente familiarizado com a forma como seu banco de dados lida com confirmações e transações e determinar a consistência esperada
dos resultados da consulta. Seu banco de dados lida com gravações e atualizações de maneira compatível com ACID? Sem conformidade ACID, sua
consulta pode retornar resultados inesperados. Isso pode resultar de uma leitura suja, que acontece quando uma linha é lida e uma transação não confirmada
alterou a linha. As leituras sujas são um comportamento esperado do seu banco de dados? Se sim, como você lida com isso? Além disso, esteja ciente de
que durante as transações de atualização e exclusão, alguns bancos de dados criam novos arquivos para representar o novo estado do banco de dados e
retêm os arquivos antigos para
Machine Translated by Google
referências de ponto de verificação de falha. Nesses bancos de dados, a execução de um grande número de pequenas confirmações pode causar
confusão e consumir um espaço de armazenamento significativo que pode precisar ser limpo periodicamente.
Vamos considerar brevemente três bancos de dados para entender o impacto dos commits (observe que esses exemplos são atuais no momento da
redação deste artigo). Primeiro, suponha que estamos olhando para um RDBMS PostgreSQL e aplicando transações ACID.
Cada transação consiste em um pacote de operações que falharão ou serão bem-sucedidas como um grupo. Também podemos executar consultas
de análise em várias linhas; essas consultas apresentarão uma imagem consistente do banco de dados em um determinado momento.
A desvantagem da abordagem do PostgreSQL é que ela requer bloqueio de linha (bloqueio de leituras e gravações em determinadas linhas), o que
pode prejudicar o desempenho de várias maneiras. O PostgreSQL não é otimizado para grandes varreduras ou grandes quantidades de dados
apropriados para aplicativos de análise de grande escala.
Em seguida, considere o Google BigQuery. Ele utiliza um modelo de confirmação de tabela completa point-in-time. Quando uma consulta de leitura é
emitida, o BigQuery lê o último snapshot confirmado da tabela. Quer a consulta seja executada por um segundo ou duas horas, ela lerá apenas a partir
desse instantâneo e não verá nenhuma alteração subsequente. O BigQuery não bloqueia a tabela enquanto eu leio nela. Em vez disso, as operações
de gravação subsequentes criarão novas confirmações e novos instantâneos enquanto a consulta continua a ser executada no instantâneo em que foi
iniciada.
Para evitar o estado inconsistente, o BigQuery permite apenas uma operação de gravação por vez. Nesse sentido, o BigQuery não oferece
nenhuma simultaneidade de gravação. (No sentido de que ele pode gravar grandes quantidades de dados em paralelo dentro de uma única consulta
de gravação, é altamente concorrente.) Se mais de um cliente tentar gravar simultaneamente, as consultas de gravação serão enfileiradas por ordem
de chegada. O modelo de confirmação do BigQuery é semelhante aos modelos de confirmação usados pelo Snowflake, Spark e outros.
Por último, vamos considerar o MongoDB. Nos referimos ao MongoDB como um banco de dados de consistência variável. Os engenheiros têm
várias opções de consistência configuráveis, tanto para o banco de dados quanto no nível de consultas individuais. O MongoDB é celebrado por sua
extraordinária escalabilidade e simultaneidade de gravação, mas é um tanto notório por problemas que surgem quando os engenheiros o abusam.
2
Por exemplo, em certos modos, o MongoDB suporta desempenho de gravação ultra-alto. No entanto, isso tem um custo: o banco de dados descartará
gravações sem cerimônia e silenciosamente se ficar sobrecarregado com tráfego. Isso é perfeitamente adequado para aplicativos que podem perder
alguns dados, por exemplo, aplicativos de IoT em que simplesmente queremos muitas medições, mas não nos preocupamos em capturar todas as
medições. Não é uma ótima opção para aplicativos que precisam capturar dados e estatísticas exatos.
Nada disso quer dizer que esses são bancos de dados ruins. Eles são todos bancos de dados fantásticos quando são escolhidos para aplicativos
apropriados e configurados corretamente. O mesmo vale para praticamente qualquer tecnologia de banco de dados.
As empresas não contratam engenheiros simplesmente para hackear o código isoladamente. Para serem dignos de seu título, os engenheiros devem
desenvolver uma compreensão profunda dos problemas que têm a tarefa de resolver e das ferramentas de tecnologia. Isso se aplica a modelos de
compromisso e consistência e a todos os outros aspectos do desempenho da tecnologia. Escolhas e configurações de tecnologia apropriadas podem
diferenciar o sucesso extraordinário de um fracasso maciço. Consulte o Capítulo 6 para uma discussão mais profunda sobre consistência.
Como acabamos de discutir, as transações incorrem na sobrecarga de criar novos registros durante certas operações, como atualizações, exclusões
e operações de índice, enquanto mantêm os registros antigos como ponteiros para o último estado do banco de dados.
À medida que esses registros antigos se acumulam no sistema de arquivos do banco de dados, eles não precisam mais ser referenciados. Você deve
remover esses registros mortos em um processo chamado de aspiração.
Você pode limpar uma única tabela, várias tabelas ou todas as tabelas em um banco de dados. Não importa como você opte por limpar, excluir
registros de banco de dados mortos é importante por alguns motivos. Primeiro, ele libera espaço para novos registros, levando a menos volume de
tabela e consultas mais rápidas. Em segundo lugar, registros novos e relevantes significam que os planos de consulta são mais precisos; registros
desatualizados podem levar o otimizador de consulta a gerar planos abaixo do ideal e imprecisos. Por fim, a aspiração limpa os índices ruins, permitindo
um melhor desempenho do índice.
Machine Translated by Google
As operações de vácuo são tratadas de forma diferente dependendo do tipo de banco de dados. Por exemplo, em bancos de dados suportados por
armazenamento de objetos (BigQuery, Snowflake, Databricks), a única desvantagem da retenção de dados antigos é que ela usa espaço de armazenamento,
podendo custar dinheiro dependendo do modelo de preço de armazenamento do banco de dados. No Snowflake, os usuários não podem aspirar diretamente.
Em vez disso, eles controlam um intervalo de “viagem no tempo” que determina por quanto tempo os instantâneos de tabela são retidos antes de serem limpos
automaticamente. O BigQuery utiliza uma janela de histórico fixa de sete dias. Databricks geralmente retém dados indefinidamente até que sejam manualmente
limpos; a aspiração é importante para controlar os custos diretos de armazenamento do S3.
A aspiração torna-se ainda mais crítica para bancos de dados relacionais como PostgreSQL e MySQL. Um grande número de operações transacionais pode
causar um rápido acúmulo de registros mortos, e os engenheiros que trabalham nesses sistemas precisam se familiarizar com os detalhes e o impacto da
aspiração.
Digamos que você tenha uma consulta intensiva que costuma executar em um banco de dados que cobra pela quantidade de dados consultados. Cada vez
que uma consulta é executada, isso custa dinheiro. Em vez de executar novamente a mesma consulta no banco de dados repetidamente e incorrer em
cobranças enormes, não seria bom se os resultados da consulta fossem armazenados e disponíveis para recuperação instantânea? Felizmente, muitos
bancos de dados OLAP na nuvem armazenam em cache os resultados das consultas.
Quando uma consulta é executada inicialmente, ela recupera dados de várias fontes, os filtra e os associa e gera um resultado. Essa consulta inicial —
uma consulta fria — é semelhante à noção de dados frios que exploramos no Capítulo 6. Para fins de argumentação, digamos que essa consulta levou 40
segundos para ser executada. Supondo que seu banco de dados armazene em cache os resultados da consulta, executar novamente a mesma consulta pode
retornar resultados em 1 segundo ou menos. Os resultados foram armazenados em cache e a consulta não precisou ser executada a frio. Sempre que
possível, aproveite os resultados do cache de consulta para ajudar a reduzir a pressão em seu banco de dados e, ao mesmo tempo, fornecer uma melhor
experiência do usuário para consultas executadas com frequência. Observe também que as visualizações materializadas fornecem outra forma de cache de
consulta (consulte “Visualizações materializadas, federação e virtualização de consulta”).
de streaming estão constantemente em andamento. Como você pode imaginar, consultar dados de streaming é diferente de dados em lote.
Para aproveitar totalmente um fluxo de dados, devemos adaptar padrões de consulta que reflitam sua natureza em tempo real. Por exemplo,
sistemas como Kafka e Pulsar facilitam a consulta de fontes de dados de streaming. Vejamos algumas maneiras comuns de fazer isso.
se do CDC contínuo, discutido no Capítulo 7. O CDC, neste formato, basicamente configura um banco de dados analítico como um seguidor rápido de um
banco de dados de produção. Um dos padrões de consulta de streaming mais antigos envolve simplesmente consultar o banco de dados de análise,
recuperando resultados estatísticos e agregações com um pequeno atraso em relação ao banco de dados de produção.
Como isso é um padrão de consulta de streaming? Não poderíamos fazer a mesma coisa simplesmente executando nossas consultas no banco de dados
de produção? Em princípio, sim; na prática, não. Os bancos de dados de produção geralmente não estão equipados para lidar com cargas de trabalho de
produção e executar simultaneamente grandes varreduras analíticas em quantidades significativas de dados.
4
A execução de tais consultas pode tornar o aplicativo de produção lento ou até mesmo fazer com que ele falhe. O padrão de consulta CDC básico nos
permite fornecer análises em tempo real com um impacto mínimo no sistema de produção.
O padrão de seguidor rápido pode utilizar um banco de dados transacional convencional como seguidor, mas há vantagens significativas em usar um sistema
orientado a OLAP adequado (Figura 8-3). Tanto o Druid quanto o BigQuery combinam um buffer de streaming com armazenamento colunar de longo prazo
em uma configuração semelhante à arquitetura Lambda (consulte o Capítulo 3).
Isso funciona muito bem para calcular estatísticas de rastreamento em dados históricos vastos com atualizações quase em tempo real.
Machine Translated by Google
A abordagem do CDC seguidor rápido tem limitações críticas. Ele não repensa fundamentalmente os padrões de consulta em lote.
Você ainda está executando consultas SELECT no estado atual da tabela e perdendo a oportunidade de acionar dinamicamente eventos
de alterações no fluxo.
A arquitetura Kappa
Em seguida, lembre-se da arquitetura Kappa que discutimos no Capítulo 3. A ideia principal dessa arquitetura é manipular todos os dados
como eventos e armazenar esses eventos como um fluxo em vez de uma tabela (Figura 8-4). Quando os bancos de dados do aplicativo de
produção são a origem, a arquitetura Kappa armazena eventos do CDC. Os fluxos de eventos também podem fluir diretamente de um back-
end de aplicativo, de um enxame de dispositivos IoT ou de qualquer sistema que gere eventos e possa enviá-los por uma rede. Em vez de
simplesmente tratar um sistema de armazenamento de streaming como um buffer, a arquitetura Kappa retém eventos no armazenamento
durante um período de retenção mais prolongado, e os dados podem ser consultados diretamente desse armazenamento. O período de
retenção pode ser bastante longo (meses ou anos). Observe que isso é muito mais longo do que o período de retenção usado em sistemas
orientados puramente em tempo real, geralmente uma semana no máximo.
Figura 8-4. A arquitetura Kappa é construída em torno de sistemas de armazenamento e ingestão de streaming
A “grande ideia” da arquitetura Kappa é tratar o armazenamento de streaming como uma camada de transporte em tempo real e um banco
de dados para recuperar e consultar dados históricos. Isso acontece por meio dos recursos de consulta direta do sistema de armazenamento
de streaming ou com a ajuda de ferramentas externas. Por exemplo, o Kafka KSQL suporta agregação, cálculos estatísticos e até mesmo
sessionalização. Se os requisitos de consulta forem mais complexos ou os dados precisarem ser combinados com outras fontes de dados,
uma ferramenta externa, como o Spark, lê um intervalo de tempo de dados do Kafka e calcula os resultados da consulta. O sistema de
armazenamento de streaming também pode alimentar outros aplicativos ou um processador de stream, como Flink ou Beam.
fundamental das consultas em lote tradicionais é que esse paradigma geralmente trata o mecanismo de consulta como um observador externo.
Um ator externo aos dados faz com que a consulta seja executada – talvez um cron job de hora em hora ou um gerente de produto abrindo
um painel.
Os sistemas de streaming mais usados, por outro lado, suportam a noção de computações acionadas diretamente dos próprios dados. Eles
podem emitir estatísticas médias e medianas toda vez que um determinado número de registros é coletado no buffer ou gerar um resumo
quando uma sessão de usuário é fechada.
O Windows é um recurso essencial em consultas e processamento de streaming. Windows são pequenos lotes processados com
base em gatilhos dinâmicos. As janelas são geradas dinamicamente ao longo do tempo de algumas maneiras. Vejamos alguns tipos comuns
de janelas: sessão, tempo fixo e deslizante. Também veremos as marcas d'água.
Janela de sessão
Uma janela de sessão agrupa eventos que ocorrem juntos e filtra os períodos de inatividade quando nenhum evento ocorre. Podemos
dizer que uma sessão de usuário é qualquer intervalo de tempo sem intervalo de inatividade de cinco minutos ou mais. Nosso sistema de
lote coleta dados por uma chave de ID do usuário, ordena eventos, determina as lacunas e os limites da sessão e
Machine Translated by Google
calcula estatísticas para cada sessão. Os engenheiros de dados costumam fazer sessões de dados retrospectivamente, aplicando condições de
tempo à atividade do usuário em aplicativos da Web e de desktop.
Em uma sessão de streaming, esse processo pode acontecer dinamicamente. Observe que as janelas de sessão são por chave; no exemplo
anterior, cada usuário obtém seu próprio conjunto de janelas. O sistema acumula dados por usuário. Se ocorrer um intervalo de cinco minutos sem
atividade, o sistema fecha a janela, envia seus cálculos e libera os dados. Caso cheguem novos eventos para uso, o sistema inicia uma nova janela de
sessão.
As janelas de sessão também podem fazer uma provisão para dados de chegada tardia. Permitindo que os dados cheguem com até cinco minutos de
atraso para levar em conta as condições da rede e a latência do sistema, o sistema abrirá a janela se um evento de chegada tardia indicar atividade menos
de cinco minutos após o último evento. Teremos mais a dizer sobre dados de chegada tardia ao longo deste capítulo. A Figura 8-5 mostra três janelas de
sessão, cada uma separada por cinco minutos de inatividade.
Figura 8-5. Janela de sessão com um tempo limite de cinco minutos para inatividade
Tornar a sessionalização dinâmica e quase em tempo real muda fundamentalmente sua utilidade. Com a sessionalização retrospectiva,
poderíamos automatizar ações específicas um dia ou uma hora após o encerramento de uma sessão do usuário (por exemplo, um e-mail de
acompanhamento com um cupom para um produto visualizado pelo usuário). Com a sessionalização dinâmica, o usuário pode receber um alerta em um
aplicativo móvel que é imediatamente útil com base em sua atividade nos últimos 15 minutos.
Uma janela de tempo fixo (também conhecida como rolante) apresenta períodos de tempo fixos executados em uma programação fixa e processa todos os
dados desde que a janela anterior foi fechada. Por exemplo, podemos fechar uma janela a cada 20 segundos e processar todos os dados que chegam da
janela anterior para fornecer uma estatística média e mediana (Figura 8-6). As estatísticas seriam emitidas assim que pudessem ser calculadas após o
fechamento da janela.
Isso é semelhante ao processamento ETL em lote tradicional, no qual podemos executar um trabalho de atualização de dados todos os dias ou a cada hora.
O sistema de streaming nos permite gerar janelas com mais frequência e entregar resultados com menor latência. Como enfatizaremos repetidamente, o
lote é um caso especial de streaming.
Janelas deslizantes
Os eventos em uma janela deslizante são agrupados em janelas de duração fixa. Por exemplo, poderíamos gerar uma nova janela de 60 segundos a cada
30 segundos (Figura 8-7). Assim como fizemos antes, podemos emitir estatísticas médias e medianas.
Janelas deslizantes também são conhecidas como janelas saltitantes.
Machine Translated by Google
O deslizamento pode variar. Por exemplo, podemos pensar na janela como realmente deslizando continuamente, mas emitindo estatísticas
apenas quando certas condições (gatilhos) são atendidas. Suponha que usamos uma janela deslizante contínua de 30 segundos, mas
calculamos uma estatística apenas quando um usuário clica em um banner específico. Isso levaria a uma taxa de saída extremamente alta
quando muitos usuários clicam no banner e nenhum cálculo durante uma pausa.
Marcas d'água
Cobrimos vários tipos de janelas e seus usos. Conforme discutido no Capítulo 7, os dados às vezes são ingeridos fora da ordem em que se
originaram. Uma marca d'água (Figura 8-8) é um limite usado por uma janela para determinar se os dados em uma janela estão dentro do intervalo
de tempo estabelecido ou se são considerados atrasados. Se chegarem dados novos na janela, mas mais antigos que o carimbo de data/hora da
Figura 8-8. Marca d'água atuando como um limite para dados de chegada tardia
mencionamos anteriormente, geralmente derivamos valor dos dados combinando-os com outros dados. Os dados de streaming não são diferentes.
Por exemplo, vários fluxos podem ser combinados ou um fluxo pode ser combinado com dados históricos de lote.
Algumas tabelas podem ser alimentadas por streams (Figura 8-9). A abordagem mais básica para esse problema é simplesmente juntar essas
duas tabelas em um banco de dados. Um fluxo pode alimentar uma ou ambas as tabelas.
Enriquecimento
Enriquecimento significa que juntamos um fluxo a outros dados (Figura 8-10). Normalmente, isso é feito para fornecer dados aprimorados em
outro fluxo. Por exemplo, suponha que um varejista online receba um fluxo de eventos de um parceiro
Machine Translated by Google
negócios contendo IDs de produtos e usuários. O varejista deseja aprimorar esses eventos com detalhes do produto e informações
demográficas sobre os usuários. O varejista alimenta esses eventos para uma função sem servidor que pesquisa o produto e o usuário em
um banco de dados na memória (digamos, um cache), adiciona as informações necessárias ao evento e envia os eventos aprimorados para
outro fluxo.
Figura 8-10. Neste exemplo, um fluxo é enriquecido com dados que residem no armazenamento de objetos, resultando em um novo conjunto de dados enriquecido
Na prática, a fonte de enriquecimento pode se originar em quase qualquer lugar — uma tabela em um data warehouse ou RDBMS na
nuvem ou um arquivo no armazenamento de objetos. É simplesmente uma questão de ler a partir da fonte e armazenar os dados de
enriquecimento necessários em um local apropriado para recuperação pelo fluxo.
Cada vez mais, os sistemas de streaming suportam a junção direta de stream a stream. Suponha que um varejista on-line deseje unir seus
dados de eventos da web com dados de streaming de uma plataforma de anúncios. A empresa pode alimentar os dois fluxos no Spark, mas
surgem várias complicações. Por exemplo, os fluxos podem ter latências significativamente diferentes para chegada no ponto em que a junção é
tratada no sistema de streaming. A plataforma de anúncios pode fornecer seus dados com um atraso de cinco minutos. Além disso, alguns
eventos podem ser significativamente atrasados, por exemplo, um evento de fechamento de sessão para um usuário ou um evento que ocorre
no telefone offline e aparece no fluxo somente depois que o usuário está de volta ao alcance da rede móvel.
Como tal, as arquiteturas típicas de junção de streaming dependem de buffers de streaming. O intervalo de retenção do buffer é
configurável; um intervalo de retenção mais longo requer mais armazenamento e outros recursos. Os eventos se juntam aos dados no buffer e
5
são eventualmente despejados após o intervalo de retenção ter passado (Figura 8-11).
Figura 8-11. Uma arquitetura para juntar fluxos armazena em buffer cada fluxo e junta eventos se eventos relacionados forem encontrados durante o intervalo de retenção do buffer
Agora que abordamos como as consultas funcionam para dados em lote e streaming, vamos discutir como tornar seus dados úteis modelando-
os.
Modelagem de dados
A modelagem de dados é algo que vemos negligenciado com frequência perturbadora. Frequentemente, vemos equipes de dados pulando na
construção de sistemas de dados sem um plano de jogo para organizar seus dados de uma maneira que seja útil para os negócios. Isto é um erro.
Arquiteturas de dados bem construídas devem refletir os objetivos e a lógica de negócios da organização que depende desses dados. A
modelagem de dados envolve a escolha deliberada de uma estrutura coerente para os dados e é uma etapa crítica para tornar os dados úteis
para os negócios.
A modelagem de dados tem sido uma prática há décadas de uma forma ou de outra. Por exemplo, vários tipos de técnicas de normalização
(discutidas em “Normalização”) têm sido usadas para modelar dados desde os primeiros dias dos RDBMSs; dados
Machine Translated by Google
técnicas de modelagem de armazenamento existem desde pelo menos o início da década de 1990, e sem dúvida há mais tempo.
Como os pêndulos na tecnologia costumam ir, a modelagem de dados tornou-se um pouco fora de moda no início e meados da década de
2010. A ascensão do data lake 1.0, NoSQL e sistemas de big data permitiram que os engenheiros ignorassem a modelagem de dados
tradicional, às vezes para obter ganhos de desempenho legítimos. Outras vezes, a falta de modelagem de dados rigorosa criava pântanos de
dados, juntamente com muitos dados redundantes, incompatíveis ou simplesmente errados.
Hoje em dia, o pêndulo parece estar voltando para a modelagem de dados. A crescente popularidade do gerenciamento de dados (em
particular, governança de dados e qualidade de dados) está aumentando a necessidade de uma lógica de negócios coerente. A ascensão
meteórica da proeminência dos dados nas empresas cria um reconhecimento crescente de que a modelagem é fundamental para obter valor
nos níveis mais altos da pirâmide de Hierarquia de Necessidades da Ciência de Dados. Por outro lado, acreditamos que novos paradigmas são
necessários para realmente abraçar as necessidades de streaming de dados e ML. Nesta seção, examinamos as técnicas atuais de modelagem
de dados e refletimos brevemente sobre o futuro da modelagem de dados.
Um modelo de dados representa a maneira como os dados se relacionam com o mundo real. Ele reflete como os dados devem ser
estruturados e padronizados para refletir melhor os processos, definições, fluxos de trabalho e lógica da sua organização. Um bom modelo
de dados captura como a comunicação e o trabalho fluem naturalmente em sua organização. Em contraste, um modelo de dados pobre (ou
inexistente) é aleatório, confuso e incoerente.
Alguns profissionais de dados veem a modelagem de dados como tediosa e reservada para “grandes empresas”. Como a maioria das boas
práticas de higiene – como passar fio dental e dormir bem – a modelagem de dados é reconhecida como uma boa coisa a se fazer, mas muitas
vezes é ignorada na prática. Idealmente, toda organização deve modelar seus dados apenas para garantir que a lógica e as regras de negócios
sejam traduzidas na camada de dados.
Ao modelar dados, é fundamental focar em traduzir o modelo para resultados de negócios. Um bom modelo de dados deve se
correlacionar com decisões de negócios impactantes. Por exemplo, um cliente pode significar coisas diferentes para diferentes
departamentos de uma empresa. Alguém que comprou de você nos últimos 30 dias é um cliente? E se eles não compraram de você nos últimos
seis meses ou um ano? Definir e modelar cuidadosamente esses dados do cliente pode ter um impacto enorme nos relatórios de downstream
sobre o comportamento do cliente ou na criação de modelos de rotatividade de clientes em que o tempo desde a última compra é uma variável
crítica.
GORJETA
Você consegue pensar em conceitos ou termos em sua empresa que podem significar coisas diferentes para pessoas diferentes?
Nossa discussão se concentra principalmente na modelagem de dados em lote, pois é onde surgiram a maioria das técnicas de modelagem de
dados. Também veremos algumas abordagens para modelar dados de streaming e considerações gerais para modelagem.
Conceptual
Contém lógica e regras de negócios e descreve os dados do sistema, como esquemas, tabelas e campos (nomes e tipos). Ao criar um
modelo conceitual, geralmente é útil visualizá-lo em um diagrama entidade-relacionamento (ER), que é uma ferramenta padrão para
visualizar os relacionamentos entre várias entidades em seus dados (pedidos, clientes, produtos etc.). Por exemplo, um diagrama ER
nome do cliente, endereço do cliente e pedidos do cliente. A visualização de relacionamentos de entidade é altamente
Lógico
Detalha como o modelo conceitual será implementado na prática, adicionando muito mais detalhes. Por exemplo, adicionaríamos
informações sobre os tipos de ID de cliente, nomes de clientes e endereços personalizados. Além disso, mapeamos as chaves
primárias e estrangeiras.
Fisica
Define como o modelo lógico será implementado em um sistema de banco de dados. Adicionaríamos bancos de dados, esquemas e
A modelagem de dados bem-sucedida envolve as partes interessadas do negócio no início do processo. Os engenheiros precisam obter
definições e metas de negócios para os dados. A modelagem de dados deve ser um esporte de contato total, cujo objetivo é fornecer à
empresa dados de qualidade para insights acionáveis e automação. Esta é uma prática da qual todos devem participar continuamente.
Outra consideração importante para a modelagem de dados é a granulação dos dados, que é a resolução na qual os dados são armazenados
e consultados. A granulação geralmente está no nível de uma chave primária em uma tabela, como ID do cliente, ID do pedido e ID do produto;
geralmente é acompanhado por uma data ou carimbo de data/hora para aumentar a fidelidade.
Por exemplo, suponha que uma empresa tenha acabado de começar a implantar relatórios de BI. A empresa é pequena o suficiente para que
a mesma pessoa esteja desempenhando o papel de engenheiro de dados e analista. Uma solicitação chega para um relatório que resume os
pedidos diários dos clientes. Especificamente, o relatório deve listar todos os clientes que fizeram pedidos, o número de pedidos que fizeram
naquele dia e o valor total que gastaram.
Este relatório é inerentemente grosseiro. Ele não contém detalhes sobre gastos por pedido ou os itens em cada pedido. É tentador para o
engenheiro/analista de dados ingerir dados do banco de dados de ordens de produção e reduzi-los a uma tabela de relatórios com apenas os
dados agregados básicos necessários para o relatório. No entanto, isso implicaria recomeçar quando chegasse uma solicitação para um
relatório com agregação de dados mais detalhada.
Como o engenheiro de dados é bastante experiente, ele escolhe criar tabelas com dados detalhados sobre os pedidos dos clientes,
incluindo cada pedido, item, custo do item, IDs do item, etc. Essencialmente, suas tabelas contêm todos os detalhes dos pedidos dos clientes.
A granulação dos dados está no nível do pedido do cliente. Esses dados do pedido do cliente podem ser analisados como estão ou agregados
para estatísticas resumidas sobre a atividade do pedido do cliente.
Em geral, você deve se esforçar para modelar seus dados no nível mais baixo de granulação possível. A partir daqui, é fácil agregar
esse conjunto de dados altamente granular. O inverso não é verdadeiro e geralmente é impossível restaurar detalhes que foram agregados.
Normalização
A normalização é uma prática de modelagem de dados de banco de dados que impõe controle estrito sobre os relacionamentos de tabelas
e colunas em um banco de dados. O objetivo da normalização é remover a redundância de dados dentro de um banco de dados e garantir a
6
integridade referencial. Basicamente, não se repita (DRY) aplicado a dados em um banco de dados.
A normalização é normalmente aplicada a bancos de dados relacionais contendo tabelas com linhas e colunas (usamos os termos coluna
e campo de forma intercambiável nesta seção). Foi introduzido pela primeira vez pelo pioneiro do banco de dados relacional Edgar Codd no
início dos anos 1970.
Machine Translated by Google
7
Codd delineou quatro objetivos principais da normalização:
Para reduzir a necessidade de reestruturação da coleção de relações, à medida que novos tipos de dados são introduzidos e, assim,
aumentar a vida útil dos programas aplicativos
Para tornar a coleta de relações neutra para as estatísticas de consulta, onde essas estatísticas podem mudar com o passar do tempo
Codd introduziu a ideia de formas normais. As formas normais são sequenciais, com cada forma incorporando as condições das
formas anteriores. Descrevemos as três primeiras formas normais de Codd aqui:
Desnormalizado
Cada coluna é única e tem um único valor. A tabela tem uma chave primária exclusiva.
Os requisitos da 2NF, mais cada tabela contém apenas campos relevantes relacionados à sua chave primária e não possui
dependências transitivas.
Vale a pena gastar um momento para descompactar alguns termos que acabamos de jogar para você. Uma chave primária exclusiva é
um único campo ou conjunto de vários campos que determina exclusivamente as linhas na tabela. Cada valor de chave ocorre no máximo
uma vez; caso contrário, um valor seria mapeado para várias linhas na tabela. Assim, todos os outros valores em uma linha dependem
(podem ser determinados) da chave. Uma dependência parcial ocorre quando um subconjunto de campos em uma chave composta pode
ser usado para determinar uma coluna não chave da tabela. Uma dependência transitiva ocorre quando um campo não-chave depende
de outro campo não-chave.
Vejamos os estágios de normalização — de desnormalizado a 3NF — usando um exemplo de comércio eletrônico de pedidos de
clientes (Tabela 8-1). Forneceremos explicações concretas de cada um dos conceitos apresentados no parágrafo anterior.
Machine Translated by Google
T
uma
bl
e
8
-
1
.
O
r
d
e
r
D
e
t
uma
eu
eu
Código do pedido Itens de ordem Identificação do Cliente Nome do Cliente Data do Pedido
[{
"sku": 1,
"preço": 50,
"quantidade": 1,
"name:": "Thingamajig"
}, {
"sku": 2,
"preço": 25,
"quantidade": 2,
"name:": "Whatchamacallit"
}]
Primeiro, esta tabela OrderDetail desnormalizada contém cinco campos. A chave primária é OrderID. Observe que o campo OrderItems
contém um objeto aninhado com dois SKUs junto com seu preço, quantidade e nome.
Para converter esses dados para 1NF, vamos mover OrderItems para quatro campos (Tabela 8-2). Agora temos uma
tabela OrderDetail na qual os campos não contêm repetições ou dados aninhados.
Machine Translated by Google
T
uma
bl
e
8
-
2
.
O
r
d
e
r
D
e
t
uma
eu
eu
W
eu
t
h
o
você
t
r
e
p
e
uma
t
s
o
r
n
e
s
t
e
d
d
uma
t
uma
Código do pedido Sku Preço Quantidade ProductName CustomerID Nome do Cliente Pedido
Machine Translated by Google
O problema é que agora não temos uma chave primária única. Ou seja, 100 ocorre na coluna OrderID em dois
fileiras diferentes. Para entender melhor a situação, vejamos uma amostra maior da nossa tabela (Tabela 8-3).
Machine Translated by Google
T
uma
b
eu
e
8
-
3
.
O
r
d
e
r
D
e
t
uma
eu
eu
W
eu
t
h
uma
eu
uma
r
g
e
r
s
uma
m
p
eu
Código do pedido Sku Preço Quantidade ProductName CustomerID Nome do Cliente Pedido
Para criar uma chave primária (composta) exclusiva, vamos numerar as linhas em cada ordem adicionando uma coluna chamada
LineItemNumber (Tabela 8-4).
Machine Translated by Google
T
uma
b
eu
8
-
4
.
O
r
d
e
r
D
e
t
uma
eu
eu
W
eu
t
h
eu
eu
n
e
EU
t
e
m
N
você
m
b
e
r
c
o
eu
você
m
n
Para alcançar 2NF, precisamos garantir que não existam dependências parciais. Uma dependência parcial é uma coluna não chave que
é totalmente determinado por um subconjunto das colunas na chave primária (composta) exclusiva; dependências parciais podem
ocorrem apenas quando a chave primária é composta. No nosso caso, as três últimas colunas são determinadas pelo número do pedido.
Para corrigir esse problema, vamos dividir OrderDetail em duas tabelas: Orders e OrderLineItem (Tabelas 8-5 e
8-6).
T
uma
b
eu
8
-
5
.
O
r
d
e
r
s
T
uma
b
eu
8
-
6
.
O
r
d
e
r
eu
eu
n
e
EU
t
e
m
100 1 1 50 1 Thingamajig
101 1 3 75 1 Whozeewhatzit
102 1 1 50 1 Thingamajig
A chave composta (OrderID, LineItemNumber) é uma chave primária exclusiva para OrderLineItem, enquanto
OrderID é uma chave primária para Pedidos.
Observe que Sku determina ProductName em OrderLineItem. Ou seja, Sku depende da chave composta,
e ProductName depende do Sku. Esta é uma dependência transitiva. Vamos dividir OrderLineItem em
OrderLineItem e Skus (Tabelas 8-7 e 8-8).
Machine Translated by Google
T
uma
b
eu
8
-
7
.
O
r
d
e
r
eu
eu
n
e
EU
t
e
m
100 1 1 50 1
100 2 2 25 2
101 1 3 75 1
102 1 1 50 1
Machine Translated by Google
T
uma
bl
e
8
-
8
.
S
k
você
1 Thingamajig
3 Whozeewhatzit
Agora, tanto OrderLineItem quanto Skus estão na 3NF. Observe que Orders não satisfaz a 3NF. Que dependências transitivas estão presentes?
Como você consertaria isso?
Existem formas normais adicionais (até 6NF no sistema Boyce-Codd), mas estas são muito menos comuns do que as três primeiras. Um banco de
dados geralmente é considerado normalizado se estiver na terceira forma normal, e essa é a convenção que usamos neste livro.
O grau de normalização que você deve aplicar aos seus dados depende do seu caso de uso. Não existe uma solução de tamanho único,
especialmente em bancos de dados em que alguma desnormalização apresenta vantagens de desempenho. Embora a desnormalização possa
parecer um antipadrão, é comum em muitos sistemas OLAP que armazenam dados semiestruturados.
Estude convenções de normalização e práticas recomendadas de banco de dados para escolher uma estratégia apropriada.
Na prática, algumas dessas técnicas podem ser combinadas. Por exemplo, vemos algumas equipes de dados começarem com o cofre de dados e,
em seguida, adicionarem um esquema em estrela Kimball ao lado dele. Também veremos modelos de dados amplos e desnormalizados e outras
técnicas de modelagem de dados em lote que você deve ter em seu arsenal. À medida que discutimos cada uma dessas técnicas, usaremos o
exemplo de modelagem de transações que ocorrem em um sistema de pedidos de comércio eletrônico.
NOTA
Nossa cobertura das três primeiras abordagens – Inmon, Kimball e cofre de dados – é superficial e dificilmente faz justiça à sua respectiva complexidade
e nuance. Ao final de cada seção, listamos os livros canônicos de seus criadores. Para um engenheiro de dados, esses livros são leituras obrigatórias e
recomendamos que você os leia, mesmo que seja apenas para entender como e por que a modelagem de dados é fundamental para dados analíticos em lote.
Machine Translated by Google
Inmon
O pai do data warehouse, Bill Inmon, criou sua abordagem para modelagem de dados em 1990. Antes do data warehouse, a análise
geralmente ocorria diretamente no próprio sistema de origem, com a consequência óbvia de atolar bancos de dados transacionais de produção
com consultas. O objetivo do data warehouse era separar o sistema de origem do sistema analítico.
Um data warehouse é uma coleção de dados orientada por assunto, integrada, não volátil e variável no tempo para apoiar as decisões
da administração. O data warehouse contém dados corporativos granulares. Os dados no data warehouse podem ser usados para
muitas finalidades diferentes, incluindo sentar e esperar por requisitos futuros que são desconhecidos hoje .
Orientado ao assunto
O data warehouse se concentra em uma área de assunto específica, como vendas ou marketing.
Não volátil
Os dados permanecem inalterados depois que os dados são armazenados em um data warehouse.
Integrado
Tempo variável
Vejamos cada uma dessas partes para entender sua influência em um modelo de dados do Inmon. Primeiro, o modelo lógico deve se concentrar
em uma área específica. Por exemplo, se a orientação do assunto for "vendas", o modelo lógico contém todos os detalhes relacionados a
vendas - chaves de negócios, relacionamentos, atributos etc. Em seguida, esses detalhes são integrados a um modelo de dados consolidado e
altamente normalizado. Por fim, os dados são armazenados inalterados de maneira não volátil e variante no tempo , o que significa que você
pode (teoricamente) consultar os dados originais pelo tempo que o histórico de armazenamento permitir. O data warehouse da Inmon deve aderir
estritamente a todas essas quatro partes críticas para apoiar as decisões da administração.
Este é um ponto sutil, mas posiciona o data warehouse para análise, não OLTP.
A segunda característica saliente do data warehouse é que ele é integrado. De todos os aspectos de um data warehouse, a
integração é o mais importante. Os dados são alimentados de várias fontes diferentes no data warehouse. À medida que os
dados são alimentados, eles são convertidos, reformatados, resequenciados, resumidos etc. O resultado é que os dados — uma vez
que residem no data warehouse — têm uma única imagem corporativa física.
9
Com o data warehouse da Inmon, os dados são integrados em toda a organização em um modelo de ER granular e altamente normalizado, com
ênfase incansável em ETL. Devido à natureza orientada por assunto do data warehouse, o data warehouse da Inmon consiste em bancos de
dados de origem chave e sistemas de informação usados em uma organização. Os dados dos principais sistemas de origem de negócios são
ingeridos e integrados em um data warehouse altamente normalizado (3NF) que geralmente se assemelha muito à estrutura de normalização do
próprio sistema de origem; os dados são trazidos de forma incremental, começando pelas áreas de negócios de maior prioridade. O requisito
rigoroso de normalização garante o mínimo de duplicação de dados possível, o que leva a menos erros analíticos downstream porque os dados
não divergirão nem sofrerão redundâncias. O data warehouse representa uma “fonte única da verdade”, que dá suporte aos requisitos gerais de
informações da empresa. Os dados são apresentados para relatórios e análises downstream por meio de data marts específicos de negócios e
departamentos, que também podem ser desnormalizados.
Machine Translated by Google
Vejamos como um data warehouse Inmon é usado para comércio eletrônico (Figura 8-13). Os sistemas de origem do negócio são pedidos,
estoque e marketing. Os dados desses sistemas de origem são enviados por ETL para o data warehouse e armazenados no 3NF. Idealmente,
o data warehouse engloba holisticamente as informações do negócio. Para servir dados para solicitações de informações específicas do
departamento, os processos ETL pegam dados do data warehouse, transformam os dados e os colocam em data marts downstream para serem
visualizados em relatórios.
Uma opção popular para modelar dados em um data mart é um esquema em estrela (discutido na próxima seção sobre Kimball), embora
qualquer modelo de dados que forneça informações facilmente acessíveis também seja adequado. No exemplo anterior, vendas, marketing e
compras têm seu próprio esquema em estrela, alimentado a montante dos dados granulares no data warehouse.
Isso permite que cada departamento tenha sua própria estrutura de dados única e otimizada para suas necessidades específicas.
A Inmon continua inovando no espaço de data warehouse, atualmente focando em ETL textual no data warehouse.
Ele também é um escritor e pensador prolífico, escrevendo mais de 60 livros e inúmeros artigos. Para ler mais sobre o data warehouse
da Inmon, consulte seus livros listados em “Recursos Adicionais”.
Kimball
Se houver espectros para modelagem de dados, Kimball está muito no extremo oposto de Inmon. Criada por Ralph Kimball no início da
década de 1990, essa abordagem de modelagem de dados se concentra menos na normalização e, em alguns casos, aceita a
desnormalização. Como Inmon diz sobre a diferença entre o data warehouse e o data mart, “um data 10 mart nunca é um substituto para um
data warehouse”.
Enquanto a Inmon integra dados de toda a empresa no data warehouse e fornece análises específicas do departamento por meio de data
marts, o modelo Kimball é de baixo para cima, incentivando você a modelar e servir análises de departamento ou de negócios no próprio
data warehouse (Inmon argumenta que abordagem distorce a definição de um data warehouse). Isso pode permitir uma iteração e
modelagem mais rápida do que o Inmon, com a compensação de uma potencial integração de dados mais flexível, redundância de dados e
duplicação.
Na abordagem de Kimball, os dados são modelados com dois tipos gerais de tabelas: fatos e dimensões. Você pode pensar em uma tabela
de fatos como uma tabela de números e as tabelas de dimensões como dados qualitativos que fazem referência a um fato. As tabelas de
11
dimensão envolvem uma única tabela de fatos em um relacionamento chamado esquema em estrela (Figura 8-14). Vejamos fatos, dimensões
e esquemas em estrela.
Machine Translated by Google
Tabelas de fatos
O primeiro tipo de tabela em um esquema em estrela é a tabela de fatos, que contém dados factuais, quantitativos e relacionados a eventos.
Os dados em uma tabela de fatos são imutáveis porque os fatos estão relacionados a eventos. Portanto, as tabelas de fatos não mudam e são
somente anexadas. As tabelas de fatos geralmente são estreitas e longas, o que significa que não têm muitas colunas, mas muitas linhas que
representam eventos. As tabelas de fatos devem ter a granularidade mais baixa possível.
As consultas em um esquema em estrela começam com a tabela de fatos. Cada linha de uma tabela de fatos deve representar a granulação dos
dados. Evite agregar ou derivar dados em uma tabela de fatos. Se você precisar realizar agregações ou derivações, faça isso em uma consulta downstream,
tabela de data mart ou exibição. Finalmente, as tabelas de fatos não fazem referência a outras tabelas de fatos; eles fazem referência apenas às dimensões.
Vejamos um exemplo de uma tabela de fatos elementares (Tabela 8-9). Uma pergunta comum em sua empresa pode ser: “Mostre-me vendas brutas, por
pedido de cada cliente, por data”. Mais uma vez, os fatos devem estar no nível mais baixo possível — nesse caso, o orderID da venda, cliente, data e
valor bruto da venda. Observe que os tipos de dados na tabela de fatos são todos números (inteiros e flutuantes); não há cordas. Além disso, neste
exemplo, CustomerKey 7 tem dois pedidos no mesmo dia, refletindo a granulação da tabela. Em vez disso, a tabela de fatos possui chaves que fazem
referência a tabelas de dimensões contendo seus respectivos atributos, como informações de cliente e data. O valor bruto de vendas representa a venda
total para o evento de vendas.
Machine Translated by Google
T
uma
b
eu
e
8
-
9
.
UMA
f
uma
c
t
t
uma
b
eu
Tabelas de dimensão
O segundo tipo principal de tabela em um modelo de dados Kimball é chamado de dimensão. As tabelas de dimensões fornecem a
dados de referência, atributos e contexto relacional para os eventos armazenados em tabelas de fatos. As tabelas de dimensão são menores
do que as tabelas de fatos e assumem uma forma oposta, geralmente larga e curta. Quando associadas a uma tabela de fatos, as dimensões podem
descrever os eventos o quê, onde e quando. As dimensões são desnormalizadas, com possibilidade de dados duplicados.
Isso está correto no modelo de dados Kimball. Vejamos as duas dimensões referenciadas na tabela de fatos anterior
exemplo.
Em um modelo de dados Kimball, as datas geralmente são armazenadas em uma dimensão de data, permitindo que você faça referência à chave de data
(DateKey) entre a tabela de dimensão de fato e data. Com a tabela de dimensão de data, você pode responder facilmente
perguntas como: "Quais são minhas vendas totais no primeiro trimestre de 2022?" ou “Quantos clientes mais compram em
terça do que quarta?” Observe que temos cinco campos além da chave de data (Tabela 8-10). A beleza de um
dimensão de data é que você pode adicionar quantos novos campos fizer sentido para analisar seus dados.
Machine Translated by Google
T
uma
b
eu
e
8
-
1
0
.
UMA
d
uma
t
e
d
eu
m
e
n
s
eu
o
n
t
uma
b
eu
A Tabela 8-11 também faz referência a outra dimensão — a dimensão do cliente — pelo campo CustomerKey. o
A dimensão do cliente contém vários campos que descrevem o cliente: nome e sobrenome, CEP e alguns
de campos de data de aparência peculiar. Vejamos esses campos de data, pois eles ilustram outro conceito nos dados de Kimball
modelo: uma dimensão de mudança lenta do Tipo 2, que descreveremos com mais detalhes a seguir.
Machine Translated by Google
T
uma
b
eu
e
8
-
1
1
.
UMA
T
y
p
e
2
c
você
s
t
o
m
e
r
d
eu
m
e
n
s
eu
o
n
t
uma
b
eu
Por exemplo, dê uma olhada em CustomerKey 5, com o EFF_StartDate (EFF_StartDate significa efetiva
data de início) de 2019-01-04 e uma EFF_EndDate de 9999-01-01. Isso significa que o cadastro de clientes de Joe Reis
Machine Translated by Google
foi criado na tabela de dimensões do cliente em 04-01-2019 e tem uma data final de 01-01-9999. Interessante. O que significa essa data
de término? Isso significa que o registro do cliente está ativo e não foi alterado.
Agora vamos ver o registro do cliente de Matt Housley (CustomerKey = 7). Observe as duas entradas para a data de início de
Housley: 2020-05-04 e 2021-09-19. Parece que Housley mudou seu CEP em 19/09/2021, resultando em uma alteração em seu registro
de cliente. Quando os dados forem consultados para os registros de clientes mais recentes, você consultará onde a data de término é
igual a 9999-01-01.
Uma dimensão de alteração lenta (SCD) é necessária para rastrear alterações nas dimensões. O exemplo anterior é um SCD Tipo
2: um novo registro é inserido quando um registro existente é alterado. Embora os SCDs possam ir até sete níveis, vejamos os três
mais comuns:
Tipo 1
Substituir registros de dimensão existentes. Isso é super simples e significa que você não tem acesso aos arquivos excluídos
registros de dimensão histórica.
Tipo 2
Mantenha um histórico completo dos registros de dimensão. Quando um registro é alterado, esse registro específico é sinalizado
como alterado e é criado um novo registro de dimensão que reflete o status atual dos atributos. Em nosso exemplo, Housley mudou
para um novo CEP, o que acionou seu registro inicial para refletir uma data de término efetiva, e um novo registro foi criado para
Tipo 3
Um SCD Tipo 3 é semelhante a um SCD Tipo 2, mas em vez de criar uma nova linha, uma alteração em um SCD Tipo 3 cria um
novo campo. Usando o exemplo anterior, vamos ver como é um SCD Tipo 3 no seguinte
mesas.
Na Tabela 8-12, Housley mora no CEP 84101. Quando Housley muda para um novo CEP, o SCD Tipo 3 cria dois novos campos,
um para seu novo CEP e a data da alteração (Tabela 8-13). O campo de CEP original também é renomeado para refletir que este é
o registro mais antigo.
Machine Translated by Google
T
uma
bl
e
8
-
1
2
.
T
y
p
e
3
s
eu
o
W
eu
y
c
h
uma
n
gi
gd
eu
m
e
n
s
eu
o
n
T
uma
bl
e
8
-
1
3
.
T
y
p
e
3
c
você
s
t
o
m
e
r
d
eu
m
e
n
s
eu
o
n
t
uma
bl
e
CustomerKey FirstName Sobrenome CEP original CEP atual CEP atual Data
Dos tipos de SCDs descritos, o Tipo 1 é o comportamento padrão da maioria dos data warehouses e o Tipo 2 é o que vemos mais comumente
usado na prática. Há muito o que saber sobre dimensões, e sugerimos usar esta seção como ponto de partida para se familiarizar com o
funcionamento das dimensões e como elas são usadas.
Esquema em estrela
Agora que você tem um entendimento básico de fatos e dimensões, é hora de integrá-los em um esquema em estrela.
O esquema em estrela representa o modelo de dados do negócio. Ao contrário de abordagens altamente normalizadas para modelagem de
dados, o esquema em estrela é uma tabela de fatos cercada pelas dimensões necessárias. Isso resulta em menos junções do que outros dados
Machine Translated by Google
modelos, o que acelera o desempenho da consulta. Outra vantagem de um esquema em estrela é que é sem dúvida mais fácil para os
usuários de negócios entenderem e usarem.
Observe que o esquema em estrela não deve refletir um relatório específico, embora você possa modelar um relatório em um data mart downstream
ou diretamente em sua ferramenta de BI. O esquema em estrela deve capturar os fatos e atributos de sua lógica de negócios e ser flexível o
suficiente para responder às respectivas perguntas críticas.
Como um esquema em estrela tem uma tabela de fatos, às vezes você terá vários esquemas em estrela que abordam diferentes fatos do negócio.
Você deve se esforçar para reduzir o número de dimensões sempre que possível, pois esses dados de referência podem ser reutilizados entre
diferentes tabelas de fatos. Uma dimensão que é reutilizada em vários esquemas em estrela, compartilhando assim os mesmos campos, é chamada
de dimensão conformada. Uma dimensão conformada permite combinar várias tabelas de fatos em vários esquemas em estrela. Lembre-se, dados
redundantes são aceitáveis com o método Kimball, mas evite replicar as mesmas tabelas de dimensão para evitar definições de negócios flutuantes
e integridade de dados.
O modelo de dados Kimball e o esquema em estrela têm muitas nuances. Você deve estar ciente de que este modo é apropriado apenas para
dados em lote e não para dados de streaming. Como o modelo de dados Kimball é popular, há uma boa chance de você encontrá-lo
Cofre de dados
Enquanto Kimball e Inmon se concentram na estrutura da lógica de negócios no data warehouse, o data vault oferece uma abordagem diferente
12
para a modelagem de dados. Criado na década de 1990 por Dan Linstedt, o modelo de cofre de dados separa os aspectos estruturais dos dados
de um sistema de origem de seus atributos. Em vez de representar a lógica de negócios em fatos, dimensões ou tabelas altamente normalizadas,
um cofre de dados simplesmente carrega dados de sistemas de origem diretamente em um punhado de tabelas criadas para fins específicos de uma
maneira somente de inserção. Ao contrário das outras abordagens de modelagem de dados que você aprendeu, não há noção de dados bons, ruins
ou conformados em um cofre de dados.
Os dados se movem rapidamente nos dias de hoje e os modelos de dados precisam ser ágeis, flexíveis e escaláveis; o modelo de cofre de dados
visa atender a essa necessidade. O objetivo desse modelo é manter os dados o mais alinhados possível com o negócio, mesmo enquanto os dados
do negócio evoluem.
Um cofre de dados consiste em três tipos principais de tabelas: hubs, links e satélites (Figura 8-15). Em resumo, um hub armazena chaves de
negócios, um link mantém relacionamentos entre chaves de negócios e um satélite representa os atributos e o contexto de uma chave de
negócios. Um usuário consultará um hub, que se vinculará a uma tabela satélite contendo os atributos relevantes da consulta. Vamos explorar
hubs, links e satélites com mais detalhes.
Figura 8-15. Tabelas de cofre de dados: hubs, links e satélites conectados entre si
Hubs
As consultas geralmente envolvem a pesquisa por uma chave comercial, como um ID de cliente ou um ID de pedido do nosso exemplo de
comércio eletrônico. Um hub é a entidade central de um cofre de dados que retém um registro de todas as chaves comerciais carregadas no
cofre de dados. O hub deve refletir o estado do sistema de origem do qual carrega os dados.
Chave de hash
A chave primária usada para unir dados entre sistemas. Este é um campo de hash calculado (MD5 ou similar)
Data de carregamento
Fonte de registro
O sistema de origem.
Machine Translated by Google
Chave(s) de negócios
É importante observar que um hub é somente para inserção e os dados dos sistemas de origem não são alterados em um hub. Depois que os dados são
carregados em um hub, eles se tornam permanentes.
Ao projetar um hub, identificar a chave de negócios é fundamental. Pergunte a si mesmo: Qual é o elemento comercial identificável em um sistema de
13
origem? Dito de outra forma, como os usuários de um sistema de origem geralmente procuram dados? Idealmente, isso é descoberto à medida que você cria o
modelo de dados conceitual de sua organização e antes de começar a construir seu cofre de dados.
Usando nosso cenário de comércio eletrônico, vejamos um exemplo de um hub para produtos. Primeiro, vejamos o design físico de um hub de produto
(Tabela 8-14).
Machine Translated by Google
T
uma
bl
e
8
-
1
4
.
UMA
ph
y
s
eu
c
uma
ld
e
s
eu
g
n
f
o
r
uma
p
r
o
d
você
c
t
h
você
Produto Hub
ProductHashKey
LoadDate
Origem do registro
ID do produto
Na prática, o hub do produto fica assim quando preenchido com dados (Tabela 8-15). Neste exemplo, três produtos diferentes são
carregados em um hub de um sistema ERP em duas datas separadas.
Machine Translated by Google
T
uma
bl
e
8
-
1
5
.
UMA
p
r
o
d
você
c
t
h
você
p
o
p
você
eu
uma
t
e
d
W
isto
HD
uma
t
uma
Enquanto estamos nisso, vamos criar outro hub para pedidos (Tabela 8-16) usando o mesmo esquema do HubProduct e preenchê-lo com alguns dados de
pedido de amostra.
Machine Translated by Google
T
uma
bl
e
8
-
1
6
.
UMA
n
o
r
d
e
r
h
você
p
o
p
você
eu
uma
t
e
d
W
eu
HD
uma
t
uma
Links
Uma tabela de links rastreia os relacionamentos das chaves de negócios entre os hubs. As tabelas de links devem conectar pelo menos dois hubs, de
preferência com a granulação mais baixa possível. Como as tabelas de links conectam dados de vários hubs, elas são muitos para muitos.
As relações do modelo de cofre de dados são diretas e tratadas por meio de alterações nos links. Isso fornece excelente flexibilidade no caso inevitável de
alteração dos dados de origem subjacentes. Você adiciona um novo hub, e isso
Machine Translated by Google
hub precisa se conectar a hubs existentes. Basta adicionar um novo relacionamento a esse hub em sua tabela de links. É isso! Agora
vamos ver maneiras de visualizar dados contextualmente usando satélites.
De volta ao nosso exemplo de comércio eletrônico, gostaríamos de associar pedidos a produtos. Vamos ver como pode ser uma
tabela de links para pedidos e produtos (Tabela 8-17).
Machine Translated by Google
T
uma
bl
e
8
-
1
7
.
UMA
li
n
k
t
uma
bl
e
f
o
r
p
r
o
d
você
c
t
s
uma
n
d
o
r
d
e
r
s
LinkPedidoProduto
OrderProductHashKey
LoadDate
Origem do registro
ProductHashKey
OrderHashKey
Machine Translated by Google
Quando a tabela LinkOrderProduct é preenchida, esta é a aparência (Tabela 8-18). Observe que estamos usando a
fonte de registro do pedido neste exemplo.
Machine Translated by Google
T
uma
bl
e
8
-
1
8
.
UMA
li
n
k
t
uma
bl
e
c
o
n
n
e
c
ti
n
g
o
r
d
e
r
s
uma
n
d
p
r
o
d
você
c
t
s
6 dc1 c6dd
Satélites
Descrevemos relacionamentos entre hubs e links que envolvem chaves, datas de carregamento e fontes de registro. Como
você tem uma noção do que essas relações significam? Satélites são atributos descritivos que dão significado e
contexto para hubs. Os satélites podem se conectar a hubs ou links. Os únicos campos obrigatórios em um satélite são um
chave que consiste na chave comercial do hub pai e uma data de carregamento. Além disso, um satélite pode conter
muitos atributos que fazem sentido.
Vejamos um exemplo de satélite para o hub Produto (Tabela 8-19). Neste exemplo, o
A tabela SatelliteProduct contém informações adicionais sobre o produto, como nome e preço do produto.
Machine Translated by Google
T
uma
bl
e
8
-
1
9
.
S
uma
t
e
ll
eu
t
e
P
r
o
d
você
c
t
Produto Satélite
ProductHashKey
LoadDate
Origem do registro
Nome do Produto
Preço
E aqui está a tabela SatelliteProduct com alguns dados de amostra (Tabela 8-20).
Machine Translated by Google
T
uma
bl
e
8
-
2
0
.
UMA
p
r
o
d
você
c
t
s
uma
t
e
ll
isto
e
t
uma
bl
e
W
isto
h
s
uma
pl
e
d
uma
t
uma
Vamos juntar tudo isso e juntar as tabelas de hub, produto e link em um cofre de dados (Figura 8-16).
Existem outros tipos de tabelas de cofre de dados, incluindo tabelas de ponto no tempo (PIT) e de ponte. Não os abordamos aqui, mas os mencionamos
porque o cofre de dados é bastante abrangente. Nosso objetivo é simplesmente fornecer uma visão geral do poder do cofre de dados.
Ao contrário de outras técnicas de modelagem de dados que discutimos, em um cofre de dados, a lógica de negócios é criada e interpretada
quando os dados dessas tabelas são consultados. Esteja ciente de que o modelo de cofre de dados pode ser usado com outras técnicas de modelagem de
dados. Não é incomum que um cofre de dados seja a zona de destino para dados analíticos, após o que é modelado separadamente em um data warehouse,
geralmente usando um esquema em estrela. O modelo de cofre de dados também pode ser adaptado para NoSQL e fontes de dados de streaming. O cofre
de dados é um tópico enorme, e esta seção destina-se simplesmente a torná-lo ciente de sua existência.
As abordagens de modelagem estritas que descrevemos, especialmente Kimball e Inmon, foram desenvolvidas quando os data warehouses eram
caros, no local e altamente limitados por recursos com computação e armazenamento fortemente acoplados. Embora a modelagem de dados em lote
tenha sido tradicionalmente associada a essas abordagens rígidas, abordagens mais relaxadas estão se tornando mais comuns.
Há razões para isso. Primeiro, a popularidade da nuvem significa que o armazenamento é muito barato. É mais barato armazenar dados do que se
preocupar com a melhor maneira de representar os dados armazenados. Em segundo lugar, a popularidade de dados aninhados (JSON e similares)
significa que os esquemas são flexíveis em sistemas de origem e analíticos.
Você tem a opção de modelar rigidamente seus dados conforme descrevemos ou pode optar por lançar todos os seus dados em uma única tabela ampla. Uma
tabela ampla é exatamente o que parece: uma coleção altamente desnormalizada e muito ampla de muitos campos, normalmente criada em um banco de
dados colunar. Um campo pode ser um valor único ou conter dados aninhados. Os dados são organizados junto com uma ou várias chaves; essas chaves
estão intimamente ligadas à granulação dos dados.
Uma tabela ampla pode potencialmente ter milhares de colunas, enquanto menos de 100 são comuns em bancos de dados relacionais. Mesas
largas geralmente são esparsas; a grande maioria das entradas em um determinado campo pode ser nula. Isso é extremamente caro em um
banco de dados relacional tradicional porque o banco de dados aloca uma quantidade fixa de espaço para cada entrada de campo; nulos praticamente não
ocupam espaço em um banco de dados colunar. Um esquema amplo em um banco de dados relacional diminui drasticamente a leitura porque cada linha
deve alocar todo o espaço especificado pelo esquema amplo e o banco de dados deve ler o conteúdo de cada linha em sua totalidade. Por outro lado, um
banco de dados colunar lê apenas as colunas selecionadas em uma consulta e a leitura de nulos é essencialmente gratuita.
Tabelas amplas geralmente surgem por meio da evolução do esquema; engenheiros adicionam campos gradualmente ao longo do tempo. A evolução do
esquema em um banco de dados relacional é um processo lento e com muitos recursos. Em um banco de dados colunar, adicionar um campo é inicialmente
apenas uma alteração nos metadados. À medida que os dados são gravados no novo campo, novos arquivos são adicionados à coluna.
As consultas de análise em tabelas amplas geralmente são executadas mais rapidamente do que consultas equivalentes em dados altamente normalizados
que exigem muitas junções. A remoção de junções pode ter um grande impacto no desempenho da verificação. A tabela ampla simplesmente contém todos os
dados que você juntaria em uma abordagem de modelagem mais rigorosa. Fatos e dimensões são representados na mesma tabela. A falta de rigor no modelo
de dados também significa que não há muito pensamento envolvido. Carregue seus dados em uma tabela ampla e comece a consultá-los. Especialmente com
esquemas em sistemas de origem se tornando mais adaptáveis e flexíveis, esses dados geralmente resultam de transações de alto volume, o que significa que
há muitos dados. Armazenar isso como dados aninhados em seu armazenamento analítico tem muitos benefícios.
Machine Translated by Google
Jogar todos os seus dados em uma única tabela pode parecer uma heresia para um modelador de dados hardcore, e temos
visto muitas críticas. Quais são algumas dessas críticas? A maior crítica é que, à medida que você mistura seus dados, perde a
lógica de negócios em suas análises. Outra desvantagem é o desempenho de atualizações para coisas como um elemento em
uma matriz, o que pode ser muito doloroso.
Vejamos um exemplo de uma tabela ampla (Tabela 8-21), usando a tabela desnormalizada original de nosso exemplo de
normalização anterior. Essa tabela pode ter muito mais colunas — centenas ou mais! — e incluímos apenas algumas colunas
para concisão e facilidade de compreensão. Como você pode ver, esta tabela combina vários tipos de dados, representados ao
longo de um grão de pedidos de um cliente em uma data.
Machine Translated by Google
T
uma
bl
e
8
-
2
1
.
UMA
n
e
x
uma
pl
e
o
fd
e
n
o
r
m
uma
eu
eu
z
e
dd
uma
t
uma
Código do pedido Itens de ordem Identificação do Cliente Nome do Cliente Data do Pedido Local SiteRegião
[{
"sk
vc": 1,
"pr
gelo": 50,
"quantidade": 1,
"n / D
eu:": "Thingamaji
g" }, {
"sk
vc": 2,
"pr
gelo": 25,
Machine Translated by Google
"quantidade": 2,
"n / D
eu:": "Whatchamac
tudo isso"
}]
Sugerimos o uso de uma tabela ampla quando você não se importa com a modelagem de dados ou quando tem muitos dados que precisam de
mais flexibilidade do que o rigor da modelagem de dados tradicional oferece. Tabelas amplas também se prestam a dados de streaming, que
discutiremos a seguir. À medida que os dados avançam em direção a esquemas de movimento rápido e streaming em primeiro lugar, esperamos
ver uma nova onda de modelagem de dados, talvez algo como “normalização relaxada”.
Você também tem a opção de não modelar seus dados. Nesse caso, basta consultar as fontes de dados diretamente. Esse padrão é
frequentemente usado, especialmente quando as empresas estão apenas começando e desejam obter insights rápidos ou compartilhar
análises com seus usuários. Embora permita obter respostas para várias perguntas, você deve considerar o seguinte:
Se eu não modelar meus dados, como saberei se os resultados das minhas consultas são consistentes?
Tenho definições adequadas de lógica de negócios no sistema de origem e minha consulta produzirá respostas verdadeiras?
Que carga de consulta estou colocando em meus sistemas de origem e como isso afeta os usuários desses sistemas?
Em algum momento, você provavelmente vai gravitar em direção a um paradigma de modelo de dados em lote mais estrito e uma
arquitetura de dados dedicada que não depende dos sistemas de origem para o trabalho pesado.
Embora muitas técnicas de modelagem de dados estejam bem estabelecidas para lotes, esse não é o caso para dados de streaming.
Devido à natureza ilimitada e contínua dos dados de streaming, traduzir técnicas de lote como Kimball para um paradigma de streaming é
complicado, se não impossível. Por exemplo, dado um fluxo de dados, como você atualizaria continuamente uma dimensão de mudança lenta do
Tipo 2 sem deixar seu data warehouse de joelhos?
O mundo está evoluindo do lote para o streaming e do local para a nuvem. As restrições dos métodos de lote mais antigos não se aplicam
mais. Dito isso, permanecem grandes questões sobre como modelar dados para equilibrar a necessidade de lógica de negócios em relação a
mudanças fluidas de esquema, dados em movimento rápido e autoatendimento. Qual é o equivalente de streaming das abordagens de modelo
de dados em lote anteriores? Não há (ainda) uma abordagem de consenso sobre modelagem de dados de streaming.
Conversamos com muitos especialistas em sistemas de dados de streaming, muitos dos quais nos disseram que a modelagem tradicional de
dados orientada a lotes não se aplica ao streaming. Alguns sugeriram o cofre de dados como uma opção para modelagem de dados de streaming.
Como você deve se lembrar, existem dois tipos principais de fluxos: fluxos de eventos e CDC. Na maioria das vezes, a forma dos dados
nesses fluxos é semiestruturada, como JSON. O desafio com a modelagem de dados de streaming é que o esquema da carga útil pode mudar
por capricho. Por exemplo, suponha que você tenha um dispositivo IoT que atualizou recentemente seu firmware e introduziu um novo campo.
Nesse caso, é possível que seu data warehouse de destino downstream ou pipeline de processamento não esteja ciente dessa alteração e seja
interrompido. Isso não é ótimo. Como outro exemplo, um sistema CDC pode reformular um campo como um tipo diferente — digamos, uma string
em vez de um formato de data e hora da International Organization for Standardization (ISO). Novamente, como o destino lida com essa mudança
aparentemente aleatória?
Os especialistas em dados de streaming com quem conversamos sugerem que você preveja mudanças nos dados de origem e mantenha um
esquema flexível. Isso significa que não há um modelo de dados rígido no banco de dados analítico. Em vez disso, suponha que os sistemas de
origem estejam fornecendo os dados corretos com a definição e a lógica de negócios corretas, como existem hoje. E como o armazenamento é
barato, armazene o streaming recente e os dados históricos salvos de forma que possam ser consultados juntos.
Machine Translated by Google
Otimize para análises abrangentes em um conjunto de dados com um esquema flexível. Além disso, em vez de reagir a relatórios, por que não criar uma
automação que responda a anomalias e alterações nos dados de streaming?
O mundo da modelagem de dados está mudando e acreditamos que uma mudança radical ocorrerá em breve nos paradigmas do modelo de dados.
Essas novas abordagens provavelmente incorporarão métricas e camadas semânticas, pipelines de dados e fluxos de trabalho analíticos tradicionais em
uma camada de streaming que fica diretamente na parte superior do sistema de origem. Como os dados estão sendo gerados em tempo real, a noção
de separar artificialmente os sistemas de origem e análise em dois buckets distintos pode não fazer tanto sentido quanto quando os dados são movidos
de forma mais lenta e previsível. O tempo vai dizer…
Transformações
O resultado líquido da transformação de dados é a capacidade de unificar e integrar dados. Uma vez que os dados são transformados, os
dados podem ser vistos como uma única entidade. Mas sem transformar os dados, você não pode ter uma visão unificada dos dados em
toda a organização.
—Bill Inmon
Agora que abordamos consultas e modelagem de dados, você deve estar se perguntando: se posso modelar dados, consultá-los e obter resultados, por
que preciso pensar em transformações? As transformações manipulam, aprimoram e salvam dados para uso posterior, aumentando seu valor de maneira
escalável, confiável e econômica.
Imagine executar uma consulta sempre que quiser visualizar os resultados de um conjunto de dados específico. Você executaria a mesma consulta
dezenas ou centenas de vezes por dia. Imagine que essa consulta envolva análise, limpeza, junção, união e agregação em 20 conjuntos de dados.
Para agravar ainda mais a dor, a consulta leva 30 minutos para ser executada, consome recursos significativos e incorre em cobranças de nuvem
substanciais em várias repetições. Você provavelmente ficaria louco.
Felizmente, você pode salvar os resultados de sua consulta ou, pelo menos, executar as partes mais intensivas em computação apenas uma vez, para
que as consultas subsequentes sejam simplificadas.
Uma transformação difere de uma consulta. Uma consulta recupera os dados de várias fontes com base na filtragem e na lógica de junção. Uma
transformação mantém os resultados para consumo por transformações ou consultas adicionais. Esses resultados podem ser armazenados de forma
efêmera ou permanente.
Além da persistência, um segundo aspecto que diferencia transformações de consultas é a complexidade. Você provavelmente criará pipelines
complexos que combinam dados de várias fontes e reutilizam resultados intermediários para várias saídas finais. Esses pipelines complexos podem
normalizar, modelar, agregar ou caracterizar dados. Embora você possa criar fluxos de dados complexos em consultas únicas usando expressões de
tabela, scripts ou DAGs comuns, isso rapidamente se torna pesado, inconsistente e intratável. Insira as transformações.
As transformações dependem criticamente de uma das principais correntes ocultas deste livro: a orquestração. A orquestração combina muitas
operações discretas, como transformações intermediárias, que armazenam dados temporária ou permanentemente para consumo por
transformações ou serviços downstream. Cada vez mais, os pipelines de transformação abrangem não apenas várias tabelas e conjuntos de dados,
mas também vários sistemas.
Transformações em lote
As transformações em lote são executadas em blocos discretos de dados, em contraste com as transformações de streaming, em que os dados
são processados continuamente à medida que chegam. As transformações em lote podem ser executadas em uma programação fixa (por exemplo,
diariamente, de hora em hora ou a cada 15 minutos) para oferecer suporte a relatórios contínuos, análises e modelos de ML. Nesta seção, você aprenderá
vários padrões e tecnologias de transformação em lote.
Junções distribuídas A
idéia básica por trás das junções distribuídas é que precisamos quebrar uma junção lógica (a junção definida pela lógica de consulta) em junções de
nós muito menores que são executadas em servidores individuais no cluster. Os padrões básicos de junção distribuída aplicam-se a MapReduce
(discutido em “MapReduce”), BigQuery, Snowflake ou Spark, embora os detalhes de
Machine Translated by Google
armazenamento intermediário entre as etapas de processamento variam (no disco ou na memória). Na melhor das hipóteses, os dados em um lado da junção são pequenos o
suficiente para caber em um único nó (junção de difusão). Frequentemente, é necessária uma junção de hash aleatória mais intensiva em recursos .
Ingressar na transmissão
Uma junção de broadcast é geralmente assimétrica, com uma grande tabela distribuída entre os nós e uma pequena tabela que pode caber facilmente em um único nó (Figura
8-17). O mecanismo de consulta “transmite” a tabela pequena (tabela A) para todos os nós, onde ela é unida às partes da tabela grande (tabela B). As junções de transmissão
Figura 8-17. Em uma junção de transmissão, o mecanismo de consulta envia a tabela A para todos os nós do cluster para serem unidos às várias partes da tabela B
Na prática, a tabela A geralmente é uma tabela maior filtrada para baixo que o mecanismo de consulta coleta e transmite. Uma das principais prioridades nos otimizadores de
consulta é a reordenação de junção. Com a aplicação antecipada de filtros e o movimento de pequenas tabelas para a esquerda (para junções à esquerda), muitas vezes é
possível reduzir drasticamente a quantidade de dados processados em cada junção. A pré-filtragem de dados para criar junções de transmissão sempre que possível pode
Se nenhuma tabela for pequena o suficiente para caber em um único nó, o mecanismo de consulta usará uma junção de hash aleatória. Na Figura 8-18, os mesmos nós são
representados acima e abaixo da linha pontilhada. A área acima da linha pontilhada representa o particionamento inicial das tabelas A e B entre os nós. Em geral, esse particionamento
não terá relação com a chave de junção. Um esquema de hash é usado para reparticionar dados por chave de junção.
Machine Translated by Google
Neste exemplo, o esquema de hash dividirá a chave de junção em três partes, com cada parte atribuída a um nó.
Os dados são então reordenados para o nó apropriado e as novas partições para as tabelas A e B em cada nó são unidas. As
junções de hash aleatórias geralmente consomem mais recursos do que as junções de transmissão.
Conforme discutimos no Capítulo 3, um padrão de transformação difundido que data dos primeiros dias dos bancos de dados relacionais
é um ETL em lote. O ETL tradicional depende de um sistema de transformação externo para extrair, transformar e limpar dados
enquanto os prepara para um esquema de destino, como um data mart ou um esquema em estrela Kimball. Os dados transformados
seriam então carregados em um sistema de destino, como um data warehouse, onde a análise de negócios poderia ser realizada.
O próprio padrão ETL foi impulsionado pelas limitações dos sistemas de origem e destino. A fase de extração tendia a ser um grande
gargalo, com as restrições do RDBMS de origem limitando a taxa na qual os dados podiam ser extraídos.
Além disso, a transformação foi tratada em um sistema dedicado porque o sistema de destino tinha recursos extremamente
limitados em capacidade de armazenamento e CPU.
Uma evolução agora popular de ETL é ELT. À medida que os sistemas de data warehouse cresceram em desempenho e
capacidade de armazenamento, tornou-se comum simplesmente extrair dados brutos de um sistema de origem, importá-los para um
data warehouse com transformação mínima e depois limpá-los e transformá-los diretamente no sistema de warehouse. (Veja nossa
discussão sobre data warehouses no Capítulo 3 para uma discussão mais detalhada sobre a diferença entre ETL e ELT.)
Uma segunda noção ligeiramente diferente de ELT foi popularizada com o surgimento dos data lakes. Nesta versão, os dados não
são transformados no momento em que são carregados. De fato, grandes quantidades de dados podem ser carregadas sem nenhuma
preparação e nenhum plano. A suposição é que a etapa de transformação acontecerá em algum tempo futuro indeterminado. A
ingestão de dados sem um plano é uma ótima receita para um pântano de dados. Como diz Inmon:
Eu sempre fui um fã de ETL devido ao fato de que ETL força você a transformar dados antes de colocá-los em um formulário
onde você possa trabalhar com eles. Mas algumas organizações querem simplesmente pegar os dados, colocá-los em um
banco de dados e depois fazer a transformação... Já vi muitos casos em que a organização diz, ah, vamos apenas colocar
14
os dados e transformá-los mais tarde. E adivinha? Seis meses depois, esses dados nunca foram tocados.
Também vimos que a linha entre ETL e ELT pode ficar um pouco embaçada em um ambiente de data lakehouse. Com o
armazenamento de objetos como camada base, não fica mais claro o que está no banco de dados e o que está fora do banco de dados.
A ambiguidade é ainda mais exacerbada com o surgimento da federação de dados, virtualização e tabelas ativas. (Discutiremos
esses tópicos mais adiante nesta seção.)
Cada vez mais, sentimos que os termos ETL e ELT devem ser aplicados apenas no nível micro (dentro de pipelines de
transformação individuais) e não no nível macro (para descrever um padrão de transformação para um todo
Machine Translated by Google
organização). As organizações não precisam mais padronizar em ETL ou ELT, mas podem se concentrar na aplicação da técnica adequada
caso a caso à medida que constroem pipelines de dados.
Neste momento, a distinção entre sistemas de transformação baseados em SQL e não baseados em SQL parece um tanto sintética. Desde a
introdução do Hive na plataforma Hadoop, o SQL tornou-se um cidadão de primeira classe no ecossistema de big data. Por exemplo, o Spark
SQL foi um recurso inicial do Apache Spark. Estruturas que priorizam o streaming, como Kafka, Flink e Beam, também suportam SQL, com
recursos e funcionalidades variados.
É mais apropriado pensar em ferramentas somente SQL versus aquelas que suportam paradigmas de programação de propósito geral mais
poderosos. As ferramentas de transformação somente SQL abrangem uma ampla variedade de opções proprietárias e de código aberto.
O SQL é declarativo, mas ainda pode criar fluxos de trabalho de dados complexos
Muitas vezes ouvimos SQL descartado porque “não é processual”. Isso é tecnicamente correto. SQL é uma linguagem declarativa: em vez
de codificar um procedimento de processamento de dados, os escritores SQL estipulam as características de seus dados finais em linguagem de
teoria de conjuntos; o compilador e o otimizador SQL determinam as etapas necessárias para colocar os dados nesse estado.
As pessoas às vezes insinuam que, como o SQL não é procedural, ele não pode construir pipelines complexos. Isto é falso.
O SQL pode ser usado efetivamente para criar DAGs complexos usando expressões de tabela comuns, scripts SQL ou uma ferramenta
de orquestração.
Para ser claro, o SQL tem limites, mas muitas vezes vemos engenheiros fazendo coisas em Python e Spark que poderiam ser feitas com mais
facilidade e eficiência no SQL. Para ter uma ideia melhor das compensações sobre as quais estamos falando, vejamos alguns exemplos de Spark
e SQL.
Ao determinar se deve usar o código nativo Spark ou PySpark em vez do Spark SQL ou outro mecanismo SQL, faça a si mesmo as
seguintes perguntas:
3. Se algum código de transformação for enviado para uma biblioteca personalizada para reutilização futura no
organização?
Em relação à questão 1, muitas transformações codificadas no Spark podem ser realizadas em instruções SQL bastante simples. Por outro lado,
se a transformação não for realizável em SQL, ou se for extremamente difícil de implementar, o Spark nativo é uma opção melhor. Por exemplo,
podemos implementar o radical de palavras em SQL colocando sufixos de palavras em uma tabela, unindo-os a essa tabela, usando uma função
de análise sintática para encontrar sufixos em palavras e, em seguida, reduzindo a palavra ao seu radical usando uma função de substring. No
entanto, isso soa como um processo extremamente complexo com vários casos extremos a serem considerados. Uma linguagem de programação
procedural mais poderosa se encaixa melhor aqui.
A questão 2 está intimamente relacionada. A consulta de raiz de palavras não será legível nem sustentável.
Em relação à questão 3, uma das maiores limitações do SQL é que ele não inclui uma noção natural de bibliotecas ou código reutilizável. Uma
exceção é que alguns mecanismos SQL permitem que você mantenha funções definidas pelo usuário (UDFs) como objetos dentro de um banco
15
de dados. No entanto, eles não estão comprometidos com um repositório Git sem um sistema CI/CD externo para gerenciar a implantação. Além
disso, o SQL não tem uma boa noção de reutilização para componentes de consulta mais complexos. É claro que as bibliotecas reutilizáveis são
fáceis de criar no Spark e no PySpark.
Acrescentaremos que é possível reciclar o SQL de duas maneiras. Primeiro, podemos reutilizar facilmente os resultados de uma consulta SQL
confirmando em uma tabela ou criando uma visualização. Esse processo geralmente é mais bem tratado em uma ferramenta de orquestração,
como o Airflow, para que as consultas downstream possam ser iniciadas assim que a consulta de origem for concluída. Em segundo lugar, a Data
Build Tool (dbt) facilita a reutilização de instruções SQL e oferece uma linguagem de modelagem que facilita a personalização.
Machine Translated by Google
Os acólitos do Spark frequentemente reclamam que o SQL não lhes dá controle sobre o processamento de dados. O mecanismo SQL pega suas
instruções, as otimiza e as compila em suas etapas de processamento. (Na prática, a otimização pode acontecer antes ou depois da compilação,
ou ambos.)
Esta é uma reclamação justa, mas existe um corolário. Com o Spark e outras estruturas de processamento de código pesado, o escritor de código se
torna responsável por grande parte da otimização que é tratada automaticamente em um mecanismo baseado em SQL. A API Spark é poderosa e
complexa, o que significa que não é tão fácil identificar candidatos para reordenação, combinação ou decomposição. Ao adotar o Spark, as equipes
de engenharia de dados precisam se envolver ativamente com os problemas de otimização do Spark, especialmente para trabalhos caros e de longa
duração. Isso significa criar experiência em otimização na equipe e ensinar engenheiros individuais a otimizar.
2. Confie fortemente na API central do Spark e aprenda a entender a maneira nativa do Spark de fazer as coisas. Tente confiar em bibliotecas
públicas bem mantidas se a API do Spark nativa não oferecer suporte ao seu caso de uso. Um bom código Spark é substancialmente declarativo.
A recomendação 1 também se aplica à otimização do SQL, com a diferença de que o Spark pode não conseguir reordenar algo que o SQL manipularia
para você automaticamente. O Spark é uma estrutura de processamento de big data, mas quanto menos dados você precisar processar, menos
recursos pesados e mais desempenho será seu código.
Se você estiver escrevendo um código personalizado extremamente complexo, faça uma pausa e determine se há uma maneira mais nativa de
fazer o que você está tentando realizar. Aprenda a entender o Spark idiomático lendo exemplos públicos e trabalhando em tutoriais. Existe algo na
API do Spark que pode realizar o que você está tentando fazer? Existe uma biblioteca pública bem mantida e otimizada que possa ajudar?
A terceira recomendação é crucial para o PySpark. Em geral, o PySpark é um wrapper de API para Scala Spark. Seu código envia o trabalho para
o código Scala nativo em execução na JVM chamando a API. A execução de UDFs do Python força os dados a serem passados para o Python,
onde o processamento é menos eficiente. Se você estiver usando UDFs do Python, procure uma maneira mais nativa do Spark de realizar o que está
fazendo. Volte para a recomendação: existe uma maneira de realizar sua tarefa usando a API principal ou uma biblioteca bem mantida? Se você
precisar usar UDFs, considere reescrevê-los em Scala ou Java para melhorar o desempenho.
Quanto à recomendação 4, o uso do SQL nos permite aproveitar o otimizador Spark Catalyst, que pode extrair mais desempenho do que com o
código Spark nativo. O SQL geralmente é mais fácil de escrever e manter para operações simples. A combinação de Spark e SQL nativos nos
permite obter o melhor dos dois mundos — funcionalidade poderosa e de uso geral combinada com simplicidade, quando aplicável.
Muitos dos conselhos de otimização nesta seção são bastante genéricos e também se aplicam ao Apache Beam, por exemplo. O ponto principal é
que as APIs de processamento de dados programáveis exigem um pouco mais de sutileza de otimização do que o SQL, que talvez seja menos
poderoso e mais fácil de usar.
Atualizar padrões
Como as transformações persistem nos dados, geralmente atualizamos os dados persistentes no local. A atualização de dados é um grande problema
para as equipes de engenharia de dados, especialmente à medida que fazem a transição entre as tecnologias de engenharia de dados. Estamos
discutindo DML em SQL, que apresentamos anteriormente neste capítulo.
Mencionamos várias vezes ao longo do livro que o conceito original de data lake não levava em conta a atualização de dados. Isso agora parece
absurdo por várias razões. A atualização de dados tem sido uma parte fundamental do tratamento dos resultados da transformação de dados, embora
a comunidade de big data a tenha rejeitado. É tolice repetir significativamente
Machine Translated by Google
quantidade de trabalho porque não temos recursos de atualização. Assim, o conceito de data lakehouse agora é construído em atualizações.
Além disso, o GDPR e outros padrões de exclusão de dados agora exigem que as organizações excluam dados de maneira direcionada, mesmo em
conjuntos de dados brutos.
Truncar e recarregar
Truncar é um padrão de atualização que não atualiza nada. Ele simplesmente limpa os dados antigos. Em um padrão de atualização truncar e recarregar,
uma tabela é limpa de dados e as transformações são executadas novamente e carregadas nessa tabela, gerando efetivamente uma nova versão da
tabela.
Inserir somente
Inserir somente insere novos registros sem alterar ou excluir registros antigos. Padrões somente de inserção podem ser usados para manter uma
exibição atual dos dados, por exemplo, se novas versões de registros forem inseridas sem excluir registros antigos.
Uma consulta ou exibição pode apresentar o estado atual dos dados localizando o registro mais recente por chave primária. Observe que os bancos de
dados colunares normalmente não impõem chaves primárias. A chave primária seria uma construção usada pelos engenheiros para manter uma noção do
estado atual da tabela. A desvantagem dessa abordagem é que pode ser extremamente caro do ponto de vista computacional encontrar o registro mais
recente no momento da consulta. Alternativamente, podemos usar uma visão materializada (abordada mais adiante no capítulo), uma tabela somente de
inserção que mantém todos os registros e uma tabela de destino truncar e recarregar que mantém o estado atual para servir dados.
AVISO
Ao inserir dados em um banco de dados OLAP orientado a colunas, o problema comum é que os engenheiros que fazem a transição de sistemas orientados a linhas tentam
usar inserções de uma única linha. Esse antipadrão coloca uma carga enorme no sistema. Também faz com que os dados sejam gravados em muitos arquivos separados;
isso é extremamente ineficiente para leituras subsequentes e os dados devem ser reclusterizados posteriormente. Em vez disso, recomendamos o carregamento de dados de
forma periódica em microlotes ou lotes.
Mencionaremos uma exceção ao conselho para não inserir com frequência: a arquitetura Lambda aprimorada usada pelo BigQuery e Apache Druid,
que hibridiza um buffer de streaming com armazenamento colunar. Exclusões e atualizações in-loco ainda podem ser caras, como discutiremos a
seguir.
Excluir
A exclusão é crítica quando um sistema de origem exclui dados e atende às alterações regulatórias recentes. Em sistemas colunares e data lakes, as
exclusões são mais caras do que as inserções.
Ao excluir dados, considere se você precisa fazer uma exclusão física ou temporária. Uma exclusão definitiva remove permanentemente um registro de
um banco de dados, enquanto uma exclusão reversível marca o registro como "excluído". Exclusões definitivas são úteis quando você precisa remover
dados por motivos de desempenho (digamos, uma tabela é muito grande) ou se houver um motivo legal ou de conformidade para isso.
As exclusões temporárias podem ser usadas quando você não deseja excluir um registro permanentemente, mas também deseja filtrá-lo dos
resultados da consulta.
Uma terceira abordagem para exclusões está intimamente relacionada às exclusões reversíveis: inserir exclusão insere um novo registro com um
sinalizador excluído sem modificar a versão anterior do registro. Isso nos permite seguir um padrão somente de inserção, mas ainda leva em conta as
exclusões. Apenas observe que nossa consulta para obter o estado mais recente da tabela fica um pouco mais complicada. Agora devemos desduplicar,
encontrar a versão mais recente de cada registro por chave e não mostrar nenhum registro cuja versão mais recente mostre
excluído.
Upsert/ merge
Desses padrões de atualização, os padrões upsert e merge são os que causam mais problemas para as equipes de engenharia de dados, especialmente
para pessoas que estão fazendo a transição de data warehouses baseados em linhas para sistemas em nuvem baseados em colunas.
Machine Translated by Google
O upserting usa um conjunto de registros de origem e procura correspondências em uma tabela de destino usando uma chave primária ou outra
condição lógica. (Novamente, é responsabilidade da equipe de engenharia de dados gerenciar essa chave primária executando consultas apropriadas. A
maioria dos sistemas colunares não impõe exclusividade.) Quando ocorre uma correspondência de chave, o registro de destino é atualizado (substituído
pelo novo registro). Quando não existe correspondência, o banco de dados insere o novo registro. O padrão de mesclagem adiciona a isso a capacidade
de excluir registros.
Então qual é o problema? O padrão upsert/merge foi originalmente projetado para bancos de dados baseados em linha. Em bancos de dados baseados em
linhas, as atualizações são um processo natural: o banco de dados procura o registro em questão e o altera no lugar.
Por outro lado, os sistemas baseados em arquivos não oferecem suporte a atualizações de arquivos in-loco. Todos esses sistemas utilizam cópia na gravação
(COW). Se um registro em um arquivo for alterado ou excluído, todo o arquivo deverá ser reescrito com as novas alterações.
Isso é parte do motivo pelo qual os primeiros adeptos de big data e data lakes rejeitaram as atualizações: gerenciar arquivos e atualizações parecia
muito complicado. Assim, eles simplesmente usaram um padrão somente de inserção e presumiram que os consumidores de dados determinariam o
estado atual dos dados no momento da consulta ou em transformações downstream. Na realidade, bancos de dados colunares como o Vertica há muito
oferecem suporte a atualizações in-loco, ocultando a complexidade do COW dos usuários.
Eles verificam arquivos, alteram os registros relevantes, gravam novos arquivos e alteram ponteiros de arquivo para a tabela. Os principais data
warehouses em nuvem colunar suportam atualizações e fusões, embora os engenheiros devam investigar o suporte a atualizações se considerarem
adotar uma tecnologia exótica.
Há algumas coisas importantes para entender aqui. Embora os sistemas de dados colunares distribuídos suportem comandos de atualização nativos,
as mesclagens têm um custo: o impacto no desempenho da atualização ou exclusão de um único registro pode ser bastante alto. Por outro lado, as
mesclagens podem ser extremamente eficientes para grandes conjuntos de atualizações e podem até superar os bancos de dados transacionais.
Além disso, é importante entender que COW raramente envolve reescrever a tabela inteira. Dependendo do sistema de banco de dados em questão, o
COW pode operar em várias resoluções (partição, cluster, bloco). Para realizar atualizações de desempenho, concentre-se no desenvolvimento de uma
estratégia apropriada de particionamento e clustering com base em suas necessidades e nas entranhas do banco de dados em questão.
Assim como nas inserções, tenha cuidado com a frequência de atualização ou mesclagem. Vimos muitas equipes de engenharia fazerem a transição
entre os sistemas de banco de dados e tentarem executar mesclagens quase em tempo real do CDC, exatamente como faziam em seu sistema antigo.
Simplesmente não funciona. Não importa quão bom seja seu sistema CDC, essa abordagem deixará a maioria dos data warehouses colunares de joelhos.
Vimos os sistemas ficarem semanas atrasados nas atualizações, onde uma abordagem que simplesmente se fundisse a cada hora faria muito mais sentido.
Podemos usar várias abordagens para aproximar os bancos de dados colunares do tempo real. Por exemplo, o BigQuery nos permite fazer streaming de
novos registros em uma tabela e, em seguida, oferece suporte a visualizações materializadas especializadas que apresentam uma visualização de tabela
desduplicada eficiente e quase em tempo real. O Druid usa armazenamento de duas camadas e SSDs para oferecer suporte a consultas ultrarrápidas em tempo real.
Atualizações de esquema
Os dados têm entropia e podem mudar sem o seu controle ou consentimento. As fontes de dados externas podem alterar seu esquema ou as
equipes de desenvolvimento de aplicativos podem adicionar novos campos ao esquema. Uma vantagem dos sistemas colunares sobre os sistemas baseados
em linhas é que, embora a atualização dos dados seja mais difícil, a atualização do esquema é mais fácil. As colunas geralmente podem ser adicionadas,
excluídas e renomeadas.
Apesar dessas melhorias tecnológicas, o gerenciamento prático do esquema organizacional é mais desafiador.
Algumas atualizações de esquema serão automatizadas? (Esta é a abordagem que o Fivetran usa ao replicar a partir de fontes.)
Por mais conveniente que isso pareça, existe o risco de que as transformações downstream sejam interrompidas.
Existe um processo de solicitação de atualização de esquema simples? Suponha que uma equipe de ciência de dados queira adicionar uma coluna de
uma fonte que não foi ingerida anteriormente. Como será o processo de revisão? Os processos a jusante serão interrompidos? (Existem consultas que
executam SELECT * em vez de usar seleção de coluna explícita? Isso geralmente é uma prática ruim em bancos de dados colunares.) Quanto tempo levará
para implementar a alteração? É possível criar uma bifurcação de tabela — ou seja, uma nova versão de tabela específica para este projeto?
Machine Translated by Google
Uma nova opção interessante surgiu para dados semiestruturados. Tomando emprestada uma ideia de armazenamentos de documentos, muitos data warehouses
na nuvem agora oferecem suporte a tipos de dados que codificam dados JSON arbitrários. Uma abordagem armazena JSON bruto em um campo enquanto armazena
dados acessados com frequência em campos nivelados adjacentes. Isso ocupa espaço de armazenamento adicional, mas permite a conveniência de dados achatados,
Os dados acessados com frequência no campo JSON podem ser adicionados diretamente ao esquema ao longo do tempo.
Essa abordagem funciona extremamente bem quando os engenheiros de dados precisam ingerir dados de um armazenamento de documentos de aplicativo com
um esquema que muda com frequência. Dados semiestruturados disponíveis como cidadãos de primeira classe em data warehouses são extremamente flexíveis
e abrem novas oportunidades para analistas de dados e cientistas de dados, pois os dados não são mais restritos a linhas e colunas.
A disputa de dados A
disputa de dados pega dados confusos e malformados e os transforma em dados úteis e limpos. Isso geralmente é um processo de transformação em lote.
A disputa de dados tem sido uma grande fonte de dor e segurança no trabalho para desenvolvedores de ETL. Por exemplo, suponha que os desenvolvedores
recebam dados EDI (consulte o Capítulo 7) de um parceiro comercial sobre transações e faturas, potencialmente uma combinação de dados estruturados e texto. O
processo típico de disputar esses dados envolve primeiro tentar ingeri-los. Freqüentemente, os dados são tão malformados que uma boa quantidade de pré-
processamento de texto está envolvida. Os desenvolvedores podem optar por ingerir os dados como uma única tabela de campo de texto — uma linha inteira
ingerida como um único campo. Os desenvolvedores então começam a escrever consultas para analisar e separar os dados. Com o tempo, eles descobrem anomalias
Eventualmente, eles vão obter os dados em forma aproximada. Só então o processo de transformação downstream pode começar.
As ferramentas de organização de dados visam simplificar partes significativas desse processo. Essas ferramentas geralmente afastam os engenheiros de
dados porque afirmam não haver código, o que parece pouco sofisticado. Preferimos pensar nas ferramentas de manipulação de dados como ambientes de
desenvolvimento integrados (IDEs) para dados malformados. Na prática, os engenheiros de dados gastam muito tempo analisando dados desagradáveis; as
ferramentas de automação permitem que os engenheiros de dados gastem tempo em tarefas mais interessantes. As ferramentas de disputa também podem permitir
As ferramentas gráficas de manipulação de dados normalmente apresentam uma amostra de dados em uma interface visual, com tipos inferidos,
estatísticas incluindo distribuições, dados anômalos, valores discrepantes e nulos. Os usuários podem adicionar etapas de processamento para corrigir problemas
de dados. Uma etapa pode fornecer instruções para lidar com dados digitados incorretamente, dividir um campo de texto em várias partes ou unir-se a uma tabela
de pesquisa.
Os usuários podem executar as etapas em um conjunto de dados completo quando o trabalho completo estiver pronto. O trabalho normalmente é enviado para um
sistema de processamento de dados escalável, como o Spark, para grandes conjuntos de dados. Depois que o trabalho for executado, ele retornará erros e exceções
não tratadas. O usuário pode refinar ainda mais a receita para lidar com esses valores discrepantes.
É altamente recomendável que engenheiros aspirantes e experientes experimentem ferramentas de disputa; os principais provedores de nuvem vendem sua
versão de ferramentas de manipulação de dados e muitas opções de terceiros estão disponíveis. Os engenheiros de dados podem descobrir que essas ferramentas
simplificam significativamente certas partes de seus trabalhos. Organizacionalmente, as equipes de engenharia de dados podem querer considerar o treinamento
Vejamos um exemplo prático e concreto de transformação de dados. Suponha que construímos um pipeline que ingere dados de três fontes de API no formato
JSON. Essa etapa de ingestão inicial é tratada no Airflow. Cada fonte de dados obtém seu prefixo (caminho de arquivo) em um bucket do S3.
O Airflow aciona um trabalho do Spark chamando uma API. Esse trabalho do Spark ingere cada uma das três fontes em um dataframe, convertendo os
dados em um formato relacional, com aninhamento em determinadas colunas. O trabalho do Spark combina as três fontes em uma única tabela e filtra os resultados
com uma instrução SQL. Os resultados são finalmente gravados em uma tabela Delta Lake formatada em Parquet armazenada no S3.
Na prática, o Spark cria um DAG de etapas com base no código que escrevemos para ingerir, juntar e gravar os dados. A ingestão básica de dados acontece na
memória do cluster, embora uma das fontes de dados seja grande o suficiente
Machine Translated by Google
que deve ser derramado no disco durante o processo de ingestão. (Esses dados são gravados no armazenamento do cluster; eles serão recarregados
na memória para as etapas de processamento subsequentes.)
A junção requer uma operação de embaralhamento. Uma chave é usada para redistribuir dados pelo cluster; mais uma vez, ocorre um spill to disk à
medida que os dados são gravados em cada nó. A transformação SQL filtra as linhas na memória e descarta as linhas não utilizadas. Por fim, o Spark
converte os dados no formato Parquet, os compacta e os grava de volta no S3. O Airflow liga periodicamente para o Spark para ver se o trabalho foi
concluído. Depois de confirmar que o trabalho foi concluído, ele marca o Airflow DAG completo como concluído. (Observe que temos duas construções
de DAG aqui, um Airflow DAG e um DAG específico para o trabalho do Spark.)
Um dos casos de uso mais comuns para transformação é renderizar a lógica de negócios. Colocamos essa discussão em transformações em lote
porque é onde esse tipo de transformação acontece com mais frequência, mas observe que isso também pode acontecer em um pipeline de streaming.
Suponha que uma empresa use vários cálculos internos especializados de lucro. Uma versão pode analisar os lucros antes dos custos de marketing
e outra pode analisar o lucro após subtrair os custos de marketing. Mesmo que isso pareça ser um exercício de contabilidade simples, cada uma
dessas métricas é altamente complexa para renderizar.
O lucro antes dos custos de marketing pode precisar contabilizar pedidos fraudulentos; determinar uma estimativa de lucro razoável para o dia útil anterior
implica estimar qual porcentagem de receita e lucro será perdida para pedidos cancelados nos próximos dias, à medida que a equipe de fraude investiga
pedidos suspeitos. Existe um sinalizador especial no banco de dados que indica um pedido com alta probabilidade de fraude ou que foi cancelado
automaticamente? A empresa supõe que uma certa porcentagem de pedidos será cancelada por causa de fraude antes mesmo que o processo de
avaliação de risco de fraude tenha sido concluído para pedidos específicos?
Para lucros após os custos de marketing, devemos levar em conta todas as complexidades da métrica anterior, mais os custos de marketing
atribuídos ao pedido específico. A empresa tem um modelo de atribuição ingênuo – por exemplo, custos de marketing atribuídos a itens ponderados por
preço? Os custos de marketing também podem ser atribuídos por departamento ou categoria de item ou, nas organizações mais sofisticadas, por item
individual com base nos cliques nos anúncios do usuário.
A transformação da lógica de negócios que gera essa versão diferenciada de lucro deve integrar todas as sutilezas da atribuição — ou seja, um modelo
que vincule pedidos a anúncios específicos e custos de publicidade. Os dados de atribuição são armazenados nas entranhas dos scripts ETL ou são
extraídos de uma tabela que é gerada automaticamente a partir dos dados da plataforma de anúncios?
Esse tipo de dados de relatório é um exemplo por excelência de dados derivados – dados calculados a partir de outros dados armazenados em um
sistema de dados. Os críticos de dados derivados apontarão que é um desafio para o ETL manter a consistência nas métricas derivadas. Por exemplo,
se a empresa atualizar16seu modelo de atribuição, essa alteração pode precisar ser mesclada em muitos scripts ETL para geração de relatórios. (Os
scripts ETL são conhecidos por quebrar o princípio DRY.) A atualização desses scripts ETL é um processo manual e trabalhoso, envolvendo experiência
de domínio em lógica de processamento e alterações anteriores. Os scripts atualizados também devem ser validados para consistência e precisão.
Do nosso ponto de vista, essas são críticas legítimas, mas não necessariamente muito construtivas, porque a alternativa aos dados derivados neste
caso é igualmente desagradável. Os analistas precisarão executar suas consultas de relatórios se os dados de lucro não estiverem armazenados no
data warehouse, incluindo a lógica de lucro. A atualização de scripts ETL complexos para representar as alterações na lógica de negócios com precisão
é uma tarefa trabalhosa e trabalhosa, mas fazer com que os analistas atualizem suas consultas de relatórios de forma consistente é quase impossível.
MapReduce
Machine Translated by Google
Nenhuma discussão sobre transformação em lote pode ser concluída sem tocar em MapReduce. Isso não ocorre porque o MapReduce é amplamente
usado por engenheiros de dados atualmente. O MapReduce foi o padrão definidor de transformação de dados em lote da era do big data, ainda influencia
muitos sistemas distribuídos que os engenheiros de dados usam hoje e é útil para os engenheiros de dados entenderem em um nível básico. MapReduce foi
introduzido pelo Google na sequência de seu artigo sobre GFS. Foi inicialmente o padrão de processamento de fato do Hadoop, a tecnologia analógica de
código aberto do GFS que apresentamos no Capítulo 6.
Um trabalho MapReduce simples consiste em uma coleção de tarefas de mapa que lêem blocos de dados individuais espalhados pelos nós, seguidos por um
shuffle que redistribui os dados de resultados pelo cluster e uma etapa de redução que agrega dados em cada nó. Por exemplo, suponha que queiramos
executar a seguinte consulta SQL:
Os dados da tabela são distribuídos entre nós em blocos de dados; o trabalho MapReduce gera uma tarefa de mapa por bloco. Cada tarefa de mapa executa
essencialmente a consulta em um único bloco, ou seja, gera uma contagem para cada ID de usuário que aparece no bloco. Enquanto um bloco pode conter
centenas de megabytes, a tabela completa pode ter petabytes de tamanho. No entanto, a parte do mapa do trabalho é um exemplo quase perfeito de paralelismo
embaraçoso; a taxa de varredura de dados em todo o cluster basicamente é dimensionada linearmente com o número de nós.
Em seguida, precisamos agregar (reduzir) para reunir os resultados do cluster completo. Não estamos reunindo resultados em um único nó; em vez disso,
redistribuímos os resultados por chave para que cada chave termine em um e apenas um nó. Esta é a etapa de embaralhamento, que geralmente é executada
usando um algoritmo de hash nas teclas. Uma vez que os resultados do mapa tenham sido embaralhados, somamos os resultados para cada chave. Os pares
chave/contagem podem ser gravados no disco local no nó onde são calculados.
Coletamos os resultados armazenados nos nós para visualizar os resultados completos da consulta.
Os trabalhos MapReduce do mundo real podem ser muito mais complexos do que descrevemos aqui. Uma consulta complexa que filtra com uma cláusula
WHERE une três tabelas e aplica uma função de janela que consistiria em muitos estágios de mapeamento e redução.
Após MapReduce
O modelo MapReduce original do Google é extremamente poderoso, mas agora é visto como excessivamente rígido. Ele utiliza várias tarefas efêmeras
de curta duração que lêem e gravam no disco. Em particular, nenhum estado intermediário é preservado na memória; todos os dados são transferidos
entre tarefas armazenando-os em disco ou enviando-os pela rede. Isso simplifica o gerenciamento do estado e do fluxo de trabalho e minimiza o consumo de
memória, mas também pode aumentar a utilização da largura de banda do disco e aumentar o tempo de processamento.
O paradigma MapReduce foi construído em torno da ideia de que a capacidade e a largura de banda do disco magnético eram tão baratas que fazia sentido
simplesmente lançar uma enorme quantidade de disco nos dados para realizar consultas ultrarrápidas. Isso funcionou até certo ponto; O MapReduce estabeleceu
repetidamente registros de processamento de dados durante os primeiros dias do Hadoop.
No entanto, vivemos em um mundo pós-MapReduce por algum tempo. O processamento pós-MapReduce não descarta verdadeiramente o MapReduce; ele
ainda inclui os elementos map, shuffle e reduce, mas relaxa as restrições do MapReduce para permitir o armazenamento em cache na memória. Lembre-se de
18
que a RAM é muito mais rápida que SSD e HDDs em velocidade de transferência e tempo de busca. Persistindo até mesmo uma pequena quantidade de dados
criteriosamente escolhidos na memória pode acelerar drasticamente tarefas específicas de processamento de dados e esmagar totalmente o desempenho do
MapReduce.
Por exemplo, Spark, BigQuery e várias outras estruturas de processamento de dados foram projetadas em torno do processamento na memória. Essas
estruturas tratam os dados como um conjunto distribuído que reside na memória. Se os dados estourarem a memória disponível, isso causará um
transbordamento no disco. O disco é tratado como uma camada de armazenamento de dados de segunda classe para processamento, embora ainda seja
altamente valioso.
A nuvem é um dos impulsionadores para a adoção mais ampla do cache de memória; é muito mais eficaz alugar memória durante um trabalho de
processamento específico do que possuí-la 24 horas por dia. Os avanços no aproveitamento da memória para transformações continuarão a gerar ganhos no
futuro próximo.
Machine Translated by Google
Essas técnicas podem se tornar parte de um pipeline de transformação ou ficar logo antes do consumo de dados do usuário final.
Visualizações
Primeiro, vamos revisar as visualizações para definir o cenário para visualizações materializadas. Uma visão é um objeto de banco de dados que podemos selecionar
como qualquer outra tabela. Na prática, uma visão é apenas uma consulta que faz referência a outras tabelas. Quando selecionamos de uma visualização, esse banco
de dados cria uma nova consulta que combina a subconsulta da visualização com nossa consulta. O otimizador de consulta otimiza e executa a consulta completa.
As visualizações desempenham várias funções em um banco de dados. Primeiro, as exibições podem servir a uma função de segurança. Por exemplo, as
exibições podem selecionar apenas colunas específicas e filtrar linhas, fornecendo acesso restrito aos dados. Várias visualizações podem ser criadas para funções
Em segundo lugar, uma visualização pode ser usada para fornecer uma imagem desduplicada atual dos dados. Se estivermos usando um padrão somente
de inserção, uma exibição poderá ser usada para retornar uma versão desduplicada de uma tabela mostrando apenas a versão mais recente de cada registro.
Terceiro, as visualizações podem ser usadas para apresentar padrões comuns de acesso a dados. Suponha que os analistas de marketing devam executar
frequentemente uma consulta que una cinco tabelas. Poderíamos criar uma visão que una essas cinco tabelas em uma tabela ampla.
Os analistas podem então escrever consultas que filtram e agregam sobre essa visualização.
Visualizações materializadas
Mencionamos visualizações materializadas em nossa discussão anterior sobre cache de consulta. Uma desvantagem potencial das visualizações (não
materializadas) é que elas não fazem nenhuma pré-computação. No exemplo de uma exibição que une cinco tabelas, essa união deve ser executada sempre que
um analista de marketing executa uma consulta nessa exibição e a união pode ser extremamente cara.
Uma visão materializada faz parte ou todo o cálculo da visão com antecedência. Em nosso exemplo, uma visualização materializada pode salvar os cinco
resultados de junção de tabela sempre que ocorrer uma alteração nas tabelas de origem. Então, quando um usuário faz referência à exibição, ele está consultando os
dados pré-juntados. Uma visão materializada é uma etapa de transformação de fato, mas o banco de dados gerencia a execução por conveniência.
As exibições materializadas também podem desempenhar uma função significativa de otimização de consulta, dependendo do banco de dados, mesmo para
consultas que não as referenciam diretamente. Muitos otimizadores de consulta podem identificar consultas que “se parecem” com uma visualização
materializada. Um analista pode executar uma consulta que usa um filtro que aparece em uma visualização materializada. O otimizador reescreverá a consulta para
Em geral, as visualizações materializadas não permitem composição, ou seja, uma visualização materializada não pode selecionar a partir de outra
visualização materializada. No entanto, vimos recentemente o surgimento de ferramentas que suportam esse recurso. Por exemplo, Databricks introduziu a noção
de tabelas ativas. Cada tabela é atualizada à medida que os dados chegam das origens.
Consultas federadas
As consultas federadas são um recurso de banco de dados que permite que um banco de dados OLAP selecione uma fonte de dados externa, como armazenamento
de objeto ou RDBMS. Por exemplo, digamos que você precise combinar dados no armazenamento de objetos e várias tabelas nos bancos de dados MySQL e
PostgreSQL. Seu data warehouse pode emitir uma consulta federada para essas fontes e retornar os resultados combinados (Figura 8-19).
Machine Translated by Google
Figura 8-19. Um banco de dados OLAP emite uma consulta federada que obtém dados do armazenamento de objetos, MySQL e PostgreSQL e retorna um resultado de
consulta com os dados combinados
Como outro exemplo, o Snowflake suporta a noção de tabelas externas definidas em buckets do S3. Um local de dados externo e um formato
de arquivo são definidos ao criar a tabela, mas os dados ainda não foram ingeridos na tabela. Quando a tabela externa é consultada, o Snowflake
lê do S3 e processa os dados com base nos parâmetros definidos no momento da criação da tabela. Podemos até juntar dados do S3 a tabelas
internas do banco de dados. Isso torna o Snowflake e bancos de dados semelhantes mais compatíveis com um ambiente de data lake.
Alguns sistemas OLAP podem converter consultas federadas em visualizações materializadas. Isso nos dá muito do desempenho
de uma tabela nativa sem a necessidade de ingerir dados manualmente toda vez que a fonte externa muda. A visão materializada é atualizada
sempre que os dados externos são alterados.
Virtualização de dados
A virtualização de dados está intimamente relacionada a consultas federadas, mas isso normalmente envolve um sistema de processamento
e consulta de dados que não armazena dados internamente. Neste momento, Trino (por exemplo, Starburst) e Presto são exemplos por excelência.
Qualquer mecanismo de consulta/processamento que suporte tabelas externas pode servir como mecanismo de virtualização de dados. As
considerações mais significativas com a virtualização de dados são as fontes externas e o desempenho com suporte.
Um conceito intimamente relacionado é a noção de empilhamento de consulta. Suponha que eu queira consultar dados do Snowflake, juntar
dados de um banco de dados MySQL e filtrar os resultados. O pushdown de consulta visa mover o máximo de trabalho possível para os bancos
de dados de origem. O mecanismo pode procurar maneiras de enviar predicados de filtragem para as consultas nos sistemas de origem. Isso
serve a dois propósitos: primeiro, descarrega a computação da camada de virtualização, aproveitando o desempenho de consulta da fonte. Em
segundo lugar, reduz potencialmente a quantidade de dados que devem ser enviados pela rede, um gargalo crítico para o desempenho da
virtualização.
A virtualização de dados é uma boa solução para organizações com dados armazenados em várias fontes de dados. No entanto, a virtualização de
dados não deve ser usada aleatoriamente. Por exemplo, a virtualização de um banco de dados MySQL de produção não resolve o problema central
das consultas analíticas que afetam negativamente o sistema de produção – como o Trino não armazena dados internamente, ele extrairá do
MySQL toda vez que executar uma consulta.
Alternativamente, a virtualização de dados pode ser usada como um componente de ingestão de dados e pipelines de processamento. Por
exemplo, Trino pode ser usado para selecionar MySQL uma vez por dia à meia-noite quando a carga no sistema de produção é baixa. Os
resultados podem ser salvos no S3 para consumo por transformações downstream e consultas diárias, protegendo o MySQL de consultas
analíticas diretas.
Machine Translated by Google
A virtualização de dados pode ser vista como uma ferramenta que expande o data lake para muitas outras fontes, abstraindo as barreiras usadas
para armazenar dados em silos entre unidades organizacionais. Uma organização pode armazenar dados transformados e acessados com frequência
no S3 e virtualizar o acesso entre várias partes da empresa. Isso se encaixa perfeitamente com a noção de malha de dados (discutida no Capítulo 3),
em que pequenas equipes são responsáveis por preparar seus dados para análise e compartilhá-los com o restante da empresa; a virtualização pode
servir como uma camada de acesso crítica para compartilhamento prático.
Fundamentos
As consultas de streaming são executadas dinamicamente para apresentar uma visão atual dos dados, conforme discutido anteriormente.
As transformações de streaming visam preparar os dados para consumo downstream.
Por exemplo, uma equipe de engenharia de dados pode ter um fluxo de entrada carregando eventos de uma fonte de IoT. Esses eventos de IoT
carregam uma ID de dispositivo e dados de evento. Desejamos enriquecer dinamicamente esses eventos com outros metadados do dispositivo, que
são armazenados em um banco de dados separado. O mecanismo de processamento de fluxo consulta um banco de dados separado contendo esses
metadados por ID de dispositivo, gera novos eventos com os dados adicionados e os repassa para outro fluxo. As consultas ao vivo e as métricas
acionadas são executadas nesse fluxo enriquecido (consulte a Figura 8-20).
Figura 8-20. Um fluxo de entrada é transportado por uma plataforma de eventos de streaming e passado para um processador de fluxo
A linha entre transformações e consultas também é tênue no processamento em lote, mas as diferenças se tornam ainda mais sutis no domínio do
streaming. Por exemplo, se calcularmos dinamicamente estatísticas de roll-up em janelas e, em seguida, enviarmos a saída para um fluxo de destino,
isso é uma transformação ou uma consulta?
Talvez eventualmente adotemos uma nova terminologia para processamento de fluxo que represente melhor os casos de uso do mundo real.
Por enquanto, faremos o nosso melhor com a terminologia que temos.
DAGs de streaming
19
Uma noção interessante intimamente relacionada ao enriquecimento e junções de fluxo é o DAG de streaming. Falamos sobre essa ideia pela
primeira vez em nossa discussão sobre orquestração no Capítulo 2. A orquestração é inerentemente um conceito de lote, mas e se quisermos
enriquecer, mesclar e dividir vários fluxos em tempo real?
Vamos dar um exemplo simples em que o streaming de DAG seria útil. Suponha que queremos combinar dados de clickstream do site com dados
de IoT. Isso nos permitirá obter uma visão unificada da atividade do usuário combinando eventos de IoT com cliques. Além disso, cada fluxo de
dados precisa ser pré-processado em um formato padrão (veja a Figura 8-21).
Machine Translated by Google
Isso é possível há muito tempo combinando uma loja de streaming (por exemplo, Kafka) com um processador de fluxo (por exemplo, Flink).
Criar o DAG equivalia a construir uma máquina complexa de Rube Goldberg, com vários tópicos e trabalhos de processamento conectados.
O Pulsar simplifica drasticamente esse processo tratando os DAGs como uma abstração de streaming central. Em vez de gerenciar
fluxos em vários sistemas, os engenheiros podem definir seus DAGs de streaming como código dentro de um único sistema.
Uma longa batalha está em andamento entre as abordagens de micro-lote e de streaming verdadeiro. Fundamentalmente, é importante
entender seu caso de uso, os requisitos de desempenho e os recursos de desempenho da estrutura em questão.
O micro-lote é uma maneira de pegar uma estrutura orientada a lote e aplicá-la em uma situação de streaming. Um micro-lote pode ser
executado a cada dois minutos a cada segundo. Algumas estruturas de microlote (por exemplo, Apache Spark Streaming) são projetadas para
esse caso de uso e funcionarão bem com recursos alocados adequadamente em uma alta frequência de lote. (Na verdade, DBAs e engenheiros
há muito usam micro-lotes com bancos de dados mais tradicionais; isso geralmente leva a um desempenho e consumo de recursos horríveis.)
Os verdadeiros sistemas de streaming (por exemplo, Beam e Flink) são projetados para processar um evento por vez. No entanto, isso vem
com uma sobrecarga significativa. Além disso, é importante observar que, mesmo nesses verdadeiros sistemas de streaming, muitos
processos ainda ocorrerão em lotes. Um processo de enriquecimento básico que adiciona dados a eventos individuais pode entregar um evento
por vez com baixa latência. No entanto, uma métrica acionada no Windows pode ser executada a cada poucos segundos, a cada poucos minutos,
etc.
Quando você está usando janelas e gatilhos (portanto, processamento em lote), qual é a frequência da janela? Qual é a latência aceitável?
Se você estiver coletando métricas de vendas da Black Friday publicadas a cada poucos minutos, os micro-lotes provavelmente funcionarão
bem, desde que você defina uma frequência de micro-lote apropriada. Por outro lado, se sua equipe de operações está computando métricas a
cada segundo para detectar ataques DDoS, o streaming verdadeiro pode ser necessário.
Quando você deve usar um sobre o outro? Francamente, não existe uma resposta universal. O termo micro-lote tem sido frequentemente
usado para descartar tecnologias concorrentes, mas pode funcionar bem para o seu caso de uso e pode ser superior em muitos aspectos,
dependendo de suas necessidades. Se sua equipe já tiver experiência em Spark, você poderá criar uma solução de streaming Spark (micro-
lote) com extrema rapidez.
Não há substituto para experiência de domínio e testes do mundo real. Converse com especialistas que podem apresentar uma opinião
imparcial. Você também pode testar facilmente as alternativas criando testes na infraestrutura de nuvem. Além disso, atente para benchmarks
espúrios fornecidos pelos fornecedores. Os fornecedores são famosos por escolher benchmarks e configurar
Machine Translated by Google
exemplos artificiais que não correspondem à realidade (lembre-se de nossa conversa sobre benchmarks no Capítulo 4). Frequentemente, os
fornecedores mostram grandes vantagens em seus resultados de benchmark, mas não entregam no mundo real para seu uso
caso.
Ao interagir com as partes interessadas upstream sobre definições e lógica de negócios, você precisará conhecer as fontes de dados — o que
são, como são usadas e a lógica e as definições de negócios envolvidas. Você trabalhará com os engenheiros responsáveis por esses sistemas
de origem e as partes interessadas do negócio que supervisionam os produtos e aplicativos complementares. Um engenheiro de dados pode
trabalhar ao lado de “negócios” e partes interessadas técnicas em um modelo de dados.
O engenheiro de dados precisa estar envolvido no projeto do modelo de dados e nas atualizações posteriores devido a mudanças na lógica
de negócios ou novos processos. As transformações são bastante fáceis de fazer; basta escrever uma consulta e colocar os resultados em uma
tabela ou exibição. Criá-los para que tenham desempenho e valor para o negócio é outra questão. Sempre mantenha os requisitos e expectativas do
negócio em mente ao transformar dados.
As partes interessadas dos sistemas upstream querem garantir que suas consultas e transformações afetem minimamente seus sistemas. Garanta
a comunicação bidirecional sobre as alterações nos modelos de dados (alterações de coluna e índice, por exemplo) nos sistemas de origem, pois
podem afetar diretamente as consultas, transformações e modelos de dados analíticos.
Os engenheiros de dados devem conhecer as alterações de esquema, incluindo a adição ou exclusão de campos, alterações de tipo de dados e
qualquer outra coisa que possa afetar materialmente a capacidade de consultar e transformar dados.
Subcorrentes
O estágio de transformação é onde seus dados se transformam e se transformam em algo útil para os negócios. Como há muitas partes móveis,
as subcorrentes são especialmente críticas neste estágio.
Segurança
Consultas e transformações combinam conjuntos de dados diferentes em novos conjuntos de dados. Quem tem acesso a este novo conjunto de
dados? Se alguém tiver acesso a um conjunto de dados, continue controlando quem tem acesso à coluna, linha e célula de um conjunto de dados.
Machine Translated by Google
nível de acesso.
Esteja ciente dos vetores de ataque contra seu banco de dados no momento da consulta. Os privilégios de leitura/gravação no banco de
dados devem ser rigidamente monitorados e controlados. O acesso de consulta ao banco de dados deve ser controlado da mesma forma que você
normalmente controla o acesso aos sistemas e ambientes de sua organização.
Mantenha as credenciais ocultas; evite copiar e colar senhas, tokens de acesso ou outras credenciais em código ou arquivos não criptografados.
É surpreendentemente comum ver código nos repositórios do GitHub com nomes de usuário e senhas de banco de dados colados diretamente
na base de código! Escusado será dizer, não compartilhe senhas com outros usuários. Por fim, nunca permita que dados não seguros ou não
criptografados atravessem a Internet pública.
Gestão de dados
Embora o gerenciamento de dados seja essencial no estágio do sistema de origem (e em todos os outros estágios do ciclo de vida da
engenharia de dados), ele é especialmente crítico no estágio de transformação. A transformação cria inerentemente novos conjuntos de dados
que precisam ser gerenciados. Assim como em outros estágios do ciclo de vida da engenharia de dados, é fundamental envolver todas as partes
interessadas nos modelos e transformações de dados e gerenciar suas expectativas. Além disso, certifique-se de que todos concordem com as
convenções de nomenclatura que se alinham às respectivas definições de negócios dos dados. Convenções de nomenclatura adequadas devem
ser refletidas em nomes de campo fáceis de entender. Os usuários também podem verificar em um catálogo de dados para obter mais clareza
sobre o que o campo significa quando foi criado, quem mantém o conjunto de dados e outras informações relevantes.
A contabilização da precisão da definição é fundamental no estágio de transformação. A transformação segue a lógica de negócios esperada?
Cada vez mais, a noção de uma camada semântica ou de métricas que fica independente de transformações está se tornando popular. Em
vez de impor a lógica de negócios dentro da transformação em tempo de execução, por que não manter essas definições como um estágio autônomo
antes de sua camada de transformação? Embora ainda seja cedo, espere ver as camadas semânticas e métricas se tornando mais populares e
comuns na engenharia de dados e no gerenciamento de dados.
Como as transformações envolvem dados mutantes, é fundamental garantir que os dados que você está usando estejam livres de defeitos e
representem a verdade. Se o MDM for uma opção em sua empresa, busque sua implementação. Dimensões conformadas e outras transformações
contam com o MDM para preservar a integridade original dos dados e a verdade do terreno. Se o MDM não for possível, trabalhe com as partes
interessadas upstream que controlam os dados para garantir que todos os dados que você está transformando estejam corretos e estejam em
conformidade com a lógica de negócios acordada.
As transformações de dados tornam potencialmente difícil saber como um conjunto de dados foi derivado nas mesmas linhas. No Capítulo 6,
discutimos os catálogos de dados. À medida que transformamos os dados, as ferramentas de linhagem de dados se tornam inestimáveis. As
ferramentas de linhagem de dados ajudam os engenheiros de dados, que devem entender as etapas anteriores da transformação à medida que
criam novas transformações, e os analistas, que precisam entender de onde os dados vieram enquanto executam consultas e criam relatórios.
Por fim, que impacto a conformidade regulatória tem em seu modelo de dados e transformações? Os dados de campos confidenciais são
mascarados ou ofuscados, se necessário? Você tem a capacidade de excluir dados em resposta a solicitações de exclusão? Seu rastreamento
de linhagem de dados permite que você veja dados derivados de dados excluídos e execute novamente as transformações para remover
dados downstream de fontes brutas?
DataOps
Com consultas e transformações, o DataOps tem duas áreas de preocupação: dados e sistemas. Você precisa monitorar e ser alertado sobre
alterações ou anomalias nessas áreas. O campo da observabilidade de dados está explodindo agora, com um grande foco na confiabilidade dos
dados. Existe até um cargo recente chamado engenheiro de confiabilidade de dados. Esta seção enfatiza a observabilidade e a integridade dos
dados, que se concentra no estágio de consulta e transformação.
Vamos começar com o lado dos dados do DataOps. Quando você consulta dados, as entradas e saídas estão corretas? Como você sabe? Se
esta consulta for salva em uma tabela, o esquema está correto? E quanto ao formato dos dados e estatísticas relacionadas, como valores mín./máx.,
contagens nulas e muito mais? Você deve executar testes de qualidade de dados nos conjuntos de dados de entrada e no conjunto de dados
transformado, o que garantirá que os dados atendam às expectativas dos usuários upstream e downstream. Se
Machine Translated by Google
há um problema de qualidade de dados na transformação, você deve ter a capacidade de sinalizar esse problema, reverter as alterações
e investigar a causa raiz.
Agora vamos ver a parte Ops do DataOps. Como estão o desempenho dos sistemas? Monitore métricas como comprimento da fila de consulta,
simultaneidade de consulta, uso de memória, utilização de armazenamento, latência de rede e E/S de disco. Use dados de métrica para identificar
gargalos e consultas de baixo desempenho que podem ser candidatas a refatoração e ajuste. Se a consulta estiver perfeitamente correta, você terá
uma boa ideia de onde ajustar o próprio banco de dados (por exemplo, agrupando uma tabela para obter um desempenho de pesquisa mais rápido).
Ou talvez seja necessário atualizar os recursos de computação do banco de dados. Os bancos de dados em nuvem e SaaS de hoje oferecem muita
flexibilidade para atualizar (e fazer downgrade) rapidamente do seu sistema. Adote uma abordagem orientada a dados e use suas métricas de
observabilidade para identificar se você tem uma consulta ou um problema relacionado ao sistema.
A mudança para bancos de dados analíticos baseados em SaaS altera o perfil de custo do consumo de dados. Nos dias de data warehouses
locais, o sistema e as licenças eram adquiridos antecipadamente, sem custo adicional de uso.
Enquanto os engenheiros de dados tradicionais se concentram na otimização do desempenho para extrair o máximo de utilidade de suas compras
caras, os engenheiros de dados que trabalham com data warehouses em nuvem que cobram com base no consumo precisam se concentrar no
gerenciamento de custos e na otimização de custos. Essa é a prática do FinOps (veja o Capítulo 4).
Arquitetura de dados
As regras gerais de uma boa arquitetura de dados no Capítulo 3 se aplicam ao estágio de transformação. Crie sistemas robustos que possam
processar e transformar dados sem implodir. Suas escolhas para ingestão e armazenamento afetarão diretamente a capacidade de sua arquitetura
geral de realizar consultas e transformações confiáveis. Se a ingestão e o armazenamento forem adequados aos seus padrões de consulta e
transformação, você deve estar em um ótimo lugar. Por outro lado, se suas consultas e transformações não funcionarem bem com seus sistemas
upstream, você enfrentará um mundo de problemas.
Por exemplo, muitas vezes vemos equipes de dados usando os pipelines e bancos de dados de dados errados para o trabalho. Uma equipe de
dados pode conectar um pipeline de dados em tempo real a um RDBMS ou Elasticsearch e usá-lo como seu data warehouse. Esses sistemas não
são otimizados para consultas OLAP agregadas de alto volume e implodirão sob essa carga de trabalho. Essa equipe de dados claramente não
entendia como suas escolhas de arquitetura afetariam o desempenho da consulta. Reserve um tempo para entender as vantagens e desvantagens
inerentes às suas escolhas de arquitetura; seja claro sobre como seu modelo de dados funcionará com sistemas de ingestão e armazenamento e
como as consultas serão executadas.
Orquestração
As equipes de dados geralmente gerenciam seus pipelines de transformação usando agendamentos simples baseados em tempo, por exemplo,
cron jobs. Isso funciona razoavelmente bem no início, mas se torna um pesadelo à medida que os fluxos de trabalho se tornam mais complicados.
Use a orquestração para gerenciar pipelines complexos usando uma abordagem baseada em dependência. A orquestração também é a cola que
nos permite montar pipelines que abrangem vários sistemas.
o código de transformação, você pode usar muitas linguagens, como SQL, Python e linguagens baseadas em JVM, e plataformas que variam de
data warehouses a clusters de computação distribuídos e tudo mais. Cada linguagem e plataforma tem seus pontos fortes e peculiaridades, então
você deve conhecer as melhores práticas de suas ferramentas. Por exemplo, você pode escrever transformações de dados em Python, alimentadas
por um sistema distribuído, como Spark ou Dask.
Ao executar uma transformação de dados, você está usando uma UDF quando uma função nativa pode funcionar muito melhor? Vimos casos em
que UDFs lentas e mal escritas foram substituídas por um comando SQL integrado, com melhoria instantânea e dramática no desempenho.
A ascensão da engenharia analítica traz práticas de engenharia de software para os usuários finais, com a noção de análise como código.
Ferramentas de transformação de engenharia analítica, como dbt, explodiram em popularidade, dando a analistas e cientistas de dados a capacidade
de escrever transformações no banco de dados usando SQL, sem a intervenção direta de um DBA ou engenheiro de dados. Nesse caso, o
engenheiro de dados é responsável por configurar o repositório de código e o pipeline de CI/CD usado pelos analistas e cientistas de dados. Esta é
uma grande mudança no papel de um engenheiro de dados, que historicamente
Machine Translated by Google
construir e gerenciar a infraestrutura subjacente e criar as transformações de dados. À medida que as ferramentas de dados diminuem as barreiras de
entrada e se tornam mais democratizadas entre as equipes de dados, será interessante ver como os fluxos de trabalho das equipes de dados mudam.
Usando uma ferramenta de baixo código baseada em GUI, você obterá visualizações úteis do fluxo de trabalho de transformação. Você ainda precisa
entender o que está acontecendo sob o capô. Essas ferramentas de transformação baseadas em GUI geralmente geram SQL ou alguma outra linguagem
nos bastidores. Embora o objetivo de uma ferramenta de baixo código seja aliviar a necessidade de se envolver em detalhes de baixo nível, entender o
código nos bastidores ajudará na depuração e na otimização do desempenho. Assumir cegamente que a ferramenta está gerando código de alto
desempenho é um erro.
Sugerimos que os engenheiros de dados prestem atenção especial às melhores práticas de engenharia de software no estágio de consulta e
transformação. Embora seja tentador simplesmente lançar mais recursos de processamento em um conjunto de dados, saber escrever um código limpo
e de alto desempenho é uma abordagem muito melhor.
Conclusão
As transformações estão no centro dos pipelines de dados. Francamente, as transformações são a parte “sexy” da engenharia de dados.
É fundamental ter em mente o propósito das transformações. Em última análise, os engenheiros não são contratados para brincar com os brinquedos
tecnológicos mais recentes, mas para atender seus clientes.
Nossa opinião é que é possível adotar tecnologias de transformação empolgantes e atender as partes interessadas. O Capítulo 11 fala sobre a pilha de
dados ao vivo, essencialmente reconfigurando a pilha de dados em torno da ingestão de dados de streaming e aproximando os fluxos de trabalho de
transformação dos próprios aplicativos do sistema de origem. As equipes de engenharia que pensam em dados em tempo real como a tecnologia pela
tecnologia repetirão os erros da era do big data.
Mas, na realidade, a maioria das organizações com as quais trabalhamos tem um caso de uso de negócios que se beneficiaria do streaming de
dados. Identificar esses casos de uso e focar no valor antes de escolher tecnologias e sistemas complexos é fundamental.
À medida que avançamos para o estágio de serviço do ciclo de vida da engenharia de dados no Capítulo 9, reflita sobre a tecnologia como uma ferramenta
para atingir as metas organizacionais. Se você é um engenheiro de dados que trabalha, pense em como as melhorias nos sistemas de transformação
podem ajudá-lo a atender melhor seus clientes finais. Se você está apenas iniciando um caminho para a engenharia de dados, pense nos tipos de
problemas de negócios que você está interessado em resolver com tecnologia.
Recursos adicionais
“Como funciona um mecanismo de banco de dados SQL,” por Dennis Pham
Holistics "Não é possível combinar campos devido a problemas de distribuição?" Página de perguntas frequentes
“Uma explicação simples de agregados simétricos ou 'Por que diabos meu SQL se parece com isso?'” por Lloyd Tab
“Construindo um cofre de dados em tempo real no Snowflake” por Dmytro Yaroshenko e Kent Graziano
“O novo paradigma 'Unified Star Schema' na análise de modelagem de dados do Analytics” por Andriy Zabavskyy
“Inmon ou Kimball: qual abordagem é adequada para seu data warehouse?” por Sansu George
Patente dos EUA para “Método e Aparelho para Integração Funcional de Metadados”
O “Processo de Projeto Dimensional em Quatro Etapas” do Kimball Group , “Dimensões Conformadas” e “Dimensões
Técnicas de Modelagem” páginas da web
Documento "Introdução à modelagem de cofre de dados" compilado por Kent Graziano e Dan Linstedt
Construindo o Data Warehouse (Wiley), Corporate Information Factory e The Unified Star Schema (Technics Publications) por
WH (Bill) Inmon
Construindo um Data Warehouse Escalável com Data Vault 2.0 (Morgan Kaufmann) por Daniel Linstedt e Michael Olschimke
1 "Reescrevendo consultas de execução lenta que têm condições de junção equi-explosiva e condições de junção adicionais com base no operador semelhante",
Site da Comunidade Snowflake, 1º de maio de 2020, https:// oreil.ly/ kUsO9.
2 Veja, por exemplo, Emin Gün Sirer, “NoSQL Meets Bitcoin and Brings Down Two Exchanges: The Story of Flexcoin and Poloniex,” Hacking,
Distribuído, 6 de abril de 2014, https:// oreil.ly/ RM3QX.
4 Os autores estão cientes de um incidente envolvendo um novo analista em uma grande rede de supermercados executando SELECT * em um banco de dados de produção e
derrubando um banco de dados de inventário crítico por três dias.
5 A Figura 8-11 e o exemplo que ela descreve são significativamente baseados em “Introducing Stream—Stream Joins in Apache 2.3” por Tathagata Das e Joseph
Torres, 13 de março de 2018.
6 Para mais detalhes sobre o princípio DRY, veja The Pragmatic Programmer de David Thomas e Andrew Hunt (Addison-Wesley Professional,
2019).
7 EF Codd, “Further Normalization of the Data Base Relational Model”, IBM Research Laboratory (1971), https:// oreil.ly/ Muajm.
11 Embora dimensões e fatos sejam frequentemente associados a Kimball, eles foram usados pela primeira vez na General Mills e na Dartmouth University na década de 1960,
e tiveram adoção precoce na Nielsen e IRI, entre outras empresas.
12 O cofre de dados tem duas versões, 1.0 e 2.0. Esta seção se concentra no cofre de dados 2.0, mas vamos chamá-lo de cofre de dados por questões de brevidade.
13 Kent Graziano, “Data Vault 2.0 Modeling Basics,” Vertabelo, 20 de outubro de 2015, https:// oreil.ly/ iuW1U.
14 Alex Woodie, “Lakehouses Prevent Data Swamps, Bill Inmon Says”, Datanami, 1º de junho de 2021, https:// oreil.ly/ XMwWc.
15 Lembramos que você deve usar UDFs com responsabilidade. As UDFs SQL geralmente têm um desempenho razoavelmente bom. Vimos UDFs JavaScript aumentarem o tempo de consulta de alguns
minutos a várias horas.
16 Michael Blaha, “Be Careful with Derived Data,” Dataversity, 5 de dezembro de 2016, https:// oreil.ly/ garoL.
17 Benn Stancil, “The Missing Piece of the Modern Data Stack”, benn.substack, 22 de abril de 2021, https:// oreil.ly/ GYf3Z.
18 “Qual é a diferença entre Apache Spark e Hadoop MapReduce?”, vídeo do YouTube Knowledge Powerhouse, 20 de maio de 2017,
https:// oreil.ly/ WN0eX.
19 Para uma aplicação detalhada do conceito de streaming DAG, veja “Why We Moved from Apache Kafka to Apache Pulsar” de Simba Khadder,
Blog StreamNative, 21 de abril de 2020, https:// oreil.ly/ Rxfko.
Machine Translated by Google
Em segundo lugar, você fornecerá dados para aplicativos de ML. O ML não é possível sem
dados de alta qualidade, devidamente preparados. Engenheiros de dados trabalham com dados
Machine Translated by Google
Terceiro, você fornecerá dados por meio de ETL reverso. O ETL reverso é o processo de envio de
dados de volta às fontes de dados. Por exemplo, podemos adquirir dados de uma plataforma de
tecnologia de anúncios, executar um processo estatístico nesses dados para determinar os lances de
custo por clique e, em seguida, alimentar esses dados de volta na plataforma de tecnologia de anúncios.
O ETL reverso é altamente emaranhado com BI e ML.
Antes de entrarmos nessas três principais formas de veicular dados, vejamos algumas
considerações gerais.
Confiar
Leva 20 anos para construir uma reputação e cinco minutos para arruiná-la. Se você
pensar sobre isso, você vai fazer as coisas de forma diferente.
—Warren Buffet
os melhores dados possíveis, portanto, você deve certificar-se de que seus produtos de
dados sempre contenham dados confiáveis e de alta qualidade.
À medida que você aprender a fornecer dados ao longo deste capítulo, reforçaremos a ideia
de incutir confiança em seus dados e discutiremos maneiras pragmáticas de fazer isso. Vemos
muitos casos em que as equipes de dados estão fixadas em enviar dados sem perguntar se as
partes interessadas confiam neles. Muitas vezes, as partes interessadas perdem a confiança
nos dados. Uma vez que a confiança se foi, reconquistá-la é insanamente difícil. Isso
inevitavelmente leva a empresa a não atingir todo o seu potencial com dados e as equipes de
dados perdendo credibilidade (e possivelmente sendo dissolvidas).
Para obter a qualidade dos dados e construir a confiança das partes interessadas, utilize os
processos de validação de dados e observabilidade de dados, em conjunto com a inspeção
visual e a confirmação da validade com as partes interessadas. A validação de dados está
analisando dados para garantir que eles representem com precisão informações financeiras,
interações com clientes e vendas. A observabilidade de dados fornece uma visão contínua de
dados e processos de dados. Esses processos devem ser aplicados em todo o ciclo de vida da
engenharia de dados para obter um bom resultado à medida que chegamos ao fim. Discutiremos
isso mais adiante em “Subcorrentes”.
Além de criar confiança na qualidade dos dados, cabe aos engenheiros criar confiança em
seus SLAs e SLOs com seus usuários finais e partes interessadas upstream. Quando os
usuários dependerem dos dados para realizar os processos de negócios, eles exigirão que os
dados estejam consistentemente disponíveis e atualizados de acordo com os compromissos
assumidos pelos engenheiros de dados. Dados de alta qualidade têm pouco valor se não
estiverem disponíveis conforme o esperado na hora de tomar uma decisão crítica de negócios.
Observe que os SLAs e SLOs também podem assumir a forma de contratos de dados (consulte
o Capítulo 5), formal ou informalmente.
Falamos sobre SLAs no Capítulo 5, mas vale a pena discuti-los novamente aqui. SLAs
vêm em uma variedade de formas. Independentemente de sua forma, um SLA informa aos
usuários o que esperar de seu produto de dados; é um contrato entre você e seus
stakeholders. Um exemplo de SLA pode ser: “Os dados estarão disponíveis de forma confiável e
de alta qualidade”. Um SLO é uma parte essencial de um SLA e descreve as maneiras pelas
quais você medirá o desempenho em relação ao que
Machine Translated by Google
você concordou. Por exemplo, dado o exemplo de SLA anterior, um SLO pode ser:
“Nossos pipelines de dados para seu painel ou fluxo de trabalho de ML terão 99% de
tempo de atividade, com 95% dos dados livres de defeitos”. Certifique-se de que as
expectativas estejam claras e que você possa verificar se está operando dentro dos
parâmetros de SLA e SLO acordados.
Sempre que possível, priorize os casos de uso com o maior ROI possível. Os engenheiros
de dados adoram ficar obcecados com os detalhes técnicos de implementação dos
sistemas que constroem, ignorando a questão básica do propósito. Os engenheiros querem
fazer o que sabem fazer melhor: projetar coisas. Quando os engenheiros reconhecem a
necessidade de se concentrar no valor e nos casos de uso, eles se tornam muito mais
valiosos e eficazes em suas funções.
Machine Translated by Google
Ao iniciar um novo projeto de dados, trabalhar de trás para frente é útil. Embora seja tentador se
concentrar nas ferramentas, recomendamos que você comece com o caso de uso e os usuários. Aqui
estão algumas perguntas para se fazer ao começar:
Como posso colaborar com as partes interessadas de dados (por exemplo, cientistas de
dados, analistas, usuários de negócios) para entender como os dados com os quais estou
trabalhando serão usados?
Novamente, sempre aborde a engenharia de dados da perspectiva do usuário e de seu caso de uso.
Ao entender suas expectativas e objetivos, você pode trabalhar para trás para criar produtos de dados
incríveis com mais facilidade. Vamos dedicar um momento para expandir nossa discussão sobre um
produto de dados.
Produtos de dados
Uma boa definição de um produto de dados é um produto que facilita um objetivo final por
meio do uso de dados.
—DJ Patil
Os produtos de dados não são criados no vácuo. Como tantos outros processos
organizacionais que discutimos, fazer produtos de dados é um esporte de contato total, envolvendo
uma mistura de produto e negócios ao lado de tecnologia. É importante envolver os principais
interessados no desenvolvimento de um produto de dados. Na maioria das empresas, um engenheiro
de dados está a poucos passos dos usuários finais de um produto de dados; um bom engenheiro de
dados procurará entender completamente os resultados para usuários diretos, como analistas de dados
e cientistas de dados ou clientes externos à empresa.
1
Ao criar um produto de dados, é útil pensar nos “trabalhos a serem feitos”.
Um usuário “contrata” um produto para um “trabalho a ser feito”. Isso significa que você precisa
saber o que o usuário quer, ou seja, sua motivação para “contratar” seu produto.
Um erro clássico de engenharia é simplesmente construir sem entender o
Machine Translated by Google
Um bom produto de dados tem ciclos de feedback positivo. Mais uso de um produto de
dados gera dados mais úteis, que são usados para melhorar o produto de dados. Enxague
e repita.
Quando alguém usa o produto de dados, o que espera realizar? Com muita
frequência, os produtos de dados são feitos sem uma compreensão clara do resultado
esperado pelo usuário.
Quais são os resultados e o ROI do produto de dados que você está construindo?
Construir produtos de dados que as pessoas vão usar e amar é fundamental. Nada arruinará mais
a adoção de um produto de dados do que utilidade indesejada e perda de confiança nas saídas de
dados. Preste atenção à adoção e uso de produtos de dados e esteja disposto a se ajustar para
deixar os usuários felizes.
Autoatendimento ou não?
Como os usuários irão interagir com seu produto de dados? Um diretor de negócios solicitará
um relatório da equipe de dados ou esse diretor pode simplesmente criar o relatório? Os
produtos de dados de autoatendimento — dando ao usuário a capacidade de criar produtos de
dados por conta própria — têm sido uma aspiração comum dos usuários de dados por muitos
anos. O que é melhor do que apenas dar ao usuário final a capacidade de criar diretamente
relatórios, análises e modelos de ML?
prática. Assim, o analista ou cientista de dados é deixado para realizar o trabalho pesado
de fornecer relatórios ad hoc e manter painéis.
Por que os dados de autoatendimento são tão difíceis? A resposta é matizada, mas
geralmente envolve entender o usuário final. Se o usuário for um executivo que precisa
entender como o negócio está indo, essa pessoa provavelmente só quer um painel predefinido
de métricas claras e acionáveis. O executivo provavelmente ignorará quaisquer ferramentas
de autoatendimento para criar visualizações de dados personalizadas. Se os relatórios
provocarem mais perguntas, eles podem ter analistas à sua disposição para buscar uma
investigação mais profunda. Por outro lado, um usuário que é analista pode já estar buscando
análises de autoatendimento por meio de ferramentas mais poderosas, como SQL. A análise
de autoatendimento por meio de uma camada de BI não é útil. As mesmas considerações se
aplicam à ciência de dados. Embora conceder ML de autoatendimento a “cientistas de dados
cidadãos” tenha sido uma meta de muitos fornecedores de ML automatizados, a adoção
ainda é incipiente pelos mesmos motivos da análise de autoatendimento. Nesses dois casos
extremos, um produto de dados de autoatendimento é uma ferramenta errada para o trabalho.
Determine como você fornecerá dados para esse grupo. Quais são seus requisitos de
tempo para novos dados? O que acontece se eles inevitavelmente desejarem mais dados ou
alterarem o escopo do que é exigido do autoatendimento? Mais dados geralmente significam
mais perguntas, o que requer mais dados. Você precisará antecipar as necessidades crescentes
de seus usuários de autoatendimento. Você também precisa entender o bom equilíbrio entre
flexibilidade e proteções que ajudarão seu público a encontrar valor e insights sem resultados
incorretos e confusão.
Machine Translated by Google
A definição de dados refere-se ao significado dos dados como são entendidos em toda a
organização. Por exemplo, cliente tem um significado preciso dentro de uma empresa e entre
departamentos. Quando a definição de um cliente varia, eles devem ser documentados e
disponibilizados para todos que usam os dados.
A lógica de dados estipula fórmulas para derivar métricas de dados – digamos, vendas brutas
ou valor da vida útil do cliente. A lógica de dados adequada deve codificar definições de
dados e detalhes de cálculos estatísticos. Para calcular as métricas de rotatividade de
clientes, precisaríamos de uma definição: quem é um cliente? Para calcular o lucro líquido,
precisaríamos de um conjunto de regras lógicas para determinar quais despesas deduzir da
receita bruta.
Freqüentemente, vemos definições de dados e lógica tidas como certas, muitas vezes passadas
pela organização na forma de conhecimento tribal. O conhecimento tribal ganha vida própria,
muitas vezes à custa de anedotas que substituem insights, decisões e ações baseadas em
dados. Em vez disso, declarar formalmente as definições de dados e a lógica em um catálogo de
dados e nos sistemas do ciclo de vida de engenharia de dados ajuda bastante a garantir a
exatidão, consistência e confiabilidade dos dados.
(descrito no Capítulo 8) é incrivelmente útil para capturar definições de dados e lógica de uma
forma que seja compreensível e utilizável por vários usuários finais.
Malha de dados
A malha de dados será cada vez mais uma consideração ao servir dados. A malha de
dados muda fundamentalmente a forma como os dados são servidos dentro de uma organização.
Em vez de equipes de dados em silos atendendo seus constituintes internos, cada
equipe de domínio assume dois aspectos do serviço descentralizado de dados ponto
a ponto.
Primeiro, as equipes são responsáveis por fornecer dados a outras equipes , preparando-
os para consumo. Os dados devem ser bons para uso em aplicativos de dados, painéis,
análises e ferramentas de BI em toda a organização. Em segundo lugar, cada equipe
potencialmente executa seus painéis e análises para autoatendimento. As equipes
consomem dados de toda a organização com base nas necessidades específicas de seu
domínio. Os dados consumidos de outras equipes também podem entrar no software projetado
por uma equipe de domínio por meio de análises voltadas para o usuário ou um recurso de ML.
Análise
O primeiro caso de uso de serviço de dados que você provavelmente encontrará é a análise,
que é descobrir, explorar, identificar e tornar visíveis os principais insights e padrões nos
dados. A análise tem muitos aspectos. Como prática, a análise é realizada usando métodos
estatísticos, relatórios, ferramentas de BI e muito mais. Como um
Machine Translated by Google
Antes mesmo de fornecer dados para análise, a primeira coisa que você precisa fazer
(o que deve parecer familiar depois de ler a seção anterior) é identificar o caso de uso final.
O usuário está olhando para as tendências históricas? Os usuários devem ser notificados
imediata e automaticamente sobre uma anomalia, como um alerta de fraude? Alguém está
consumindo um painel em tempo real em um aplicativo móvel? Esses exemplos destacam as
diferenças entre análise de negócios (geralmente BI), análise operacional e análise voltada
para o usuário. Cada uma dessas categorias de análise tem objetivos diferentes e requisitos
de veiculação exclusivos. Vejamos como você fornecerá dados para esses tipos de análise.
Analista de negócios
A análise de negócios usa dados históricos e atuais para tomar decisões estratégicas
e acionáveis. Os tipos de decisões tendem a levar em consideração tendências de longo
prazo e geralmente envolvem uma mistura de análise estatística e de tendências,
juntamente com experiência de domínio e julgamento humano. A análise de negócios é
tanto uma arte quanto uma ciência.
um painel, com executivos de nível C usando um painel abrangente e seus subordinados diretos
usando painéis com suas métricas específicas, KPIs ou objetivos e resultados-chave (OKRs). Os analistas
ajudam a criar e manter esses painéis. Depois que as partes interessadas de negócios adotam e confiam
em um painel, o analista geralmente responde a solicitações para analisar um possível problema com
uma métrica ou adicionar uma nova métrica ao painel. Atualmente, você pode usar plataformas de BI
para criar painéis, como Tableau, Looker, Sisense, Power BI ou Apache Superset/Preset.
Os analistas geralmente são encarregados pelas partes interessadas do negócio de criar um relatório.
O objetivo de um relatório é usar dados para gerar insights e ações. Um analista que trabalha em
uma empresa de varejo on-line é solicitado a investigar quais fatores estão gerando uma taxa de
retorno acima do esperado para shorts femininos. O analista executa algumas consultas SQL no data
warehouse, agrega os códigos de retorno que os clientes fornecem como motivo de sua devolução e
descobre que o tecido do shorts de corrida é de qualidade inferior, muitas vezes se desgastando em
poucos usos. As partes interessadas, como fabricação e controle de qualidade, são notificadas dessas
descobertas.
O analista foi solicitado a investigar um problema em potencial e retornar com insights. Isso
representa um exemplo de análise ad hoc. Os relatórios geralmente começam como solicitações ad
hoc. Se os resultados da análise ad hoc forem impactantes, eles geralmente acabam em um relatório
ou painel. As tecnologias usadas para relatórios e análises ad hoc são semelhantes aos painéis, mas
podem incluir Excel, Python, notebooks baseados em R, consultas SQL e muito mais.
Bons analistas se envolvem constantemente com os negócios e mergulham nos dados para responder
a perguntas e descobrir tendências e insights ocultos e contra-intuitivos. Eles também trabalham com
engenheiros de dados para fornecer feedback sobre qualidade de dados, problemas de confiabilidade e
solicitações de novos conjuntos de dados. O engenheiro de dados é responsável por abordar esse
feedback e fornecer novos conjuntos de dados para o analista usar.
Machine Translated by Google
Voltando ao exemplo dos shorts de corrida, suponha que, depois de comunicar suas
descobertas, os analistas saibam que a manufatura pode fornecer a eles vários detalhes da
cadeia de suprimentos sobre os materiais usados nos shorts de corrida. Os engenheiros de
dados realizam um projeto para ingerir esses dados no data warehouse. Uma vez que os
dados da cadeia de suprimentos estejam presentes, os analistas podem correlacionar números
de série de roupas específicas com o fornecedor do tecido usado no item. Eles descobrem
que a maioria das falhas está ligada a um de seus três fornecedores, e a fábrica para de usar
tecido desse fornecedor.
Os dados para análise de negócios são frequentemente servidos em modo de lote a partir
de um data warehouse ou de um data lake. Isso varia muito entre empresas, departamentos
e até mesmo equipes de dados dentro das empresas. Novos dados podem estar disponíveis
a cada segundo, minuto, a cada 30 minutos, todos os dias ou uma vez por semana. A
frequência dos lotes pode variar por vários motivos. Uma coisa importante a ser observada
é que os engenheiros que trabalham em problemas de análise devem considerar várias
aplicações potenciais de dados, atuais e futuras. É comum ter frequências de atualização
de dados mistas para atender os casos de uso adequadamente, mas lembre-se de que a
frequência de ingestão define um teto na frequência downstream. Se existirem aplicativos de
streaming para os dados, eles devem ser ingeridos como um stream, mesmo que algumas
etapas de processamento e veiculação downstream sejam tratadas em lotes.
Análise Operacional
Se a análise de negócios é sobre o uso de dados para descobrir insights acionáveis, a análise
operacional usa dados para realizar ações imediatas:
Figura 9-2. Um painel de análise operacional mostrando algumas métricas importantes do Google
Compute Engine
Machine Translated by Google
As arquiteturas de dados serão alteradas para se adequarem a um mundo onde você pode
ter seus dados quentes e quentes em um só lugar. A pergunta central que você deve sempre
fazer a si mesmo e aos seus stakeholders é esta: se você tem dados de streaming, o que você
vai fazer com eles? Que ação você deve tomar? A ação correta cria impacto e valor. Dados em
tempo real sem ação são uma distração implacável.
A longo prazo, prevemos que o streaming suplantará o lote. Os produtos de dados nos
próximos 10 anos provavelmente serão os primeiros a serem transmitidos, com a capacidade
de combinar dados históricos perfeitamente. Após a coleta em tempo real, os dados ainda
podem ser consumidos e processados em lotes conforme necessário.
Vamos voltar mais uma vez ao nosso exemplo de shorts de corrida. Usar a análise para descobrir
tecidos ruins na cadeia de suprimentos foi um grande sucesso; líderes de negócios e engenheiros de
dados querem encontrar mais oportunidades de utilizar dados para melhorar a qualidade do produto.
Os engenheiros de dados sugerem a implantação de análises em tempo real na fábrica. A planta já
usa uma variedade de máquinas capazes de transmitir dados em tempo real. Além disso, a planta
possui câmeras gravando vídeo na linha de fabricação. No momento, os técnicos assistem às filmagens
em tempo real, procuram itens defeituosos e alertam aqueles que estão na linha quando veem uma
alta taxa de problemas aparecendo nos itens.
Os engenheiros de dados percebem que podem usar uma ferramenta de visão de máquina em
nuvem pronta para uso para identificar defeitos em tempo real automaticamente. Os dados de
defeitos são vinculados a números de série de itens específicos e transmitidos. A partir daqui, um
processo de análise em tempo real pode vincular itens defeituosos a eventos de streaming de
máquinas mais adiante na linha de montagem.
Machine Translated by Google
Vendo o sucesso deste projeto de melhoria de qualidade, o fornecedor decide adotar processos
de controle de qualidade semelhantes. Os engenheiros de dados do varejista trabalham com o
fornecedor para implantar sua análise de dados em tempo real, melhorando drasticamente a
qualidade do estoque de tecidos.
Análise incorporada
Enquanto as análises de negócios e operacionais são focadas internamente, uma tendência
recente é a análise externa ou voltada para o usuário. Com tantos dados alimentando
aplicativos, as empresas fornecem cada vez mais análises aos usuários finais. Normalmente,
eles são chamados de aplicativos de dados, geralmente com painéis de análise incorporados
no próprio aplicativo. Também conhecidos como análises incorporadas, esses painéis
voltados para o usuário final fornecem aos usuários as principais métricas sobre seu
relacionamento com o aplicativo.
O cenário da análise incorporada está crescendo como uma bola de neve, e esperamos
que esses aplicativos de dados se tornem cada vez mais difundidos nos próximos anos.
Como engenheiro de dados, você provavelmente não está criando o front-end analítico
incorporado, pois os desenvolvedores de aplicativos lidam com isso. Como você é
responsável pelos bancos de dados que atendem às análises incorporadas, você precisará
entender os requisitos de velocidade e latência para análises voltadas para o usuário.
Machine Translated by Google
O desempenho para análises incorporadas abrange três problemas. Primeiro, os usuários de aplicativos
não são tão tolerantes com o processamento em lote infrequente quanto os analistas internos da empresa;
os usuários de uma plataforma SaaS de recrutamento podem esperar ver uma mudança em suas estatísticas
assim que fizerem o upload de um novo currículo. Os usuários desejam baixa latência de dados. Em segundo
Quando eles ajustam os parâmetros em um painel de análise, eles querem que os resultados atualizados
apareçam em segundos. Terceiro, os aplicativos de dados geralmente devem oferecer suporte a taxas de
consulta extremamente altas em muitos painéis e vários clientes. A alta simultaneidade é crítica.
exóticas para lidar com esses desafios. Para novas startups, o padrão é usar bancos de dados
À medida que suas bases de clientes se expandem, eles superam sua arquitetura inicial.
Eles têm acesso a uma nova geração de bancos de dados que combinam alto desempenho —
consultas rápidas, alta simultaneidade e atualizações quase em tempo real — com relativa facilidade de uso
Aprendizado de máquina
A segunda área principal para servir dados é o aprendizado de máquina. ML é cada vez mais
comum, então vamos supor que você esteja pelo menos familiarizado com o conceito. Com a ascensão
da engenharia de ML (em si quase um universo paralelo à engenharia de dados), você pode se perguntar
É certo que a fronteira entre ML, ciência de dados, engenharia de dados e engenharia de ML está cada vez
mais difusa, e essa fronteira varia drasticamente entre as organizações. Em algumas organizações, os
engenheiros de ML assumem o processamento de dados para aplicativos de ML logo após a coleta de dados ou
podem até formar uma organização de dados totalmente separada e paralela que lida com todo o ciclo de vida
de todos os aplicativos de ML. Os engenheiros de dados lidam com todo o processamento de dados em outras
Os engenheiros de dados podem até mesmo lidar com algumas tarefas extremamente específicas de ML,
como a caracterização de dados.
Machine Translated by Google
Voltemos ao nosso exemplo de qualidade para controle de shorts de corrida produzidos por
um varejista online. Suponha que os dados de streaming tenham sido implementados na
fábrica que fabrica o estoque de tecido bruto para os shorts.
Os cientistas de dados descobriram que a qualidade do tecido fabricado é suscetível às
características do poliéster bruto de entrada, temperatura, umidade e vários parâmetros ajustáveis
do tear que tece o tecido. Os cientistas de dados desenvolvem um modelo básico para otimizar os
parâmetros do tear.
Os engenheiros de ML automatizam o treinamento do modelo e configuram um
processo para ajustar automaticamente o tear com base nos parâmetros de entrada. Os
engenheiros de dados e ML trabalham juntos para projetar um pipeline de recursos, e os
engenheiros de dados implementam e mantêm o pipeline.
Embora um engenheiro de dados não precise ter uma compreensão profunda do ML, é muito útil
conhecer os conceitos básicos de como o ML clássico funciona e os fundamentos do aprendizado
profundo. Conhecer os conceitos básicos de ML ajudará você a trabalhar ao lado de cientistas de
dados na criação de produtos de dados.
Aqui estão algumas áreas do ML com as quais achamos que um engenheiro de dados deve estar
familiarizado:
As várias técnicas para lidar com dados de séries temporais. Isso inclui análise de séries
temporais, bem como previsão de séries temporais.
Todos os dados usados para ML são convertidos em números. Se você estiver fornecendo
dados estruturados ou semiestruturados, certifique-se de que os dados possam ser
convertidos adequadamente durante o processo de engenharia de recursos.
A diferença entre aprendizagem em lote e online. Qual abordagem é apropriada para o seu
caso de uso?
O que são cascatas de dados, e como eles podem afetar os modelos de ML?
Machine Translated by Google
ML é uma vasta área de assunto, e este livro não vai te ensinar esses tópicos, ou mesmo
generalidades de ML. Se você quiser saber mais sobre ML, sugerimos a leitura Hands on
Machine Learning with Scikit-Learn, Keras e TensorFlow de Aurélien Géron (O'Reilly);
inúmeros outros cursos e livros de ML estão disponíveis online. Como os livros e os cursos on-line
evoluem tão rapidamente, faça sua pesquisa sobre o que parece ser uma boa opção para você.
Troca de arquivos
A troca de arquivos é onipresente no serviço de dados. Processamos dados e geramos arquivos
para passar aos consumidores de dados.
Tenha em mente que um arquivo pode ser usado para muitas finalidades. Um cientista de dados
pode carregar um arquivo de texto (dados não estruturados) de mensagens de clientes para
analisar os sentimentos das reclamações dos clientes. Uma unidade de negócios pode receber
dados de fatura de uma empresa parceira como uma coleção de CSVs (dados estruturados) e um
analista deve realizar algumas análises estatísticas nesses arquivos.
Machine Translated by Google
concorrente (dados não estruturados) para classificação automatizada usando visão computacional.
A maneira como você veicula arquivos depende de vários fatores, como estes:
Caso de uso – análise de negócios, análise operacional, análise voltada para o usuário
O segundo ponto é uma das principais considerações. Muitas vezes, é necessário fornecer dados
por meio de arquivos em vez de compartilhamento de dados porque o consumidor de dados não pode
O arquivo mais simples de servir é algo como enviar um único arquivo Excel por e-mail. Este ainda é um
fluxo de trabalho comum, mesmo em uma época em que os arquivos podem ser compartilhados de forma
colaborativa. O problema com o envio de arquivos por e-mail é que cada destinatário recebe sua versão do
arquivo. Se um destinatário editar o arquivo, essas edições serão específicas do arquivo desse usuário.
Desvios entre os arquivos resultam inevitavelmente. Se você precisar de uma versão coerente e consistente
de um arquivo, sugerimos usar uma plataforma de colaboração, como Microsoft 365 ou Google Docs.
É claro que servir arquivos únicos é difícil de dimensionar, e suas necessidades acabarão
bucket de armazenamento de objetos se tiver um punhado de arquivos grandes ou um data lake se tiver
Observaremos que geralmente consideramos a troca de arquivos por meio do armazenamento de objetos
(data lake) como “compartilhamento de dados” em vez de troca de arquivos, pois o processo pode ser
Bancos de dados
Os bancos de dados são uma camada crítica no fornecimento de dados para análise e ML. Para
esta discussão, vamos implicitamente manter nosso foco em servir dados de bancos de dados
OLAP (por exemplo, data warehouses e data lakes). No capítulo anterior, você aprendeu sobre
como consultar bancos de dados. Servir dados envolve consultar um banco de dados e, em seguida,
consumir esses resultados para um caso de uso. Um analista ou cientista de dados pode consultar
um banco de dados usando um editor SQL e exportar esses resultados para um arquivo CSV para
consumo por um aplicativo downstream ou analisar os resultados em um notebook (descrito em
“Servindo dados em notebooks”).
Servir dados de um banco de dados traz uma variedade de benefícios. Um banco de dados
impõe ordem e estrutura aos dados por meio de esquema; os bancos de dados podem oferecer
controles de permissão refinados em nível de tabela, coluna e linha, permitindo que os administradores
de banco de dados criem políticas de acesso complexas para várias funções; e os bancos de dados
podem oferecer alto desempenho de serviço para consultas grandes e computacionalmente intensivas,
alta simultaneidade de consultas ou ambos.
Cada vez mais, plataformas de dados como Snowflake e Databricks permitem que analistas
e cientistas de dados operem em um único ambiente, fornecendo editores SQL e notebooks
de ciência de dados sob o mesmo teto. Como a computação e o armazenamento são
separados, os analistas e os cientistas de dados podem consumir os dados subjacentes de
várias maneiras sem interferir uns nos outros. Isso permitirá alto rendimento e entrega mais
rápida de produtos de dados para as partes interessadas.
Sistemas de transmissão
A análise de streaming é cada vez mais importante no campo da veiculação. Em alto nível,
entenda que esse tipo de atendimento pode envolver métricas emitidas, que são diferentes
das consultas tradicionais.
dados atuais. Essencialmente, eles combinam aspectos de bancos de dados OLAP com
sistemas de processamento de fluxo. Cada vez mais, você trabalhará com sistemas de
streaming para fornecer dados para análises e ML, portanto, familiarize-se com esse
paradigma.
Você aprendeu sobre sistemas de streaming ao longo do livro. Para ter uma ideia de para
onde está indo, leia sobre a pilha de dados ao vivo no Capítulo 11.
Federação de consultas
Ao servir dados para consultas federadas, você deve estar ciente de que o usuário final pode
estar consultando vários sistemas – OLTP, OLAP, APIs, sistemas de arquivos etc. (Figura
9-3). Em vez de fornecer dados de um único sistema, agora você está servindo dados de
vários sistemas, cada um com seus padrões de uso, peculiaridades e nuances. Isso apresenta
desafios para o fornecimento de dados. Se as consultas federadas tocarem nos sistemas de
origem de produção ao vivo, você deverá garantir que a consulta federada não consuma
recursos excessivos na origem.
Machine Translated by Google
Em nossa experiência, as consultas federadas são ideais quando você deseja flexibilidade na
análise de dados ou os dados de origem precisam ser rigidamente controlados.
A federação permite consultas ad hoc para realizar análises exploratórias, combinando dados
de vários sistemas sem a complexidade de configurar pipelines de dados ou ETL. Isso permitirá
que você determine se o desempenho de uma consulta federada é suficiente para fins contínuos
ou se você precisa configurar a ingestão em algumas ou todas as fontes de dados e centralizar os
dados em um banco de dados OLAP ou data lake.
As consultas federadas também fornecem acesso somente leitura aos sistemas de origem, o que é
ótimo quando você não deseja fornecer arquivos, acesso ao banco de dados ou despejos de dados.
O usuário final lê apenas a versão dos dados que deve acessar e nada mais. A federação de
consultas é uma ótima opção a ser explorada para situações em que o acesso e a conformidade
são críticos.
Compartilhamento de dados
O Capítulo 5 inclui uma extensa discussão sobre compartilhamento de dados. Qualquer troca
de dados entre organizações ou unidades dentro de uma organização maior pode ser vista como
compartilhamento de dados. Ainda assim, queremos dizer especificamente compartilhar através
Machine Translated by Google
As consultas reais agora são tratadas pelos consumidores de dados (analistas e cientistas de dados) em
vez dos engenheiros que fornecem os dados. Seja fornecendo dados em uma malha de dados dentro de uma
O compartilhamento de dados é cada vez mais um recurso central das principais plataformas de dados,
como Snowflake, Redshift e BigQuery, permitindo que as empresas compartilhem dados com segurança entre
si.
cache em uma frota de SSDs? Mas mecanismos de processamento poderosos que fornecem resultados
de consulta rápidos em grandes conjuntos de dados não contribuem inerentemente para análises de
negócios de qualidade. Quando alimentados com dados de baixa qualidade ou consultas de baixa
Onde a qualidade dos dados se concentra nas características dos próprios dados e em várias técnicas para
filtrar ou melhorar os dados incorretos, a qualidade da consulta é uma questão de construir uma consulta
com lógica apropriada que retorna respostas precisas para perguntas de negócios. Escrever consultas e
relatórios ETL de alta qualidade é um trabalho detalhado e demorado. Várias ferramentas podem ajudar a
Fundamentalmente, uma camada de métricas é uma ferramenta para manter e computar a lógica de
2 semântica é extremamente similar conceitualmente, e BI sem cabeça é outro
negócios. (Uma camada 3
termo intimamente relacionado.) Essa camada pode residir em uma ferramenta de BI ou em um software que
cria consultas de transformação. Dois exemplos concretos são Looker e Data Build Tool (dbt).
Por exemplo, o LookML da Looker permite que os usuários definam lógica de negócios complexa e
virtual. Relatórios e painéis apontam para LookML específico para métricas de computação. O Looker
faça referência a eles em muitas consultas downstream; isso se destina a resolver o problema
tradicional de repetição e inconsistência em scripts ETL tradicionais. O Looker usa o LookML
para gerar consultas SQL, que são enviadas para o banco de dados. Os resultados podem ser
persistidos no servidor Looker ou no próprio banco de dados para grandes conjuntos de resultados.
O dbt permite que os usuários definam fluxos de dados SQL complexos, abrangendo muitas
consultas e definições padrão de métricas de negócios, como o Looker.
Ao contrário do Looker, o dbt é executado exclusivamente na camada de transformação, embora
isso possa incluir o envio de consultas em exibições que são computadas no momento da consulta.
Enquanto o Looker se concentra em atender consultas e relatórios, o dbt pode servir como uma
ferramenta robusta de orquestração de pipeline de dados para engenheiros de análise.
Acreditamos que as ferramentas da camada de métricas se tornarão mais populares com uma
adoção mais ampla e mais participantes, além de avançar para o aplicativo. As ferramentas da
camada de métricas ajudam a resolver uma questão central na análise que tem atormentado as
organizações desde que as pessoas analisaram os dados: “Esses números estão corretos?” Muitos
novos participantes estão no espaço ao lado dos que mencionamos.
Os cientistas de dados se conectarão programaticamente a uma fonte de dados, como uma API, um
banco de dados, um data warehouse ou um data lake (Figura 9-4). Em um notebook, todas as
conexões são criadas usando o
Machine Translated by Google
Figura 9-4. Um notebook pode receber dados de várias fontes, como armazenamento de objetos, banco
de dados, data warehouse ou data lake
Machine Translated by Google
TRATAMENTO DE CREDENCIAIS
Os notebooks podem até se tornar parte da ciência de dados de produção; notebooks são
amplamente implantados na Netflix. Esta é uma abordagem interessante com vantagens e
compensações. Os notebooks produzidos permitem que os cientistas de dados coloquem seu
trabalho em produção com muito mais rapidez, mas também são inerentemente uma forma de
produção abaixo do padrão. A alternativa é fazer com que os engenheiros de ML e dados convertam
os notebooks para uso em produção, sobrecarregando significativamente essas equipes. Um
híbrido dessas abordagens pode ser ideal, com notebooks usados para produção “leve” e um
processo de produção completo para projetos de alto valor.
ETL reverso
Hoje, o ETL reverso é uma palavra da moda que descreve o fornecimento de dados carregando-
os de um banco de dados OLAP de volta para um sistema de origem. Dito isso, qualquer
engenheiro de dados que trabalhou no campo por mais de alguns anos provavelmente fez
alguma variação de ETL reverso. O ETL reverso cresceu em popularidade no final de 2010/início
de 2020 e é cada vez mais reconhecido como uma responsabilidade formal de engenharia de
dados.
mãos da equipe de vendas. Você pode colocar os resultados em um painel para que eles
visualizem. Ou você pode enviar os resultados para eles como um arquivo Excel.
O desafio dessas abordagens é que elas não estão conectadas ao CRM, onde um vendedor
faz seu trabalho. Por que não colocar os leads pontuados de volta no CRM? Como
mencionamos, produtos de dados bem-sucedidos reduzem o atrito com o usuário final.
Nesse caso, o usuário final é a equipe de vendas.
Usar o ETL reverso e carregar os leads pontuados de volta ao CRM é a abordagem mais
fácil e melhor para esse produto de dados. O ETL reverso pega os dados processados do
lado de saída do ciclo de vida da engenharia de dados e os envia de volta aos sistemas de
origem (Figura 9-5).
NOTA
Em vez de ETL reverso, nós, os autores, meio brincando, chamamos isso de carga e
transformação bidirecional (BLT). O termo ETL reverso não descreve com muita precisão
o que está acontecendo nesse processo. Independentemente disso, o termo ficou na imaginação
popular e na imprensa, então vamos usá-lo ao longo do livro. De forma mais ampla, se o termo
ETL reverso permanece é uma incógnita, mas a prática de carregar dados de sistemas OLAP de
volta aos sistemas de origem continuará sendo importante.
Temos algumas palavras de advertência sobre o ETL reverso. O ETL reverso cria inerentemente loops
de feedback. Por exemplo, imagine que fazemos download de dados do Google Ads, usamos um modelo
para calcular novos lances, carregamos os lances de volta no Google Ads e iniciamos o processo
novamente. Suponha que, devido a um erro em seu modelo de lance, os lances tendam a subir cada vez
mais e seus anúncios recebam cada vez mais cliques. Você pode rapidamente desperdiçar enormes
quantias de dinheiro! Tenha cuidado e construa monitoramento e guarda-corpos.
Analistas de dados
Cientistas de dados
Engenheiros de MLOps/ML
Machine Translated by Google
Como lembrete, o engenheiro de dados opera em uma função de suporte para essas
partes interessadas e não é necessariamente responsável pelos usos finais dos dados. Por
exemplo, um engenheiro de dados fornece os dados para um relatório que os analistas
interpretam, mas o engenheiro de dados não é responsável por essas interpretações.
Em vez disso, o engenheiro de dados é responsável por produzir os produtos de dados da
mais alta qualidade possível.
Um engenheiro de dados deve estar ciente dos ciclos de feedback entre o ciclo de vida
da engenharia de dados e o uso mais amplo dos dados, uma vez que estejam nas mãos das
partes interessadas. Os dados raramente são estáticos, e o mundo exterior influenciará os
dados que são ingeridos e servidos e reingeridos e reservidos.
Uma grande consideração para engenheiros de dados no estágio de serviço do ciclo de vida é a
separação de tarefas e preocupações. Se você estiver em uma empresa em estágio inicial, o
engenheiro de dados também pode ser um engenheiro de ML ou um cientista de dados; isso não
é sustentável. À medida que a empresa cresce, você precisa estabelecer uma divisão clara de
tarefas com outros membros da equipe de dados.
Subcorrentes
As correntes ocultas chegam ao fim com o serviço. Lembre-se de que o ciclo de vida da
engenharia de dados é apenas isso: um ciclo de vida. O que vai volta. Vemos muitos casos
em que a veiculação de dados destaca algo perdido no início do ciclo de vida. Esteja sempre
atento a como as tendências ocultas podem ajudá-lo a identificar maneiras de melhorar os
produtos de dados.
seus dados estão em ótima forma antes de chegarem às mãos dos usuários finais.
Segurança
Os mesmos princípios de segurança se aplicam ao compartilhar dados com pessoas ou
sistemas. Muitas vezes vemos dados compartilhados indiscriminadamente, com pouco ou
nenhum controle de acesso ou pensamento sobre para que os dados serão usados. Este é um
grande erro que pode ter resultados catastróficos, como uma violação de dados e as multas
resultantes, má imprensa e empregos perdidos. Leve a segurança a sério, especialmente nesta
fase do ciclo de vida. De todos os estágios do ciclo de vida, o atendimento apresenta a maior
superfície de segurança.
Como sempre, exerça o princípio de privilégio mínimo tanto para pessoas quanto para
sistemas e forneça apenas o acesso necessário para o propósito em questão e o trabalho a ser
feito. De quais dados um executivo precisa versus um analista ou cientista de dados? E quanto
a um pipeline de ML ou processo de ETL reverso? Esses usuários e destinos têm necessidades
de dados diferentes e o acesso deve ser fornecido de acordo. Evite dar permissões de carta
branca a todos e a tudo.
O fornecimento de dados geralmente é somente leitura, a menos que uma pessoa ou processo
precise atualizar os dados no sistema do qual são consultados. As pessoas devem ter acesso
somente leitura a bancos de dados e conjuntos de dados específicos, a menos que sua função
exija algo mais avançado, como acesso de gravação ou atualização. Isso pode ser feito
combinando grupos de usuários com determinadas funções do IAM (ou seja, grupo de
analistas, grupo de cientistas de dados) ou funções personalizadas do IAM, se isso fizer
sentido. Para sistemas, forneça contas de serviço e funções de maneira semelhante.
Para usuários e sistemas, restrinja o acesso aos campos, linhas, colunas e células de
um conjunto de dados, se isso for garantido. Os controles de acesso devem ser tão refinados
quanto possível e revogados quando o acesso não for mais necessário.
A sugestão é usar o compartilhamento de dados em seus fluxos de trabalho, o que permite controles
granulares somente leitura entre você e as pessoas que consomem seus dados.
Verifique com que frequência os produtos de dados são usados e se faz sentido parar de compartilhar
determinados produtos de dados. É extremamente comum que um executivo solicite urgentemente a
um analista que crie um relatório, apenas para que esse relatório fique rapidamente sem uso. Se os
produtos de dados não forem usados, pergunte aos usuários se eles ainda são necessários. Caso
contrário, elimine o produto de dados. Isso significa uma vulnerabilidade de segurança a menos
flutuando por aí.
Por fim, você deve ver o controle de acesso e a segurança não como impedimentos para servir, mas
como facilitadores principais. Estamos cientes de muitos casos em que sistemas de dados complexos
e avançados foram criados, potencialmente causando um impacto significativo em uma empresa. Como
a segurança não foi implementada corretamente, poucas pessoas tiveram permissão para acessar os
dados, por isso definhou. O controle de acesso robusto e refinado significa que análises de dados e ML
mais interessantes podem ser feitas enquanto ainda protegem os negócios e seus clientes.
Gestão de dados
Você vem incorporando o gerenciamento de dados ao longo do ciclo de vida da engenharia de
dados, e o impacto de seus esforços logo se tornará aparente à medida que as pessoas usarem
seus produtos de dados. No estágio de veiculação, você está preocupado principalmente em
garantir que as pessoas possam acessar dados confiáveis e de alta qualidade.
Como mencionamos no início deste capítulo, a confiança talvez seja a variável mais crítica no
fornecimento de dados. Se as pessoas confiarem em seus dados, elas os usarão; dados não
confiáveis não serão usados. Certifique-se de tornar a confiança dos dados e a melhoria dos dados
um processo ativo, fornecendo loops de feedback. À medida que os usuários interagem com os
dados, eles podem relatar problemas e solicitar melhorias.
Comunique-se ativamente com seus usuários à medida que as alterações são feitas.
De quais dados as pessoas precisam para realizar seus trabalhos? Especialmente com preocupações
regulatórias e de conformidade pesando sobre as equipes de dados, dar às pessoas acesso aos
dados brutos – mesmo com campos e linhas limitados – representa um problema de rastreamento
de dados de volta a uma entidade, como uma pessoa ou um grupo de pessoas. Agradecidamente,
Machine Translated by Google
os avanços na ofuscação de dados permitem que você forneça dados sintéticos, codificados ou anônimos aos usuários
finais. Esses conjuntos de dados “falsos” devem permitir que um analista ou cientista de dados obtenha o sinal
necessário dos dados, mas de uma maneira que dificulte a identificação de informações protegidas. Embora este não
seja um processo perfeito - com esforço suficiente, muitos conjuntos de dados podem ser anônimos ou sofrer engenharia
Além disso, incorpore camadas semânticas e métricas em sua camada de serviço, juntamente com uma
modelagem de dados rigorosa que expresse adequadamente a lógica e as definições de negócios. Isso fornece uma única
fonte de verdade, seja para análise, ML, ETL reverso ou outros usos de serviço.
DataOps
As etapas que você executa no gerenciamento de dados — qualidade de dados, governança e segurança — são
Uma variedade de novas ferramentas surgiram para abordar vários aspectos de monitoramento. Por exemplo,
muitas ferramentas populares de observabilidade de dados visam minimizar o tempo de inatividade dos
dados e maximizar a qualidade dos dados. As ferramentas de observabilidade podem passar de dados para ML,
também é fundamental para o DataOps — por exemplo, você precisa monitorar se as conexões estão estáveis entre
Arquitetura de dados
A veiculação de dados deve ter as mesmas considerações de arquitetura que outros estágios
do ciclo de vida de engenharia de dados. Na fase de servir, os ciclos de feedback devem ser
rápidos e apertados. Os usuários devem poder acessar os dados de que precisam o mais
rápido possível quando precisam.
Orquestração
Por exemplo, um DAG mal escrito pode interromper o Airflow. A abordagem centralizada
significaria derrubar os processos de dados e servir em toda a organização. O gerenciamento de
orquestração centralizado requer altos padrões, testes automatizados de DAGs e manutenção
de portas.
Se a orquestração for centralizada, quem será o dono dela? Quando uma empresa tem
uma equipe de DataOps, a orquestração geralmente chega aqui. Muitas vezes, uma equipe
envolvida no atendimento é um ajuste natural porque tem uma visão bastante holística de
todos os estágios do ciclo de vida da engenharia de dados. Podem ser os DBAs, engenheiros
de análise, engenheiros de dados ou engenheiros de ML. Os engenheiros de ML coordenam
processos complexos de treinamento de modelos, mas podem ou não querer adicionar a
complexidade operacional do gerenciamento da orquestração a um conjunto de responsabilidades
já lotado.
Engenharia de software
Em comparação com alguns anos atrás, o fornecimento de dados tornou-se mais simples. A
necessidade de escrever código foi drasticamente simplificada. Os dados também passaram a
priorizar o código, com a proliferação de estruturas de código aberto focadas em simplificar o
fornecimento de dados. Existem muitas maneiras de fornecer dados aos usuários finais, e o foco
de um engenheiro de dados deve ser saber como esses sistemas funcionam e como os dados
são entregues.
Outra área em que os engenheiros de dados serão úteis é entender o impacto de como
o código e as consultas serão executados nos sistemas de armazenamento.
Os analistas podem gerar SQL de várias maneiras programáticas, incluindo LookML,
Jinja via dbt, várias ferramentas de mapeamento relacional de objeto (ORM) e camadas de
métricas. Quando essas camadas programáticas forem compiladas para SQL, como esse SQL
será executado? Um engenheiro de dados pode sugerir otimizações em que o código SQL pode
não funcionar tão bem quanto o SQL escrito à mão.
Machine Translated by Google
A ascensão da análise e do ML IaC significa que o papel de escrever código está se movendo em
direção à construção de sistemas que dão suporte a cientistas e analistas de dados. Os
engenheiros de dados podem ser responsáveis por configurar os pipelines de CI/CD e criar
processos para sua equipe de dados. Eles também fariam bem em treinar e apoiar sua equipe de
dados no uso da infraestrutura de dados/MLOps que criaram para que essas equipes de dados
possam ser o mais autossuficientes possível.
Conclusão
O ciclo de vida da engenharia de dados tem um final lógico no estágio de veiculação. Como em
todos os ciclos de vida, ocorre um ciclo de feedback (Figura 9-6). Você deve ver o estágio de
veiculação como uma chance de aprender o que está funcionando e o que pode ser melhorado.
Ouça seus stakeholders. Se eles levantarem problemas – e inevitavelmente o farão – tente não
se ofender. Em vez disso, use isso como uma oportunidade para melhorar o que você construiu.
Recursos adicionais
“Projetando produtos de dados” por Seth O'Regan
“Dados como um produto versus produtos de dados: quais são as diferenças?” por
Xavier Gumara Rigol
1 “Know Your Customers' 'Jobs to Be Done'” por Clayton M. Christensen et al., Harvard
Business Review, setembro de 2016, https:// oreil.ly/ 3uU4j.
2 Benn Stancil, “The Missing Piece of the Modern Data Stack”, benn.substack, 22 de abril de
2021, https:// oreil.ly/ wQyPb.
3 Srini Kadamati, “Understanding the Superset Semantic Layer”, blog Preset, 21 de dezembro
de 2021, https:// oreil.ly/ 6smWC.
Machine Translated by Google
Cada vez mais, a privacidade é uma questão de importância legal significativa. Por
exemplo, o Family Educational Rights and Privacy Act (FERPA) entrou em vigor nos EUA
na década de 1970; o Health Insurance Portability and Accountability Act (HIPAA) foi
seguido na década de 1990; O GDPR foi aprovado na Europa em meados da década de
2010. Várias leis de privacidade baseadas nos EUA foram aprovadas ou serão aprovadas
em breve. Esta é apenas uma pequena amostra de estatutos relacionados à privacidade (e
acreditamos ser apenas o começo). Ainda assim, as penalidades pela violação de qualquer
uma dessas leis podem ser significativas, até mesmo devastadoras, para um negócio. E
como os sistemas de dados estão integrados na estrutura da educação, saúde e negócios,
os engenheiros de dados lidam com dados confidenciais relacionados a cada uma dessas leis.
Machine Translated by Google
Pessoas
O elo mais fraco em segurança e privacidade é você. A segurança é muitas
vezes comprometida no nível humano, portanto, comporte-se como se você fosse sempre
um alvo. Um bot ou ator humano está tentando se infiltrar em suas credenciais e informações
confidenciais a qualquer momento. Esta é a nossa realidade, e não vai desaparecer. Assuma
uma postura defensiva com tudo o que você faz online e offline.
Exercite o poder do pensamento negativo e seja sempre paranóico.
Rio abaixo. A melhor maneira de proteger dados privados e confidenciais é evitar a ingestão
desses dados em primeiro lugar.
Os engenheiros de dados devem pensar nos cenários de ataque e vazamento com qualquer
pipeline de dados ou sistema de armazenamento que utilizam. Ao decidir sobre estratégias
de segurança, certifique-se de que sua abordagem ofereça segurança adequada e não
apenas a ilusão de segurança.
Você também é a primeira linha de defesa no respeito à privacidade e à ética. Você se sente
desconfortável com os dados confidenciais que recebeu a tarefa de coletar? Você tem dúvidas
éticas sobre a forma como os dados estão sendo tratados em um projeto?
Levante suas preocupações com colegas e liderança. Certifique-se de que seu trabalho seja
legalmente compatível e ético.
Processos
Quando as pessoas seguem os processos regulares de segurança, a segurança se torna parte
do trabalho. Faça da segurança um hábito, pratique regularmente a segurança real, exerça o
princípio do privilégio mínimo e entenda o modelo de responsabilidade compartilhada na nuvem.
atenção suficiente para cenários potencialmente ruins. Infelizmente, isso cria uma ilusão de
segurança, mas muitas vezes deixa lacunas que seriam evidentes com alguns minutos de reflexão.
A segurança precisa ser simples e eficaz o suficiente para se tornar habitual em toda a
organização. Estamos impressionados com o número de empresas com políticas de segurança
nas centenas de páginas que ninguém lê, a revisão anual de políticas de segurança que as
pessoas esquecem imediatamente, tudo em uma auditoria de segurança. Este é o teatro de
segurança, onde a segurança é feita na carta de conformidade (SOC-2, ISO 27001 e afins) sem
compromisso real.
Em vez disso, busque o espírito de segurança genuína e habitual; assar uma mentalidade de
segurança em sua cultura. A segurança não precisa ser complicada. Por exemplo, em nossa
empresa, realizamos treinamento de segurança e revisão de políticas pelo menos uma vez por
mês para incorporar isso ao DNA de nossa equipe e atualizar uns aos outros sobre as práticas de
segurança que podemos melhorar. A segurança não deve ser uma reflexão tardia para sua equipe
de dados. Todos são responsáveis e têm um papel a desempenhar. Deve ser a prioridade para
você e todos os outros com quem você trabalha.
Segurança Ativa
Voltando à ideia de pensamento negativo, a segurança ativa implica pensar e pesquisar as
ameaças à segurança em um mundo dinâmico e em mudança.
Em vez de simplesmente implantar ataques de phishing simulados programados, você pode
adotar uma postura de segurança ativa pesquisando ataques de phishing bem-sucedidos e
analisando as vulnerabilidades de segurança de sua organização.
Em vez de simplesmente adotar uma lista de verificação de conformidade padrão, você pode
pensar nas vulnerabilidades internas específicas da sua organização e nos incentivos que os
funcionários podem ter para vazar ou fazer uso indevido de informações privadas.
e nada mais. Muitas vezes, vemos um antipadrão na nuvem: um usuário comum recebe
acesso administrativo a tudo, quando essa pessoa pode precisar de apenas algumas funções
do IAM para fazer seu trabalho. Dar a alguém acesso administrativo carta branca é um grande
erro e nunca deveria acontecer sob o princípio do privilégio mínimo.
Em vez disso, forneça ao usuário (ou grupo ao qual ele pertence) as funções do IAM
necessárias quando precisar. Quando esses papéis não forem mais necessários, retire-os. A
mesma regra se aplica às contas de serviço. Trate humanos e máquinas da mesma maneira:
dê a eles apenas os privilégios e os dados de que precisam para realizar seus trabalhos e
apenas pelo período de tempo, quando necessário.
O backup de dados não se enquadra estritamente nas práticas de segurança e privacidade; ele
está sob o título maior de prevenção de desastres, mas é adjacente à segurança,
especialmente na era dos ataques de ransomware.
Proteja suas credenciais a todo custo. Aqui estão algumas regras básicas para credenciais:
Use um logon único (SSO) para tudo. Evite senhas sempre que possível e use
SSO como padrão.
Não coloque suas credenciais no código. Trate segredos como configuração e nunca os
confirme no controle de versão. Use um gerenciador de segredos sempre que possível.
dispositivo(s).
Trate seu dispositivo como uma extensão de si mesmo. Não deixe o(s) dispositivo(s)
Ao compartilhar a tela, saiba exatamente o que você está compartilhando para proteger
Use o modo “não perturbe” nas videochamadas; isso evita que as mensagens apareçam
orientação.
Aguarde uma semana ou duas para novos lançamentos de versões principais do sistema operacional.
Estes são alguns exemplos básicos de como a segurança pode ser simples e eficaz.
Com base no perfil de segurança da sua empresa, pode ser necessário adicionar mais requisitos para
as pessoas seguirem. E, novamente, lembre-se sempre de que as pessoas são seu elo mais fraco em
segurança.
Tecnologia
Depois de abordar a segurança com pessoas e processos, é hora de ver como você aproveita a tecnologia
para proteger seus sistemas e ativos de dados. A seguir estão algumas áreas importantes que você deve
priorizar.
Machine Translated by Google
Criptografia
A criptografia não é uma bala mágica. Ele fará pouco para protegê-lo no caso de uma violação
de segurança humana que conceda acesso a credenciais. A criptografia é um requisito básico
para qualquer organização que respeite a segurança e a privacidade.
Ele irá protegê-lo de ataques básicos, como interceptação de tráfego de rede.
Criptografia em repouso
Certifique-se de que seus dados estejam criptografados quando estiverem em repouso (em um dispositivo de
armazenamento). Os laptops da sua empresa devem ter a criptografia de disco completa habilitada para
proteger os dados em caso de roubo de um dispositivo. Implemente a criptografia do lado do servidor para
objetos na nuvem. Todos os backups de dados para fins de arquivamento também devem ser criptografados.
A criptografia por fio agora é o padrão para os protocolos atuais. Por exemplo, HTTPS
geralmente é necessário para APIs de nuvem modernas. Os engenheiros de dados
devem sempre estar cientes de como as chaves são tratadas; o manuseio incorreto de
chaves é uma fonte significativa de vazamentos de dados. Além disso, o HTTPS não faz
nada para proteger os dados se as permissões de bucket forem deixadas abertas ao
público, outra causa de vários escândalos de dados na última década.
Machine Translated by Google
Certifique-se de que tudo esteja criptografado por fio, mesmo com protocolos legados.
Em caso de dúvida, use tecnologia robusta com criptografia integrada.
Acesso
Quem está acessando o quê, quando e de onde? Que novos acessos foram concedidos?
Existem padrões estranhos com seus usuários atuais que podem indicar que a conta deles
eles geralmente não acessam ou não deveriam ter acesso? Você vê novo
regularmente os logs de acesso, usuários e suas funções para garantir que tudo
Parece bom.
Recursos
Monitore seu disco, CPU, memória e E/S em busca de padrões que pareçam fora do
Cobrança
Especialmente com SaaS e serviços gerenciados em nuvem, você precisa supervisionar os custos.
Configure alertas de orçamento para garantir que seus gastos estejam dentro das expectativas. Se
indicar que alguém ou algo está utilizando seus recursos para fins maliciosos
propósitos.
Permissões em excesso
Cada vez mais, os fornecedores estão fornecendo ferramentas que monitoram as permissões
que não são utilizadas por um usuário ou conta de serviço por algum tempo. Essas ferramentas
geralmente podem ser configuradas para alertar automaticamente um administrador ou remover
permissões após um tempo especificado.
Por exemplo, suponha que um determinado analista não tenha acessado o Redshift por seis
meses. Essas permissões podem ser removidas, fechando uma possível falha de segurança. Se o
analista precisar acessar o Redshift no futuro, ele poderá inserir um tíquete para restaurar as
permissões.
É melhor combinar essas áreas em seu monitoramento para obter uma visão transversal do seu
recurso, acesso e perfil de cobrança. Sugerimos configurar um painel para que todos na equipe de
dados visualizem o monitoramento e recebam alertas quando algo parecer fora do comum. Junte isso
a um plano de resposta a incidentes eficaz para gerenciar violações de segurança quando elas
ocorrerem e execute o plano regularmente para que você esteja preparado.
Acesso à rede
Muitas vezes vemos engenheiros de dados fazendo coisas bem loucas em relação ao acesso à
rede. Em vários casos, vimos buckets do Amazon S3 disponíveis publicamente abrigando muitos
dados confidenciais. Também testemunhamos instâncias do Amazon EC2 com acesso SSH de entrada
aberto para todo o mundo para 0.0.0.0/0
Machine Translated by Google
(todos os IPs) ou bancos de dados com acesso aberto a todas as solicitações de entrada pela
Internet pública. Estes são apenas alguns exemplos de práticas terríveis de segurança de rede.
Em princípio, a segurança da rede deve ser deixada para os especialistas em segurança da sua
empresa. (Na prática, você pode precisar assumir uma responsabilidade significativa pela segurança
da rede em uma pequena empresa.) Como engenheiro de dados, você encontrará bancos de dados,
armazenamento de objetos e servidores com tanta frequência que deve pelo menos estar ciente das
medidas simples que pode tomar para garantir que você esteja de acordo com as boas práticas de
acesso à rede. Entenda quais IPs e portas estão abertos, para quem e por quê. Permita os endereços IP
de entrada dos sistemas e usuários que acessarão essas portas e evite a abertura ampla de conexões
por qualquer motivo. Ao acessar a nuvem ou uma ferramenta SaaS, use uma conexão criptografada. Por
exemplo, não use um site não criptografado de uma cafeteria.
Além disso, embora este livro tenha se concentrado quase inteiramente na execução de cargas de
trabalho na nuvem, adicionamos uma breve observação aqui sobre a hospedagem de servidores locais.
Lembre-se de que, no Capítulo 3, discutimos a diferença entre um perímetro protegido e uma segurança
de confiança zero. A nuvem geralmente está mais próxima da segurança de confiança zero — cada ação
requer autenticação. Acreditamos que a nuvem é uma opção mais segura para a maioria das organizações
porque impõe práticas de confiança zero e permite que as empresas aproveitem o exército de engenheiros
de segurança empregados pelas nuvens públicas.
No entanto, às vezes, a segurança de perímetro reforçada ainda faz sentido; encontramos algum consolo
no conhecimento de que os silos de mísseis nucleares são air gaped (não conectados a nenhuma rede).
Servidores air-gapped são o melhor exemplo de um perímetro de segurança reforçado. Lembre-se de que,
mesmo no local, os servidores com gap de ar são vulneráveis a falhas de segurança humana.
vulnerabilidade. Uma falha em uma biblioteca de log obscura pode permitir que invasores
ignorem controles de acesso ou criptografia. Mesmo arquiteturas de CPU e microcódigo
representam vulnerabilidades potenciais; dados confidenciais podem ser vulneráveis quando
está em repouso na memória ou em um cache da CPU. Nenhum elo na cadeia pode ser
tomado como certo.
É claro que este livro trata principalmente de engenharia de dados de alto nível —
unindo ferramentas para lidar com todo o ciclo de vida. Assim, deixaremos para você explorar
os detalhes técnicos sangrentos.
Conclusão
A segurança precisa ser um hábito mental e de ação; tratar dados como sua carteira ou
smartphone. Embora você provavelmente não seja responsável pela segurança de sua
empresa, conhecer as práticas básicas de segurança e manter a segurança em mente
ajudará a reduzir o risco de violações de segurança de dados em sua organização.
Machine Translated by Google
Recursos adicionais
Open Web Application Security Project (OWASP) publicações
Neste livro, nos concentramos em grandes ideias que achamos que serão úteis nos
próximos anos — daí a continuidade do ciclo de vida da engenharia de dados e suas
correntes. A ordem das operações e os nomes das melhores práticas e tecnologias
podem mudar, mas os estágios primários do ciclo de vida provavelmente permanecerão
intactos por muitos anos. Estamos cientes de que a tecnologia continua a mudar em um
ritmo exaustivo; trabalhar no setor de tecnologia em nossa era atual pode parecer uma
montanha-russa ou talvez uma sala de espelhos.
Vários anos atrás, a engenharia de dados nem existia como um campo ou cargo.
Agora você está lendo um livro chamado Fundamentos da Engenharia de Dados!
Você aprendeu tudo sobre os fundamentos da engenharia de dados — seu ciclo
de vida, subcorrentes, tecnologias e melhores práticas. Você pode estar se
perguntando, o que vem a seguir na engenharia de dados? Embora ninguém possa prever
o futuro, temos uma boa perspectiva sobre o passado, o presente e as tendências atuais.
Tivemos a sorte de observar a gênese e a evolução da engenharia de dados da primeira
fila. Este capítulo final apresenta nossos pensamentos
Machine Translated by Google
entender as entranhas de vários sistemas de “big data”. A engenharia de dados agora é algo
que todas as empresas podem fazer.
Big data é uma vítima de seu sucesso extraordinário. Por exemplo, o Google BigQuery,
descendente de GFS e MapReduce, pode consultar petabytes de dados. Antes reservada
para uso interno no Google, essa tecnologia incrivelmente poderosa agora está disponível
para qualquer pessoa com uma conta do GCP. Os usuários simplesmente pagam pelos dados
que armazenam e consultam, em vez de ter que construir uma pilha de infraestrutura enorme.
Snowflake, Amazon EMR e muitas outras soluções de dados em nuvem hiperescaláveis
competem no espaço e oferecem recursos semelhantes.
Quando executo um aplicativo nesta máquina, ele não acessa diretamente o hardware de som e
gráficos. Em vez disso, ele envia comandos aos serviços do sistema operacional para desenhar
janelas e reproduzir som. Esses comandos são emitidos para APIs padrão; uma especificação
informa aos desenvolvedores de software como se comunicar com os serviços do sistema
operacional. O sistema operacional orquestra um processo de inicialização para fornecer esses
serviços, iniciando cada serviço na ordem correta com base nas dependências entre eles;
também mantém os serviços monitorando-os e reiniciando-os na ordem correta em caso de falha.
Machine Translated by Google
Agora vamos voltar aos dados na nuvem. Os serviços de dados simplificados que
mencionamos ao longo deste livro (por exemplo, Google Cloud BigQuery, Azure
Blob Storage, Snowflake e AWS Lambda) se assemelham a serviços de sistema
operacional, mas em uma escala muito maior, executados em muitas máquinas em vez
de um único servidor .
comitês vestidos com camisas azuis e calças cáqui excessivamente engomadas, burocracia
interminável e projetos de desenvolvimento gerenciados em cascata com cronogramas
constantemente escorregando e orçamentos inflados. Em suma, alguns de vocês lêem
“empresa” e imaginam um lugar sem alma onde a inovação morre.
Felizmente, não é disso que estamos falando; estamos nos referindo a algumas das coisas
boas que empresas maiores fazem com dados — gerenciamento, operações, governança e
outras coisas “chatas”. Atualmente, estamos vivendo a era de ouro das ferramentas de
gerenciamento de dados “empresariais”.
Tecnologias e práticas antes reservadas para organizações gigantes estão se
espalhando. As partes difíceis de big data e streaming de dados agora foram amplamente
abstraídas, com o foco mudando para facilidade de uso, interoperabilidade e outros
refinamentos.
Isso permite que os engenheiros de dados que trabalham em novas ferramentas encontrem
oportunidades nas abstrações de gerenciamento de dados, DataOps e todas as outras
correntes ocultas da engenharia de dados. Os engenheiros de dados se tornarão “empresariais”.
Falando nisso…
À medida que a simplicidade sobe na pilha, os cientistas de dados gastarão uma fatia menor
de seu tempo coletando e processando dados. Mas essa tendência se estenderá além dos
cientistas de dados. A simplificação também significa que os engenheiros de dados gastarão
menos tempo em tarefas de baixo nível no ciclo de vida da engenharia de dados (gerenciamento
de servidores, configuração etc.), e a engenharia de dados “empresarial” se tornará mais
predominante.
Machine Translated by Google
À medida que os dados se tornam mais incorporados aos processos de cada negócio, novas
funções surgirão no domínio dos dados e dos algoritmos. Uma possibilidade é uma função que
fica entre a engenharia de ML e a engenharia de dados. À medida que os conjuntos de
ferramentas de ML se tornam mais fáceis de usar e os serviços de ML em nuvem gerenciados
crescem em recursos, o ML está deixando de lado a exploração ad hoc e o desenvolvimento de
modelos para se tornar uma disciplina operacional.
Esse novo engenheiro com foco em ML que atravessa essa divisão conhecerá
algoritmos, técnicas de ML, otimização de modelos, monitoramento de modelos e
monitoramento de dados. No entanto, sua função principal será criar ou utilizar os sistemas que
treinam automaticamente os modelos, monitoram o desempenho e operacionalizam o processo
de ML completo para tipos de modelo que são bem compreendidos.
Eles também monitorarão pipelines e qualidade de dados, sobrepondo-se ao domínio
atual da engenharia de dados. Os engenheiros de ML se tornarão mais especializados
para trabalhar em tipos de modelos mais próximos da pesquisa e menos compreendidos.
O que está impulsionando essa evolução? Em muitos casos, a análise (BI e análise
operacional) será substituída pela automação. Atualmente, a maioria dos painéis e
relatórios responde a perguntas sobre o quê e quando. Pergunte a si mesmo: “Se
estou fazendo uma pergunta sobre o que ou quando , que ação devo tomar em
seguida?” Se a ação for repetitiva, é candidata à automação. Por que examinar um
relatório para determinar se deve agir quando você pode automatizar a ação com base
nos eventos à medida que eles ocorrem?
E vai muito além disso. Por que usar um produto como TikTok, Uber, Google ou
DoorDash parece mágico? Embora pareça para você clicar em um botão para assistir
a um vídeo curto, pedir uma carona ou uma refeição ou encontrar um resultado de
pesquisa, muita coisa está acontecendo nos bastidores. Esses produtos são exemplos
de verdadeiros aplicativos de dados em tempo real, fornecendo as ações de que você
precisa com o clique de um botão enquanto executam processamento de dados
extremamente sofisticado e ML nos bastidores com latência minúscula. Atualmente,
esse nível de sofisticação está bloqueado atrás de tecnologias personalizadas em
grandes empresas de tecnologia, mas essa sofisticação e poder estão se democratizando,
semelhante à maneira como o MDS trouxe data warehouses e pipelines em escala de
nuvem para as massas. O mundo dos dados em breve estará “ao vivo”.
Essa democratização das tecnologias em tempo real nos levará ao sucessor do MDS: a
pilha de dados ao vivo em breve estará acessível e difundida. A pilha de dados ao
vivo, representada na Figura 11-1, fundirá análises em tempo real e ML em aplicativos
usando tecnologias de streaming, cobrindo todo o ciclo de vida dos dados, desde
sistemas de origem de aplicativos até processamento de dados para ML e vice-versa.
Figura 11-1. Na pilha de dados ao vivo, os dados e a inteligência se movem em tempo real entre o
aplicativo e os sistemas de suporte
Embora o data warehouse e o data lake sejam ótimos para abrigar grandes quantidades de
dados e realizar consultas ad hoc, eles não são tão bem otimizados para ingestão de dados
de baixa latência ou consultas em dados em movimento rápido. A pilha de dados ao vivo
será alimentada por bancos de dados OLAP criados especificamente para
Machine Translated by Google
transmissão. Hoje, bancos de dados como Druid, ClickHouse, Rockset e Firebolt estão
liderando o caminho para alimentar o back-end da próxima geração de aplicativos de
dados. Esperamos que as tecnologias de streaming continuem a evoluir rapidamente e
que novas tecnologias proliferem.
Outra área que achamos que está pronta para disrupção é a modelagem de dados,
onde não houve inovação séria desde o início dos anos 2000. As técnicas tradicionais
de modelagem de dados orientadas a lotes que você aprendeu no Capítulo 8 não são
adequadas para streaming de dados. Novas técnicas de modelagem de dados ocorrerão
não no data warehouse, mas nos sistemas que geram os dados. Esperamos que a
modelagem de dados envolva alguma noção de uma camada de definições upstream –
incluindo semântica, métricas, linhagem e definições de dados (consulte o Capítulo 9) –
começando onde os dados são gerados no aplicativo. A modelagem também acontecerá
em todas as etapas à medida que os dados fluem e evoluem ao longo de todo o ciclo de
vida.
casos de uso de OLTP e OLAP; os armazenamentos de recursos também podem desempenhar um papel
semelhante para casos de uso de ML.
Machine Translated by Google
O ML é adequado para cenários em que os dados são gerados em uma taxa e volume tão
altos que os humanos não podem processá-los manualmente. À medida que o tamanho e a
velocidade dos dados aumentam, isso se aplica a todos os cenários. Grandes volumes de
dados em movimento rápido, juntamente com fluxos de trabalho e ações sofisticados, são
candidatos ao ML. À medida que os ciclos de feedback de dados se tornam mais curtos,
esperamos que a maioria dos aplicativos integre o ML. À medida que os dados se movem mais
rapidamente, o ciclo de feedback entre os aplicativos e o ML ficará mais estreito. Os aplicativos
na pilha de dados ao vivo são inteligentes e capazes de se adaptar em tempo real às mudanças
nos dados. Isso cria um ciclo de aplicativos cada vez mais inteligentes e aumenta o valor
comercial.
abra arquivos e veja relatórios para usuários avançados que podem criar scripts de
processamento de dados processuais sofisticados. Até agora, as ferramentas de BI não
conseguiram trazer interatividade comparável aos bancos de dados. Os usuários que interagem
com a interface do usuário normalmente estão limitados a fatiar e dividir dados em determinadas
proteções, não a análises programáveis de uso geral.
Prevemos que surgirá uma nova classe de ferramentas que combinam os recursos
analíticos interativos de uma planilha com o poder de back-end dos sistemas OLAP em nuvem. De
fato, alguns candidatos já estão concorrendo.
O vencedor final nesta categoria de produto pode continuar a usar paradigmas de
planilhas ou pode definir idiomas de interface totalmente novos para interagir com dados.
Conclusão
Obrigado por se juntar a nós nesta jornada pela engenharia de dados! Percorremos a boa
arquitetura, os estágios do ciclo de vida da engenharia de dados e as melhores práticas de
segurança. Discutimos estratégias para escolher tecnologias em um momento em que nosso
campo continua a mudar em um ritmo extraordinário. Neste capítulo, apresentamos nossa louca
especulação sobre o futuro próximo e intermediário.
engenheiros e aqueles que trabalham adjacentes ao campo para encontrar seu caminho em
um domínio que está em fluxo. Aconselhamos que você continue a exploração por conta própria.
À medida que você descobre tópicos e ideias interessantes neste livro, continue a
conversa como parte de uma comunidade. Identifique especialistas de domínio que podem ajudá-
lo a descobrir os pontos fortes e as armadilhas das tecnologias e práticas modernas. Leia
extensivamente os últimos livros, postagens de blogs e artigos.
Participe de encontros e ouça palestras. Faça perguntas e compartilhe seus próprios
conhecimentos. Fique de olho nos anúncios dos fornecedores para ficar a par dos últimos
desenvolvimentos, levando todas as reivindicações com um grão de sal saudável.
Através deste processo, você pode escolher a tecnologia. Em seguida, você precisará adotar
a tecnologia e desenvolver conhecimentos, talvez como um colaborador individual, talvez
dentro de sua equipe como líder, talvez em toda uma organização de tecnologia. Ao fazer
isso, não perca de vista os objetivos maiores da engenharia de dados. Concentre-se no ciclo de
vida, em atender seus clientes – internos e externos – em seus negócios, em servir e em seus
objetivos maiores.
1 Benn Stancil, “The Data OS”, benn.substack, 3 de setembro de 2021, https:// oreil.ly/ HetE9.
Machine Translated by Google
2 Ben Rogojan, “Três especialistas em engenharia de dados compartilham seus pensamentos sobre onde os dados estão
Headed”, Better Programming, 27 de maio de 2021, https:// oreil.ly/ IsY4W.
Machine Translated by Google
Formatos de serialização
Muitos algoritmos e formatos de serialização estão disponíveis para engenheiros de dados.
Embora a abundância de opções seja uma fonte significativa de problemas na engenharia de
dados, elas também são uma grande oportunidade para melhorias de desempenho. Às vezes,
vimos o desempenho do trabalho melhorar em um fator de 100 simplesmente alternando da serialização
CSV para Parquet. À medida que os dados passam por um pipeline, os engenheiros também gerenciam
a reserialização — conversão de um formato para outro. Às vezes, os engenheiros de dados não têm
escolha a não ser aceitar dados em uma forma antiga e desagradável; eles devem projetar processos
para desserializar esse formato e lidar com exceções e, em seguida, limpar e converter dados para
processamento e consumo consistentes e rápidos de downstream.
Como o próprio nome sugere, a serialização baseada em linha organiza os dados por linha. O
formato CSV é um formato arquetípico baseado em linhas. Para dados semiestruturados (objetos de
dados que suportam aninhamento e variação de esquema), a serialização orientada a linhas envolve
o armazenamento de cada objeto como uma unidade.
Os engenheiros de dados devem evitar o uso de arquivos CSV em pipelines porque eles
são altamente propensos a erros e apresentam desempenho insatisfatório. Os engenheiros
geralmente precisam usar o formato CSV para trocar dados com sistemas e processos de
negócios fora de seu controle. CSV é um formato comum para arquivamento de dados.
Se você usa CSV para arquivamento, inclua uma descrição técnica completa da configuração
de serialização de seus arquivos para que futuros consumidores possam ingerir os dados.
XML
Extensible Markup Language (XML) era popular quando o HTML e a Internet eram novos,
mas agora é visto como legado; geralmente é lento para desserializar e serializar para
aplicativos de engenharia de dados. XML é outro padrão com o qual os engenheiros de
dados são frequentemente forçados a interagir enquanto trocam dados com sistemas e
softwares legados. O JSON substituiu amplamente o XML para serialização de objetos de
texto simples.
JSON e JSONL
JavaScript Object Notation (JSON) surgiu como o novo padrão para troca de dados sobre
APIs, e também se tornou um formato extremamente popular para armazenamento de
dados. No contexto de bancos de dados, a popularidade do JSON cresceu rapidamente com
o surgimento do MongoDB e de outros repositórios de documentos.
Bancos de dados como Snowflake, BigQuery e SQL Server também oferecem
amplo suporte nativo, facilitando a troca de dados entre aplicativos, APIs e sistemas
de banco de dados.
JSON Lines (JSONL) é uma versão especializada do JSON para armazenar dados
semiestruturados em massa em arquivos. JSONL armazena uma sequência de objetos
JSON, com objetos delimitados por quebras de linha. Do nosso ponto de vista, JSONL é
um formato extremamente útil para armazenar dados logo após serem ingeridos da API ou
dos aplicativos. No entanto, muitos formatos colunares oferecem
Machine Translated by Google
atuação. Considere mudar para outro formato para estágios intermediários de pipeline e
veiculação.
Avro
Serialização Colunar
Os formatos de serialização que discutimos até agora são orientados por linha. Os dados
são codificados como relações completas (CSV) ou documentos (XML e JSON), e estes
são gravados em arquivos sequencialmente.
Mesmo quando as colunas não contêm um grande número de valores repetidos, elas
podem apresentar alta redundância. Suponha que organizamos as mensagens de suporte
ao cliente em uma única coluna de dados. Provavelmente veremos os mesmos temas e
palavreado repetidamente nessas mensagens, permitindo que os algoritmos de compactação
de dados realizem uma alta proporção. Por esse motivo, o armazenamento colunar
geralmente é combinado com a compactação, permitindo maximizar os recursos de largura
de banda do disco e da rede.
Machine Translated by Google
Parquet
O Parquet armazena dados em formato colunar e foi projetado para obter um excelente desempenho
de leitura e gravação em um ambiente de data lake. O Parquet resolve alguns problemas que
frequentemente atormentam os engenheiros de dados. Os dados codificados em parquet são criados
em informações de esquema e oferecem suporte nativo a dados aninhados, ao contrário de CSV.
Além disso, o Parquet é portátil; enquanto bancos de dados como BigQuery e Snowflake
serializam dados em formatos colunares proprietários e oferecem excelente desempenho de
consulta em dados armazenados internamente, ocorre um grande impacto no desempenho ao
interoperar com ferramentas externas. Os dados devem ser desserializados, reserializados em
um formato intercambiável e exportados para usar ferramentas de data lake, como Spark e Presto.
Os arquivos Parquet em um data lake podem ser uma opção superior aos data warehouses em
nuvem proprietários em um ambiente de ferramentas poliglotas.
ORC
A ideia do Apache Arrow é repensar a serialização utilizando um formato de dados binários adequado
1 de
tanto para processamento na memória quanto para exportação. Isso nos permite evitar a sobrecarga
serialização e desserialização; simplesmente usamos o mesmo formato para processamento na memória,
exportação pela rede e armazenamento de longo prazo. Arrow depende do armazenamento colunar, onde
cada coluna obtém essencialmente seus próprios pedaços de memória. Para dados aninhados, usamos
uma técnica chamada fragmentação, que mapeia cada local no esquema de documentos JSON em uma
coluna separada.
Essa técnica significa que podemos armazenar um arquivo de dados em disco, trocá-lo diretamente no
espaço de endereço do programa usando a memória virtual e começar a executar uma consulta nos
dados sem sobrecarga de desserialização. Na verdade, podemos trocar partes do arquivo na memória
enquanto o examinamos e, em seguida, trocá-los de volta para evitar ficar sem memória para grandes
conjuntos de dados.
Uma dor de cabeça óbvia com essa abordagem é que diferentes linguagens de programação
serializam dados de maneiras diferentes. Para resolver esse problema, o Projeto Arrow criou bibliotecas
de software para uma variedade de linguagens de programação (incluindo C, Go, Java, JavaScript,
MATLAB, Python, R e Rust) que permitem que essas linguagens interoperem com dados do Arrow na
memória. Em alguns casos, essas bibliotecas usam uma interface entre os
Machine Translated by Google
linguagem e código de baixo nível em outra linguagem (por exemplo, C) para ler e escrever a
partir do Arrow. Isso permite alta interoperabilidade entre linguagens sem sobrecarga extra de
serialização. Por exemplo, um programa Scala pode usar a biblioteca Java para escrever dados
de seta e depois passá-los como uma mensagem para um Python
programa.
A Arrow está tendo uma rápida aceitação com uma variedade de estruturas populares, como o
Apache Spark. A Arrow também abrangeu um novo produto de data warehouse; Dremio é um
mecanismo de consulta e data warehouse construído em torno da serialização Arrow para
oferecer suporte a consultas rápidas.
Serialização híbrida
Usamos o termo serialização híbrida para nos referirmos a tecnologias que combinam várias
técnicas de serialização ou integram a serialização com camadas de abstração adicionais,
como gerenciamento de esquema. Citamos como exemplos Apache Hudi e Apache Iceberg.
Hudi
Iceberg
Assim como o Hudi, o Iceberg é uma tecnologia de gerenciamento de tabelas. Iceberg pode rastrear todos
os arquivos que compõem uma tabela. Ele também pode rastrear arquivos em cada instantâneo de tabela
Machine Translated by Google
time, permitindo a viagem no tempo da tabela em um ambiente de data lake. O Iceberg suporta a evolução do
de banco de dados. Todos os bancos de dados têm um mecanismo de armazenamento subjacente; muitos
não expõem seus mecanismos de armazenamento como uma abstração separada (por exemplo, BigQuery,
Outros (por exemplo, SQL Server) oferecem as principais opções de configuração do mecanismo de
consulta. O mecanismo de armazenamento gerencia todos os aspectos de como os dados são armazenados
Os mecanismos de armazenamento tiveram uma inovação significativa nas décadas de 2000 e 2010.
Enquanto os mecanismos de armazenamento no passado eram otimizados para acesso direto a discos
giratórios, os mecanismos de armazenamento modernos são muito mais otimizados para oferecer
suporte aprimorado para tipos e estruturas de dados modernos, como strings de comprimento variável, arrays e
dados aninhados.
Outra grande mudança nos mecanismos de armazenamento é uma mudança para armazenamento colunar para
aplicativos de análise e data warehouse. SQL Server, PostgreSQL e MySQL oferecem suporte robusto de
armazenamento colunar.
algoritmos de compactação procuram redundância e repetição nos dados e, em seguida, recodificam os dados
para reduzir a redundância. Quando queremos ler os dados brutos, nós os descompactamos invertendo o
Por exemplo, você notou que certas palavras aparecem repetidamente na leitura deste livro.
Executando algumas análises rápidas no texto, você pode identificar as palavras que ocorrem com
mais frequência e criar tokens abreviados para essas palavras. Para compactar, você substituiria
palavras comuns por seus tokens; para descompactar, você substituiria os tokens por suas
respectivas palavras.
Talvez pudéssemos usar essa técnica ingênua para obter uma taxa de compressão de 2:1 ou
mais. Os algoritmos de compressão utilizam técnicas matemáticas mais sofisticadas para identificar
e remover redundância; eles geralmente podem realizar taxas de compactação de 10: 1 em dados
de texto.
1 Dejan Simic, “Apache Arrow: Read DataFrame with Zero Memory,” Towards Data Science,
25 de junho de 2020, https:// oreil.ly/ TDAdY.
Machine Translated by Google
Este apêndice discute alguns fatores que os engenheiros de dados devem considerar sobre a
rede na nuvem. Os engenheiros de dados frequentemente encontram redes em suas carreiras e
muitas vezes as ignoram, apesar de sua importância.
Zonas de disponibilidade
Machine Translated by Google
Geralmente, as nuvens suportam sua maior largura de banda de rede e menor latência
entre sistemas e serviços dentro de uma zona. As cargas de trabalho de dados de alta taxa
de transferência devem ser executadas em clusters localizados em uma única zona por
motivos de desempenho e custo. Por exemplo, um cluster efêmero do Amazon EMR
geralmente deve estar em uma única zona de disponibilidade.
Além disso, o tráfego de rede enviado para VMs dentro de uma zona é gratuito, mas com
uma ressalva significativa: o tráfego deve ser enviado para endereços IP privados. As
principais nuvens utilizam redes virtuais conhecidas como nuvens privadas virtuais (VPCs).
As máquinas virtuais têm endereços IP privados na VPC. Eles também podem receber
endereços IP públicos para se comunicar com o mundo exterior e receber tráfego da Internet,
mas as comunicações usando endereços IP externos podem incorrer em cobranças de saída
de dados.
Regiões
Machine Translated by Google
Uma região é uma coleção de duas ou mais zonas de disponibilidade. Os data centers
exigem muitos recursos para funcionar (energia elétrica, água, etc.). Os recursos de zonas
de disponibilidade separadas são independentes para que uma queda de energia local não
desative várias zonas de disponibilidade. Os engenheiros podem criar uma infraestrutura
separada e altamente resiliente, mesmo em uma única região, executando servidores em
várias zonas ou criando failover automatizado entre zonas
processos.
Oferecer várias regiões permite que os engenheiros coloquem recursos perto de qualquer
um de seus usuários. Fechar significa que os usuários podem obter um bom desempenho
da rede na conexão com os serviços, minimizando a distância física ao longo do caminho da
rede e um número mínimo de saltos pelos roteadores. Tanto a distância física quanto os
saltos de rede podem aumentar a latência e diminuir o desempenho. Os principais provedores
de nuvem continuam a adicionar novas regiões.
Em geral, as regiões oferecem suporte a redes rápidas e de baixa latência entre zonas;
o desempenho de rede entre zonas será pior do que dentro de uma única zona e incorrerá
em cobranças nominais de saída de dados entre VMs. A movimentação de dados de rede
entre regiões é ainda mais lenta e pode gerar taxas de saída mais altas.
multirregiões são EUA (centros de dados nos Estados Unidos), UE (centros de dados nos
estados membros da União Europeia) e ÁSIA.
Vários recursos do GCP são compatíveis com multirregiões, incluindo Cloud Storage e
BigQuery. Os dados são armazenados em várias zonas dentro da multirregião de maneira
georedundante para que permaneçam disponíveis no caso de uma falha regional. O
armazenamento multirregional também foi projetado para fornecer dados com eficiência aos
usuários na multirregião sem configurar processos complexos de replicação entre regiões.
Além disso, não há taxas de saída de dados para VMs em uma multirregião para acessar
dados do Cloud Storage na mesma multirregião.
O Google também possui essencialmente mais recursos de rede em escala global do que
outros provedores de nuvem, algo que oferece a seus clientes como rede de nível
premium. A rede de nível premium permite que o tráfego entre zonas e regiões passe
inteiramente por redes de propriedade do Google sem atravessar a Internet pública.
Cada grande nuvem pública oferece opções de conectividade aprimoradas, permitindo que
os clientes integrem suas redes diretamente a uma região de nuvem ou VPC.
Por exemplo, a Amazon oferece o AWS Direct Connect. Além de fornecer maior largura de
banda e menor latência, essas opções de conexão geralmente oferecem grandes descontos
nas cobranças de saída de dados. Em um cenário típico nos EUA, as cobranças de saída da
AWS caem de 9 centavos por gigabyte na Internet pública para 2 centavos por gigabyte na
conexão direta.
CDN
As redes de entrega de conteúdo (CDNs) podem oferecer melhorias dramáticas
de desempenho e descontos para a entrega de ativos de dados ao público ou
Machine Translated by Google
Mas sinais interessantes indicam que a mudança pode estar no horizonte. Em particular,
o anúncio da Zoom em 2020, perto do início da pandemia do COVID-19, de que
escolheu a Oracle como seu provedor de infraestrutura em nuvem chamou a atenção
2
de muitos observadores de nuvem. Como a Oracle ganhou esse importante contrato de nuvem
para infraestrutura crítica de trabalho remoto em relação aos pesos-pesados da nuvem? O
especialista em AWS Corey Quinn oferece uma resposta razoavelmente direta. De acordo com
3
seu cálculo detalhado, as taxas mensais de saída de dados da AWS da Zoom seriam superiores
a US$ 11 milhões pelo preço de tabela; O da Oracle custaria menos de US$ 2 milhões.
Suspeitamos que um GCP, AWS ou Azure anuncie cortes significativos nas taxas de saída
nos próximos anos, levando a uma mudança radical no modelo de negócios da nuvem.
1 Matthew Prince e Nitin Rao, “AWS's Egregious Egress,” The Cloudflare Blog, 23 de julho de 2021,
https:// oreil.ly/ NZqKa.
2 Mark Haranas e Steven Burke, “Oracle vence rivais da nuvem para ganhar a Blockbuster Cloud
Deal”, CRN, 28 de abril de 2020, https:// oreil.ly/ LkqOi.
3 Corey Quinn, “Por que o Zoom escolheu o Oracle Cloud em vez da AWS e talvez você também deva”
Última semana na AWS, 28 de abril de 2020, https:// oreil.ly/ Lx5uu.
Machine Translated by Google
Machine Translated by Google
sobre os autores
Joe Reis é um nerd de dados com mentalidade de negócios que trabalha no setor de
dados há 20 anos, com responsabilidades que variam de modelagem estatística,
previsão, aprendizado de máquina, engenharia de dados, arquitetura de dados e
quase tudo mais. Joe é o CEO e cofundador da Ternary Data, uma empresa de
consultoria em arquitetura e engenharia de dados com sede em Salt Lake City, Utah.
Além disso, ele é voluntário em vários grupos de tecnologia e leciona na Universidade
de Utah. Em seu tempo livre, Joe gosta de escalar rochas, produzir música eletrônica
e levar seus filhos em aventuras malucas.
Colofão
Assim chamados por causa da mancha branca em suas orelhas, bem como por sua
plumagem fofa, essas pequenas e rotundas aves são encontradas em uma ampla
faixa da América do Sul central, onde habitam as bordas das florestas e
savana.