Baixe o app para aproveitar ainda mais
Prévia do material em texto
DESCRIÇÃO Introdução, conceituação e visão geral sobre o processo ETL com Python. PROPÓSITO Apresentar os conceitos de um processo de migração de dados com o uso do ETL com Python. PREPARAÇÃO Este conteúdo requer uso de computador e experiência de programação para implementar os códigos em Python fornecidos ao longo do texto. Recomendamos que você tenha alguma experiência em programação com Python e saiba configurar o ambiente de desenvolvimento. OBJETIVOS MÓDULO 1 Reconhecer os conceitos básicos de ETL MÓDULO 2 Identificar as ferramentas para ETL e os casos de uso INTRODUÇÃO Manipular, mover ou migrar dados requer muito cuidado devido à criticidade e à complexidade da tarefa. Neste conteúdo, explicaremos em detalhes as etapas do processo conhecido como ETL, sigla que vem do inglês extract, transform and load. Em português, ela significa extração, transformação e carga. O assunto é abordado com exemplos retirados da prática de ETL, com um caso de uso e uma explicação sobre o documento técnico que norteia o processo. Além disso, comandos em Python serão explicados para cada fase da ETL. MÓDULO 1 Reconhecer os conceitos básicos de ETL LIGANDO OS PONTOS Segundo o processo conhecido como ETL (extract, transform and load), os dados brutos obtidos devem ser transformados e carregados no repositório, em um formato adequado para tratamento. Como o Python pode ser útil nesse processo? Um ambiente de big data muito conhecido é o ecossistema Hadoop, no qual dados que serão analisados devem ser carregados no Hadoop File System (HDFS), sistema de arquivos que atua de forma distribuída e é voltado para grandes volumes. Para que os dados possam ser utilizados no processo de mapeamento e redução, eles devem ser fornecidos em formato que seja condizente com os algoritmos criados para ambos os processos. Através do National Climatic Data Center (NCDC), é possível obter os dados climáticos dos Estados Unidos para longos períodos, em arquivos compactados. Como os arquivos devem ser obtidos através do protocolo FTP (file transfer protocol), a biblioteca ftplib, do Python, viabiliza a automatização do download de arquivos para um ano específico, funcionando como um extrator de dados na forma bruta a partir do site. from ftplib import FTP ftp = FTP("ftp.ncdc.noaa.gov") ftp.login() ftp.cwd("pub/data/noaa/1901") files = ftp.nlst() for f in files: with open(f,"wb") as arqLocal: ftp.retrbinary("RETR "+f, arqLocal.write) ftp.quit() Os dados climáticos utilizam um formato próprio, em modo texto, com uma ocorrência por linha, configurados de forma posicional, podendo trazer dificuldades na fase de análise. Com base nas rotinas de manipulação de texto do Python, eles podem ser transformados em um formato de mais fácil tratamento, como o JSON (java script object notation). import gzip from os import listdir def transformar(linha): data = linha[15:23].decode("utf-8") hora = linha[23:27].decode("utf-8") temperatura = int(linha[87:92]) return "{\"data\":\""+data+"\", \"hora\":\""+hora+"\","+\ " \"temperatura:\":"+str(temperatura)+"}\n" def ler(nomeArquivo): saida = "[ " with gzip.open(arquivo,"rb") as fin: for linha in fin: if saida!="[ ": saida += ", " saida += transformar(linha) saida += "]" with open(nomeArquivo+".json", "w") as f: f.write(saida) arquivos = list(filter(lambda x: x.endswith(".gz"),listdir())) for arquivo in arquivos: ler(arquivo) Em seguida, os arquivos podem ser carregados no HDFS através do uso de subprocessos, com base nos comandos comuns de gerenciamento do sistema de arquivos, como a criação de diretório, com hdfs dfs -mkdir, e escrita de arquivo, através de hdfs dfs -put. A classe Popen, oferecida na biblioteca subprocess, inicia subprocessos, com execução em paralelo dos comandos para escrita no HDFS. Após a carga de um conjunto de arquivos, que podem ser descobertos através do método listdir, oferecido na biblioteca os, qualquer ferramenta que permita implementar os algoritmos de mapeamento e redução, como Java ou o próprio Python, pode ser utilizada, gerando os resultados via Hadoop. #!/usr/bin/python from subprocess import Popen from os import listdir def cria_dir(diretorio): dir = Popen(["hdfs","dfs","-mkdir",diretorio]) dir.wait() def move_arqs(arquivo, diretorio): Popen(["hdfs","dfs","-put",arquivo,diretorio]) cria_dir("dados1901JSON"); arquivos = list(filter(lambda x: x.endswith(".json"),listdir("./"))) for arquivo in arquivos: move_arqs(arquivo,"dados1901JSON") Como vimos, o ambiente do Python fornece todo o ferramental necessário para extrair, transformar e carregar os dados no HDFS, permitindo a automatização da fase de preparação de dados para o tratamento pelo Hadoop. Com diversos outros conectores, o Python poderia ser utilizado ainda para a obtenção e escrita em diferentes bases, além de ser uma boa opção para a implementação dos algoritmos de mapeamento e redução. Após a leitura do caso, é hora de aplicar seus conhecimentos! Vamos ligar esses pontos? 3. PARA EXECUTAR UM PROCESSO DE MAPEAMENTO E REDUÇÃO ATRAVÉS DO HADOOP, OS DADOS DEVEM SER CARREGADOS NO HDFS, UTILIZANDO O FORMATO CORRETO PARA A APLICAÇÃO DOS ALGORITMOS ESCOLHIDOS. COMO OS DADOS BRUTOS PODEM TER DIFERENTES FORMATOS E ORIGENS, ELES DEVEM SER TRATADOS SEGUNDO O FLUXO DENOMINADO ETL (EXTRACT, TRANSFORM AND LOAD). COMO O PYTHON PODE SER UTILIZADO NAS OPERAÇÕES DE ETL? RESPOSTA Na fase de extração, podemos abrir arquivos locais com o método open, além de obtê-los na rede com a utilização da biblioteca ftplib. Ainda nessa fase, os dados podem estar compactados, e a biblioteca gzip pode javascript:void(0) ser utilizada na descompactação. Com os dados carregados, eles podem ser transformados, utilizando os diversos métodos de tratamento da classe string, sendo armazenados em estruturas próprias, como dicionários e listas, seguido da escrita em arquivos com o formato necessário para o tratamento pelo Hadoop. Na fase final, ou carga, os arquivos gerados devem ser escritos no HDFS, com base nos comandos de linha necessários, através de subprocessos encapsulados em objetos do tipo Fopen. Ao final das operações de ETL efetuadas pelo Python, os dados ficam disponíveis no HDFS para tratamento pelo Hadoop. PRIMEIRAS PALAVRAS ETL é uma técnica que normatiza o processo de trabalho de movimentação e consolidação dos dados. Uma das características da revolução tecnológica vigente, além da ênfase na importância dos dados, é a sua enorme produção. Diversos sistemas, incluindo dispositivos IoT, podem gerar diariamente terabytes de informação que precisam ser armazenados. É comum haver diferentes repositórios, muitas vezes geograficamente separados. Então, para extrair sentido deles e atingir seus objetivos de negócios, as empresas vêm integrando seus sistemas, migrando e consolidando informação quase que rotineiramente. Em um mundo cada vez mais globalizado, é preciso que as buscas atravessem diferentes fontes – e isso requer muitas vezes que os dados sejam extraídos, transformados, consolidados e carregados em suas novas bases hospedeiras. Processo ETL. Há diversos motivadores que podem justificar a necessidade de mover e consolidar bases de dados. Os mais comuns são: Modernização dos sistemas legados. Fusões e aquisições. Adição de um sistema ou módulo novo. Migração para nuvem. Eliminar a necessidade de sincronização entre bases. Aumento da capacidade dos sistemas de armazenamento existentes. Necessidade de usar um repositório de dados único e centralizado para todo o ambiente sistêmico. As integrações entre ambientes diferentes podem requerer uma nova estrutura de dados. À primeira vista, pode parecer simples e corriqueira a tarefa de migrar dados. Entretanto, não é bem assim. As empresas costumam crescer e expandir por meio de silos, em que cada departamento, regional ou subsidiáriainstala e mantém seus próprios bancos de dados. Frequentemente, dentro de uma empresa – e até mesmo em nível departamental – encontram-se informações armazenadas em fontes de dados de diferentes fabricantes, tais como: ORACLE MYSQL POSTGRESQL SQL SERVER PLANILHAS EXCEL ARQUIVOS CSV javascript:void(0) CSV Comma-separated values, que, em português, significa valores separados por vírgula. Além disso, a conformação dos dados pode variar bastante. Cada organização costuma seguir as próprias normas e convenções na hora de fazer a modelagem e definir a quantidade de colunas, tipos, campos, partições, quantidade de instâncias ou de nomear as tabelas e as variáveis e de definir rótulos, referências, restrições, tamanhos e formatos. Subsidiárias localizadas em diferentes países comumente usam seus idiomas nativos para nomear as estruturas. Elas dão diferentes significados para o mesmo campo, criam diferentes partições e fragmentam os dados de acordo com suas necessidades específicas. É muito provável que o profissional responsável por trabalhar com ETL encontre um ambiente sistêmico multidatabase heterogêneo e baseado em schemas locais. Trabalhar nesse ambiente não costuma ser fácil e necessita de esforço de equipe. Trata-se de um trabalho laborioso que requer o entendimento completo e inequívoco da forma como os dados estão modelados. Para isso, é fundamental manter um contato estreito com os responsáveis pela gestão das bases legadas para evitar erros que possam ser catastróficos – sobretudo se existirem sistemas que precisam usam os dados para alimentar processos automáticos em larga escala. O ETL pode ser uma atividade de projeto necessária para suportar um novo sistema que precisa de dados legados consolidados, mas também pode se tratar de uma tarefa recorrente. Ou seja, as multinacionais atualmente possuem datacenters espalhados em diversos países e contam com diversas fontes de informação, como sistemas empresariais do tipo ERP, CRM, faturamento, orquestração e vendas, além de diversos portais e possivelmente dispositivos de Internet da Coisas (IoT) que produzem dados em diferentes formatos diariamente. Uma empresa global não pode mais se dar ao luxo de ter visões isoladas a respeito dos seus dados. O cruzamento e as visões consolidadas subsidiam cada vez mais as decisões estratégicas tomadas pelo C-Level da companhia. A ETL então desempenha um papel importante ao estabelecer procedimentos comuns que auxiliam engenheiros, profissionais de TI, analistas e cientistas de dados a migrar e consolidar repositórios de dados oriundos de um ambiente heterogêneo e complicado. É frequentemente um esforço de time que ainda envolve DBAs e profissionais de teste e qualidade, além de gestores, gerentes e diretores da empresa. DICA Empregar corretamente o ETL pode poupar muito esforço, tempo e dinheiro, fazendo a diferença entre um projeto de sucesso entregue rapidamente e outro que seja um fracasso retumbante. EXTRAÇÃO A fase de extração consiste em ter acesso a todas as fontes que vão fornecer os dados tanto para fins de integração quanto tão somente para a migração de em um novo sistema. Essas fontes podem ser das mais diversas, como, por exemplo, bancos de dados de diferentes fabricantes (Oracle, MySQL etc.), arquivos, planilhas, sistemas terceiros e equipamentos, como mainframes e hardwares que operam as próprias bases de dados. COMENTÁRIO Nessa etapa – e antes de começar efetivamente o trabalho de extração –, pressupõe-se que o time responsável tenha os acessos necessários a todas as fontes de dados do projeto, incluindo login, senhas e permissões de acesso. Muitas vezes, é preciso que a fonte de origem tenha uma interface que permita a retirada de dados em massa (bulk extraction). Supõe-se também que o time tenha o conhecimento sobre a modelagem utilizada, como tipos e convenções, e o domínio completo sobre o conteúdo dos registros originais e a qualidade deles. Além disso – e sempre que possível –, a equipe deve ter acesso ao diagrama de entidade-relacionamento das bases relacionais. javascript:void(0) javascript:void(0) DIAGRAMA DE ENTIDADE-RELACIONAMENTO O diagrama de entidade relacionamento é uma forma de representar visualmente as relações entre as entidades em um sistema: no caso do ETL, os banco de dados. Ele foi inicialmente proposto Peter Chen no final da década de 70 e o artigo original pode ser visto no link abaixo. Fonte: http://www.csc.lsu.edu/~chen/pdf/erd-5-pages.pdf É fundamental verificar as chaves tanto primárias quanto estrangeiras para garantir a integridade dos relacionamentos. Nesse momento, a equipe provavelmente vai se deparar com muitos problemas, como: DUPLICIDADE DE INFORMAÇÃO DADOS ERRADOS DADOS INCONSISTENTES DADOS AUSENTES ATENÇÃO Pode ser tentador consertar os dados na fonte antes de extraí-los, mas essa costuma ser uma estratégia errada. Isso porque provavelmente existem falhas nos processos automáticos e manuais que alimentam as bases originais e produzem registros corrompidos. Desse modo, não adianta apenas corrigi-los, porque o ambiente continuará gerando dados ruins. Seria preciso atacar as causas dos erros, o que pressupõe um trabalho de análise demorada e minuciosa. Além disso, não há nenhuma garantia de que a equipe consiga realizar os ajustes nem consertar os dados errados rapidamente antes que mais sejam javascript:void(0); gerados. Por isso, corrigir os dados costuma ser uma tarefa inútil, além de não fazer parte do escopo da ETL. A equipe, portanto, deve se preocupar em criar os meios para que a extração seja completa, representando fielmente os dados originais, mesmo que de baixa qualidade, a fim de ser tão rápida tanto quanto possível. A velocidade de extração costuma ser um fator extremamente importante na maioria dos projetos que envolvem ETL, afinal, muitas bases são vivas em ambientes produtivos, ou seja, recebem atualizações constantemente, em tempo real, suportando as operações da empresa. Então a equipe precisa mover os dados rapidamente para que o sistema antigo possa ser desligado com a menor defasagem possível. Normalmente, há janelas de manutenção muito curtas – na maioria das vezes, durante a madrugada ou em finais de semana. O novo sistema precisa passar por todas as verificações e testes após a migração dos dados para evitar a decisão de manter o sistema antigo (No Go). O ideal seria que a migração fosse instantânea; assim, não haveria discrepância entre a base legada e a nova. Contudo, mover grandes quantidades de dados toma tempo. Esse é o outro desafio da equipe técnica: agilidade. Há diversas ferramentas que ajudam a equipe técnica nessa tarefa, tais como: ADAPTADORES SISTEMAS SCRIPTS DE EXTRAÇÃO/CARGA DE DADOS O time precisa não somente configurá-los ou desenvolvê-los, mas também garantir que as ferramentas que os estejam usando sejam as mais eficientes possíveis para que o trabalho possa ser executado rapidamente sem derrubar a rede ou outros sistemas durante a janela de manutenção. Para isso, diversos ensaios e testes de desempenho (performance) precisam ser realizados. Outro erro frequente é tentar mover os dados diretamente para o seu destino. A melhor prática de ETL preconiza que se construa um espaço intermediário para acomodar os dados antes que eles sejam migrados definitivamente para o sistema final. Esse local é chamado de staging area. O staging area deve receber todos os registros brutos das diversas fontes de dados (provavelmente em schemas distintos), mas é importante que a base usada se assemelhe à base de destino que hospedará os dados definitivamente. Esse espaço intermediário se justifica para evitar que análises e outras operações sejam feitas nas fontes. Com isso, evita-se degradar o desempenho dos sistemas que as usam e tem-se um espaço para experimentações e validações livre de riscos. Ele ainda serve de insumo para o desenvolvimento dos scripts de extração. DICA Fazer backup dos dados é fundamentalcaso os registros na staging area sejam danificados. Finalmente, é preciso entender que o processo de extração será executado tantas vezes quantas forem necessárias até que a equipe tenha a segurança necessária para decretar qual será a extração final. A ETL, como um todo, é um processo cíclico e interativo em que, em cada passagem, a equipe aprimora e implementa novas melhorias no processo de extração dos dados. Quando ele está maduro o suficiente, é hora de começar a pensar a fase de transformação. EXTRAÇÃO Um especialista abordará neste vídeo o processo ETL de extração e as melhores práticas relacionadas. EXTRAÇÃO COM PYTHON Python é uma linguagem de programação de alto nível bastante usada para ETL. Relativamente fácil de aprender, ela suporta tipos de dados estruturados, que são muito convenientes para armazenar os registros durante o processo de extração. Todas as etapas podem ser modelas e construídas usando-se o código nativo Python com o apoio de bibliotecas. Particularmente para o processo de extração, ele suporta conexão com diversos tipos de bases de dados, como Oracle e MySQL, além de ler arquivos em formatos distintos, como CSV, XML, planilhas Excel e JSON. A biblioteca pandas é uma das mais usadas para leitura, exploração e manipulação de dados. Ela implementa muitos métodos de leitura. A seguir, conheceremos o básico de alguns métodos de leitura e os exemplos de código em Python para cada um deles. RECOMENDAÇÃO Para ter uma compreensão mais profunda ou saber sobre as técnicas avançadas utilizando os métodos de leitura, recomendamos a leitura da documentação do pacote de I/O da biblioteca pandas. READ_CSV Este método lê dados estruturados em formato CSV e os coloca em um tipo de dados denominado DataFrame. É preciso passar alguns parâmetros de entrada para o read_csv; entre eles, o caminho (path) ou URL do arquivo CSV e o cabeçalho, além de muitos outros. O Read_csv permite a seleção de um subconjunto de colunas (usecols) e a escolha do número exato de linhas que serão lidas (nrows). javascript:void(0); DICA Quando se tem uma massa de dados muito grande, é possível melhorar o desempenho ao desabilitar a autoinferência de tipo das colunas, uma vez que isso consome muito tempo. Para tanto, o desenvolvedor informa o tipo correto de cada coluna usando o parâmetro dtype. Veja a implementação do código em Python a seguir. import pandas as pd dfData = pd.read_csv(r"C:\PATH\etl.csv", nrows=500000) print(dfData.head()) dfData.describe() dfData.info() dfData.memory_usage() dfData.count() dfData.isnull() dfData.isna() Agora vamos analisar o código. O arquivo CSV é lido e carregado em um objeto do tipo DataFrame. Em seguida, os métodos são chamados. Cada um deles fornece uma informação diferente sobre os dados: HEAD() Mostra os primeiros registros. DESCRIBLE() Mostra uma tabela contendo estatísticas básicas. INFO() Mostra as informações sobre as colunas, como tipos e quantidade de registros. MEMORY_USAGE() Releva a quantidade de memória usada. COUNT() Conta os registros por coluna. RECOMENDAÇÃO Recomenda-se verificar outros métodos, como tail(), isnull() e isna(), que podem ajudar muito o profissional na hora de fazer verificações na massa de dados. READ_JSON O método read_json lê uma String no formato JSON e a transforma em um objeto que pode ser tanto um DataFrame como uma Series. O tipo de retorno é especificado no parâmetro type. Além disso, ele permite escolher o tipo de codificação (enconding), o tipo de compressão (compression) e a conversão de tipos de dados de maior precisão ao se decodificar o String para o tipo Double. import pandas as pd df = pd.read_json('dataETL.json') print(df.to_string()) READ_HTML Caso os dados estejam no formato de tabela HTML, o método read_html deve ser usado, porque é capaz de realizar o parser de acordo com os tags HTML. Ele recebe o path ou a URL do arquivo e diversos outros parâmetros opcionais. Dentre eles, vale ressaltar o skiprows, que permite saltar colunas e começar a ler a partir do ponto desejado. O método retorna um objeto do tipo DataFrame. import pandas as pd tables = pd.read_html('https://sites.google.com/view/cool-tools-for-schools/home/html-codes/tables') print('Quantidade de tabelas: {len(tables)}') READ_EXCEL Ele suporta praticamente todas as extensões de arquivos de planilhas Excel, como xls, xlsx e outros. Para ler o arquivo, é preciso passar o caminho (path) ou a URL. O método permite ler qualquer aba do arquivo, desde que ele esteja especificado como parâmetro (sheet_name) na chamada do método. Além disso, é possível ler diversas planilhas na mesma chamada, o que poupa tempo do programador ao evitar que se escreva um código para leitura recursiva. O método retorna um DataFrame ou um dicionário de DataFrames. import pandas as pd df = pd.read_excel('ETL.xlsx') print(df) READ_SQL Este método pode ser usado para acessar diversos tipos de bases de dados. Ele, na verdade, é um contenedor para diversas bibliotecas específicas para os bancos de dados, como, por exemplo, MySQL. A grande vantagem do read_sql é prover uma camada de abstração, criando um padrão de codificação: qualquer que seja o banco, o programador escreverá basicamente o mesmo código. Para usar o método, basta passar a query SQL e os demais parâmetros de conexão com o banco na chamada do método como parâmetro. O método retorna um DataFrame. import mysql.connector import pandas as pd dbConn = mysql.connector.connect( host="localhost", user="usuario", passwd="******", database="ETLDB " ) etlData = pd.read_sql("SELECT * FROM tableETL WHERE feat01=98103", dbConn) print(etlData) --------------------------------------- import pandas as pd from sqlalchemy import create_engine dbConn = create_engine("mysql+mysqldb://usrid:password@localhost/etldb") etlData = pd.read_sql("SELECT * FROM tableETL WHERE feat01='98103'", dbConn) print(etlData) ATENÇÃO Para usar o read-sql, é preciso ter instalado no ambiente de desenvolvimento o driver para o banco que se quer conectar e usar a biblioteca SQL Alchemy, que faz o mapeamento do código SQL para Python. READ_GBQ O comando read_gbq importa dados do Google BigQuery, que é um serviço presente na plataforma de nuvem do Google (PaaS) chamado de Google Cloud Plataform (GCP). Para usá-lo, é preciso primeiramente autenticar a plataforma para depois executar o código de chamada que passa a query. Há diversos parâmetros opcionais que podem ser passados à consulta – entre eles, o max_resuts, que define o número de linhas a serem retornadas pela busca. Além disso, é possível ativar uma barra de progresso por meio do parâmetro progress_bar_type, que vai mostrar o avanço do recebimento dos dados. O método retorna um DataFrame. import pandas as pd sql = “SELECT * FROM tableETL WHERE feat01='98103'” df = pd.read_gbq(sql, project_id=1234) Além dos métodos listados acimas, a biblioteca pandas fornece outros mais específicos, como: READ_SAS Faz leitura dos formatos XPORT/SAS7BDAT. READ_SPSS Faz leitura do formato SPSS. READ_ORC Faz leitura de objetos ORC. READ_HDF Faz leitura de arquivos HDF5. READ_STATA Faz leitura de arquivos Stata. RECOMENDAÇÃO Consulte a documentação da biblioteca pandas para um melhor entendimento das funções mencionadas. Ao longo deste documento, todas as referências foram a bases relacionais. Embora esse seja o caso mais comum, é sempre possível que algum dos bancos de dados de origem seja não relacional. Na verdade, parece ser esta a tendência: haver cada vez mais dados não estruturados ou semiestruturados. Diversos bancos de dados non-sql vêm se tornando populares, como é o caso das bases Cassandra, MongoDB, DynamoDB e Redis, entre outras. Caso o time precise importar dados de bases não relacionais, a linguagem Python também dá suporte. No caso do MongoDB, o time de integração pode usar a biblioteca nativa do fabricante chamada de PyMongo. Ela pode ser instalada usando-se o comando a seguir: pip installpymongo O funcionamento é bastante similar ao dos bancos relacionais. É preciso estabelecer uma conexão ao banco. Para isso, cria-se uma instância da classe MongoClient, que possui um pool de conexões nativo capaz de suportar centenas de conexões ao servidor. Daí é preciso passar o nome do host e a porta em que o servidor escuta os pedidos de conexão. Isso pode ser feito por meio do formato URL ou passando cada um como parâmetro. Uma vez que a conexão foi estabelecida, basta acessar a base desejada, criar os objetos do tipo document em Python e especificar as coleções que se deseja usar. Ao final do uso, só é preciso fechar a conexão. TRANSFORMAÇÃO Uma vez que os processos de extração estejam bem definidos, com os scripts de extração prontos e funcionando, é hora de começar a trabalhar a transformação dos dados. Essa etapa é bem específica de cada projeto, já que depende dos objetivos de negócios que a empresa quer alcançar com a iniciativa e da natureza dos dados. A transformação é a fase que exige mais código customizado e a que mais agrega valor ao projeto. Nesse momento, assume-se que os dados já foram carregados na staging área. A equipe precisa então construir e executar os scripts de validação e a transformação dos dados que estão em seu formato bruto. Uma das validações a ser feita é verificar se todos os dados previstos foram carregados. Além disso, o time precisa garantir que nenhum dado indesejado tenha sido migrado. Desse modo, pode-se iniciar o processo de limpeza e correção, tomando-se as devidas precauções para não danificar a massa de dados. O processo consiste em remover dados duplicados, verificar a integridade das chaves primárias (primary key) e estrangeiras (foreign key) e decidir o que fazer com registros incompletos, vazios e mal formatados. É preciso que o time faça uma análise minuciosa dos tipos de erros encontrados e elabore medidas para corrigi-los – se possível, automaticamente. Os principais tipos de erros encontrados são: Violações da integridade referencial. Dados soltos: ausência de relacionamento. Tipos de dados incorretos: tipos numéricos representados como string. Conflito entre estruturas de tipo. O mesmo objeto é representado de forma diferente em schemas distintos. Exemplo: em um schema, ele é modelado como atributo; em outro, como uma entidade. Valores fora da escala permitida, como, por exemplo, idades de três dígitos. Dados inconsistentes, como datas de nascimento muito antigas. Erros de grafia de termos e nomes. Problemas de nomeação envolvendo prefixos, abreviações, parônimos e homônimos (por exemplo: mandado X mandato). Entidades diferentes com o mesmo nome ou sinônimos. Campos com múltiplas referências, como Kg, Kilo ou Quilo. Campos de preenchimento obrigatório que se encontram vazios. Conflitos de modelagem: quando uma relação é modelada de modo diferente em schemas distintos. Conflito entre chaves: chaves primárias distintas estão disponíveis em schemas diferentes considerando-se o mesmo objeto. Problemas na codificação usada (character encoding): dados podem usar diferentes padrões, como, por exemplo, UTF-8, UTF-16, UTF-32 e ASCII. É durante a fase de transformação que o time tem a oportunidade de padronizar os dados. Isso traz ganhos reais para processos de automação que venham a ser implementados futuramente. Com os dados limpos, organizados e padronizados, a equipe pode começar a pensar na consolidação que precisa ser feita para integrá-los. A fase que antecede a execução da integração se chama de pré-integração. Nela, é preciso estabelecer as regras e resolver os problemas antes que a integração propriamente dita seja executada. Para isso, deve-se identificar e resolver todos os conflitos estruturais de nomeação de registros e rótulos. Além disso, é necessário definir quais chaves primárias e estrangeiras serão mantidas e quais serão descartadas. Com isso, o integrador consegue determinar as dependências implícitas. É preciso fazer também um mapeamento dos campos, definindo as regras de transformação. Por exemplo, valores de temperaturas podem estar em unidades de medidas diferentes. No caso de o integrador definir a escala Celsius como padrão, todos os valores em Fahrenheit deverão ser transformados. Finalmente, é bastante comum que o ambiente sistêmico seja heterogêneo, e isso implica diferentes modelagens aplicadas muitas vezes em dados semelhantes. É importante que um De-Para seja definido para garantir uma única modelagem ao final do processo de extração. Espera-se que todos os schemas sejam consolidados em um único para criar o melhor schema integrador. TRANSFORMAÇÃO Um especialista falará neste vídeo sobre o processo ETL de transformação e melhores práticas relacionadas. CARGA A carga é o último passo do processo de ETL. Essa etapa envolve a movimentação de grandes volumes de dados desde a staging area para a base de dados definitiva (data warehouse) depois de eles terem sido devidamente tratados e transformados. A carga precisa acontecer em um curto período – normalmente, dentro da janela de manutenção disponibilizada pelo departamento de TI da empresa. Aqui a equipe encarregada precisa ter atenção com o desempenho dos scripts ou das ferramentas usadas para mover os dados rápida e eficientemente. Um processo de ETL que extraia, transforme e carregue os dados em um tempo superior à janela disponibilizada significa o fracasso do projeto. O time deve empreender todos os esforços para construir um código ou customizar ferramentas que operem os dados da forma mais eficiente possível. Uma abordagem é otimizar os scripts e as ferramentas de acordo com o contexto do projeto. Uma especial atenção deve ser dada ao consumo de banda de rede e ao de memória, uma vez que normalmente os processos de ETL são intensos nessas duas dimensões e menos críticos em uso de capacidade de processamento. Se possível, o departamento de TI deve ajudar fornecendo meios extras para que a transmissão dos dados seja mais rápida, como, por exemplo, disponibilizando recursos adicionais de rede para tanto. Além disso, é preciso considerar que o processo possa sofrer uma interrupção inesperada durante a carga. Caso isso aconteça, o time tem de ser capaz tanto de voltar os sistemas envolvidos ao estado em que se encontravam antes do início da carga (rollback) quanto de continuar o processo de ETL do ponto em que houve a falha (resume), sem haver, portanto, a necessidade de começar tudo novamente. ATENÇÃO As operações de rollback e resume devem manter a integridade dos dados e dos sistemas envolvidos para que sejam consideradas efetivas. A carga também pode ser realizada de formas diferentes. Em um projeto chamado de green field, é bem provável que o sistema destinatário esteja vazio e que ela precise ser completa. Todas as tabelas precisam ser populadas. Também é possível fazer uma carga mínima inicial e posteriormente realizar cargas incrementais para completar os dados, adicionando-se mais registros às tabelas. Entretanto, o mais comum é ter de apagar as tabelas de destino e carregar novamente tudo sempre que houver uma atualização das bases originais. Após os dados terem sido carregados, a equipe precisa rapidamente executar uma série de validações e verificações para garantir que a operação do sistema novo ocorra normalmente. Isso porque mesmo o melhor dos sistemas não valida todas as possíveis falhas estruturais nos dados que possam existir. Dados errados, inconsistentes e com falhas de integridade podem degradar o desempenho do sistema e derrubá-lo. Esse é um momento crítico em que todo o esforço coletivo realizado anteriormente será posto à prova. A liderança técnica do projeto deve monitorar a carga e o desempenho dos sistemas afetados a cada instante e estar apta a comandar um no go seguido de um rollback ou comandar um resume a qualquer momento. O planejamento precisa ser minucioso, enquanto os indicadores devem ser escolhidos para suportar os tomadoresde decisão. É importante também definir pontos de não retorno nos quais, se ultrapassados, a carga deve ir até o fim para evitar gerar lixo ou dados inconsistentes. A execução da carga depende do banco no qual os dados finalmente serão armazenados. O processo é quase o inverso daquele referente à extração: Extração Costuma ser de N fontes para 1 staging área. Carga O processo lê a staging area e escreve no banco de dados de destino. DICA Python costuma ser a linguagem de programação usada para tal finalidade, mas Java também funciona. CARGA Um especialista comentará neste vídeo sobre o processo ETL de carga e as melhores práticas relacionadas. Vamos conhecer agora os métodos e as bibliotecas em Python usados no processo de carga. PYMYSQL A biblioteca PyMySQL permite acesso ao banco de dados MySQL. Ela é leve, simples e fácil de usar. É preciso tê-la instalada no ambiente de desenvolvimento e importá-la no código-fonte Python (import mymysql). O programador precisa abrir uma conexão usando parâmetros de conexão necessários: usuário, senha, host e database (db). Veja o código a seguir: pimport pymysql conn = pymysql.connect(host='localhost', user=usuario, password='123', db='ETLDB') cursor = connection.cursor() sql = "INSERT INTO ‘tableETL (‘feat01, ‘feat02) VALUES (%s, %s)" cursor.execute(sql, (98101, 480070688)) conn.commit() conn.close() Uma vez que a conexão tenha sido aberta, um objeto do tipo cursor permite que queries simples sejam executadas. Obviamente, a biblioteca PyMySQL também pode ser usada para extrair dados de um banco MySQL: basta que a query passada seja um SELECT em vez de um INSERT. O objeto cursor então recebe a declaração da query SQL por meio do método execute para inserir os dados no banco. O passo final é fazer o commit no banco para que as inserções tenham efeito. A conexão criada pode ser usada muitas vezes até que o programador decida que deve fechá-la, chamando o método close da classe connection. DICA Além do INSERT, o desenvolvedor também pode construir a query baseado no comando UPDATE, que atualiza os dados passados, sendo mais leve e consumindo menos tempo de processamento. TO_SQL Outra maneira de inserir registros em banco de dados é usando o método to_sql da classe DataFrame (biblioteca pandas). O uso é análogo ao do read_sql visto anteriormente. É preciso usar a biblioteca SQLAlchemy, que encapsula o driver do banco a ser usado. Daí abre-se a conexão com o banco usando o método create_engine e chama-se diretamente a função to_sql, passando o nome da tabela e outros parâmetros de conexão. Observe que o DataFrame precisa ter a mesma estrutura da tabela do destino dos dados. import pandas as pd from sqlalchemy import create_engine engine = create_engine( "mysql+pymysql://{user}:{pw}@localhost/{db}".format(user="usuario", pw="123", db="ETLDB")) df.to_sql('ETL', con=engine, if_exists='append', chunksize= 2000) ATENÇÃO É importante lembrar que esse método pode ser usado com qualquer banco de dados desde que o driver esteja instalado e seja suportado pela SQLAlchemy. CX_ORACLE Caso o destino da carga de dados seja um banco de dados Oracle, a equipe de integração pode usar a biblioteca cx_oracle. Ela possibilita conexão com diversas versões de banco, como 9.2, 10, 11, 12 e 21. Recomenda-se verificar a compatibilidade na documentação da Oracle antes desenvolver o script. Trata- se de um projeto de código aberto mantido pela empresa sobre o licenciamento BSD. import cx_Oracle import os conn = cx_Oracle.connect(string_de_conexao) cursor = conn.cursor() registro = [(98101, 480070688)] cursor.setinputsizes(int, 20, int, 100) cursor.execute("insert into ETLTABLE(feat01, feat02) values (:1, :2)", registro) conn.commit() cursor.close() Um dos pontos fortes dessa biblioteca é o suporte nativo ao gerenciamento de transação. A classe connection implementa a função rollback, a qual, quando chamada, desfaz a transação pendente. No caso de a conexão com o banco ser fechada antes do commit, a transação também será desfeita automaticamente (rollback automático). Além disso, a biblioteca implementa algumas otimizações de desempenho. Veja alguns exemplos: ROW PREFECHING javascript:void(0) O row prefeching implementa técnicas de buffering que reduzem a quantidade de requisições e respostas entre o cliente e o banco. EXECUTEMANY O método da classe Cursor denominado executemany é mais eficiente para inserir múltiplas linhas no banco do que criar um laço e iterar usando o Cursos.execute(). ORACLE SESSION DATA UNIT No caso de a massa de dados ser muito grande e/ou de a rede ser muito lenta, é possível configurar o tamanho do pacote que será enviado pela rede por intermédio da Oracle Session Data Unit (SDU). Utilizar a biblioteca cx_oracle corretamente pode fazer a diferença em uma janela de manutenção muito curta. PSYCOPG/PSYCOPG2 Psycopg é um adaptador Python para o banco de dados PostgreSQL. Ele é disponibilizado sob a licença GNU Lesser General Public Licence e permite o uso tanto em programas livres como em proprietários. Simples e de fácil uso, essa biblioteca dá suporte ao multiprocessamento (multi-thread), sendo indicada para aplicações que precisam executar operações de inserção e update concorrentes. O funcionamento é semelhante ao das outras bibliotecas descritas. Primeiramente, é preciso abrir uma conexão passando as credenciais (usuário e senha). O objeto criado na conexão retorna um cursor, que é usado para executar queries simples e complexas por meio do método execute. Após isso, basta executar o commit e, ao final do uso, fechar a conexão com o banco. import psycopg2 conn = psycopg2.connect("dbname=ETLDB user=postgres") cursor = conn.cursor() cur.execute("INSERT INTO ETLTABLE (feat01, feat02) VALUES (%s, %s)", (“98101”, “480070688” conn.commit() cursor.close() conn.close() VERIFICANDO O APRENDIZADO javascript:void(0) javascript:void(0) MÓDULO 2 Identificar as ferramentas para ETL e os casos de uso LIGANDO OS PONTOS O ambiente do Python fornece ferramentas muito interessantes para ETL. Podemos testar essas ferramentas a partir de bases globais? Dois frameworks de utilização simples e muito versáteis são o bonobo e o bubbles, ambos voltados para o processamento de dados, sendo plenamente aplicáveis para as tarefas de extração, transformação e carga de dados. No entanto, para compreendê-los precisamos de uma base de dados aberta e com volume adequado, como a Iris Dataset, que é utilizada nos exemplos de diversas ferramentas para mineração de dados, sendo fornecida no formato CSV, e contando com informações acerca de diferentes tipos de flores de íris. Analisando inicialmente o bonobo, sua utilização é baseada em um grafo de execução, no qual cada nó representa alguma ação sobre um fluxo de entrada, transformando ou filtrando os dados para o nó seguinte. No caso do Iris Dataset, seria necessário que o nó inicial utilizasse um leitor de arquivos CSV, seguido de filtragens e transformações, e finalizando com um nó para persistência, que poderia, por exemplo, persistir os dados transformados na forma de um arquivo JSON (java script object notation). Diversos módulos são incluídos no bonobo, começando pelo gestor de fluxo (Graph), que irá organizar a sequência de nós do grafo, permitindo até mesmo a construção de caminhos de execução paralelos. Além disso, os nós do grafo podem contar com vários adaptadores para leitura e escrita, como CsvReader e JsonWriter, adaptador para filtragem de dados (Filter), e integração simples de funções de transformação personalizadas. import bonobo from bonobo.config import use_raw_input @use_raw_input def getLinha(row): return {"id":row.Id, "largura":row.PetalWidthCm, "comprimento":row.PetalLengthCm } def get_graph(): return bonobo.Graph( bonobo.CsvReader("Iris.csv"), getLinha, bonobo.JsonWriter("Iris.petalas.json") ) bonobo.run(get_graph()) Com relação aobubbles, ele trabalha segundo o padrão arquitetural pipe and filter, tendo a classe Pipeline como gestor de execução. Após instanciar o gestor, métodos para leitura, transformação e carga dos dados devem ser chamadas em sequência, com a saída de cada chamada sendo direcionada para a seguinte. Ao trabalhar com bubbles, é necessário instalar o pacote SQL Alchemy, para mapeamento objeto- relacional e inclusão de instruções SQL como métodos do Python. Entre os recursos disponibilizados estão a agregação de registros, filtragem de campos, operações de junção, além de muitos outros, e os dados podem ser obtidos via rede pelo leitor de CSV. import bubbles URLBASE = "https://raw.github.com/Stiivi/cubes/master" URL = URLBASE + "/examples/hello_world/data.csv" p = bubbles.Pipeline() p.source(bubbles.data_object("csv_source", URL, infer_fields=True)) p.aggregate("Category", "Amount (US$, Millions)") p.pretty_print() Utilizando um dos frameworks descritos, as operações de ETL são executadas dentro de um fluxo bem organizado, tendo como base sequências de recursos plugáveis, preparados para lidar com diversos tipos de fontes de dados, incluindo CSV e JSON. Essas características irão permitir explorar bases de teste globais, e comparar os resultados com outras ferramentas de mineração de dados, como o Orange Data Mining. Após a leitura do caso, é hora de aplicar seus conhecimentos! Vamos ligar esses pontos? 3. APESAR DO PYTHON OFERECER TODOS OS RECURSOS NECESSÁRIOS PARA EFETUAR OPERAÇÕES DE ETL DE FORMA NATIVA, OU COM BASE EM BIBLIOTECAS SIMPLES, COMO FTPLIB E GZIP, O ESFORÇO DE PROGRAMAÇÃO PODE SER ALTO E DESNECESSÁRIO, JÁ QUE PODEMOS CONTAR COM FRAMEWORKS COMO O BONOBO E O BUBBLES. EXPLIQUE COMO ESSES FRAMEWORKS PODEM SIMPLIFICAR A IMPLEMENTAÇÃO DE OPERAÇÕES RELACIONADAS À EXTRAÇÃO, TRANSFORMAÇÃO E CARGA DE DADOS. RESPOSTA Tanto o bonobo quanto o bubbles permitem gerenciar o fluxo de execução das operações de ETL, com a utilização de elementos plugáveis para as tarefas de extração, transformação e carga. Quando utilizamos o bonobo, temos como base um objeto do tipo Graph, que recebe a sequência de elementos para execução, como CsvReader, para a leitura dos dados (extração), função personalizada para transformação, e escrita através do conector JsonWriter. Já o bubbles, inicia uma linha de execução em um objeto Pipeline, seguido de chamadas a operações de leitura (source), diversos métodos de transformação, como aggregate, e escrita via target. Com isso, os frameworks implementam as operações mais comuns, como extração e gravação de arquivos em formatos conhecidos, evitando que o programador perca tempo com a implementação delas. PRIMEIRAS PALAVRAS Escrever os scripts de extração toma tempo e requer experiência na linguagem que será utilizada – normalmente, a Python. Alternativamente, a equipe de integração pode optar por ferramentas de prateleira para minimizar ou eliminar o esforço de programação, usando-as para extrair, limpar e transformar os dados antes que eles sejam carregados em um data warehouse. Existem diversas ferramentas para esse propósito. Conheceremos algumas delas a seguir. BONOBO javascript:void(0) Framework baseado em Python específico para ETL, o bonobo simplifica o desenvolvimento de código. Ele é relativamente fácil de aprender e usar, permitindo o acompanhamento do fluxo de trabalho na forma de grafos. O bonobo é instalado da mesma maneira que uma biblioteca Java, podendo-se usar o comando pip install bonobo. A ferramenta não contém funções estatísticas ou de análise de dados. Ela é indicada apenas para o trabalho específico de ETL: EXTRAIR TRANSFORMAR CARREGAR O RESULTADO FINAL EM ALGUMA BASE DE DADOS O trabalho começa com a criação de Jobs ETL com entradas (in) e saídas (out). Um job pode conter o fluxo de processo inteiro: extração, transformação e a carga. Esta, ao contrário das outras, tem apenas entrada (in) de dados. As transformações são como funções que modificam os dados; quando organizadas em uma sequência direcional do fluxo da transformação, elas são representadas por um grafo. O usuário pode gerar uma figura contendo o grafo que representa a sequência de transformações construídas para ter uma referência visual do processo. VOCÊ SABIA De fato, o bonobo reduz bastante a necessidade de se criar um código, mas não completamente: as transformações são todas construídas programaticamente. Além disso, ter noções de lógica e desenvolvimento de código é fundamental. Ele é nativamente integrável com Django, Docker e Jupyter e a biblioteca do MIT. Chamada de SQLAlchemy, essa biblioteca é usada pelo pandas para encapsular drivers de conexão com banco de dados. BUBBLES O Bubbles é uma ferramenta para ETL baseada em metadados, os quais, por sua vez, são usados para descrever o processo fim a fim em um gráfico. Cada operação é modelada como um nó que recebe diferentes parâmetros de entrada e retorna o resultado da operação. A ferramenta foi desenhada para trabalhar de forma agnóstica. Isto é, o profissional precisa apenas se preocupar com a forma na qual os dados são processados para ter o resultado desejado. A unidade de trabalho é o data object, que é uma representação do tipo da fonte de dados usada: CSV, MongoDB, PostgresSQL etc. O analista vai manipulando os data objects de acordo com o fluxo de trabalho e usa operações. O esforço de programação é mínimo ou quase inexistente. Os casos de uso recomendados pelo fabricante são: INTEGRAÇÃO DE DADOS MONITORAMENTO DE DADOS AUDITORIA DE DADOS INSPEÇÃO DE DADOS LIMPEZA DE DADOS A instalação é muito simples: pode-se usar o comando pip ou baixar o código-fonte diretamente do repositório github e compilá-lo. A ferramenta implementa as dependências externas como serviços. Dessa forma, conexões com bases de dados, sistemas de arquivos ou outras fontes de informação são modeladas como serviços que serão usados pelas transformações, o que deixa o código modular e de fácil manutenção. VOCÊ SABIA O Bubbles é distribuído sob a licença do MIT, sendo necessário apenas informar o copyright no caso de ele ser incorporado à outra aplicação. ORACLE DATA INTEGRATOR A Oracle, fabricante de diversos sistemas e do famoso banco de dados de mesmo nome, disponibiliza uma ferramenta chamada de Oracle Data Integrador (ODI). Entretanto, sua filosofia de uso é diferente. O fabricante indica a realização de um processo levemente diferente. Chamado de ELT, ele inverte um pouco as etapas do processo. Com isso, carregam-se os dados extraídos das fontes diretamente em um staging area da base de destino. A última etapa consiste em realizar a limpeza e a transformação dos dados após a carga. FERRAMENTAS ETL Um especialista destacará neste vídeo as vantagens das ferramentas de suporte ao processo ETL, bem como seus aspectos práticos, como a preparação de um documento técnico. CASO DE USO Munidos da teoria explicadas nas seções anteriores, veremos agora um caso de uso baseado em uma situação real. ALFA TELCO: MODERNIZAÇÃO DA OPERAÇÃO Vamos começar entendendo o panorama geral da empresa e o problema apresentado: A empresa Alfa Telco é uma grande operadora de telecomunicações localizada em um país da América Latina que contém subsidiárias em cinco outros países na mesma região. Ela vem enfrentando dificuldades para implementar novos produtos e serviços em formato de combo, pois os sistemas que suportam a operação são antigos e quase nenhum deles permite a automação. Além disso, o tempo de verificações de falhas de rede subiu enormemente, o que reduziu a níveis críticos o índice de satisfação dos clientes. Uma consultoria independente contratada verificou que os maiores ofensores são os dados das redes utilizadas para ativar os novos combos de serviços que se encontram fragmentados entre diversos bancos de dados diferentes. Essa situação se originou no crescimento da empresa que ocorreu por silos verticais, em que cada departamento determina eopera suas estratégias de negócios sem levar em conta as outras áreas de negócios e sem seguir uma padronização para a modelagem dos dados. Como parte da estratégia de modernização dos sistemas de suporte à operação (OSS), a empresa precisa migrar e consolidar os dados dos nós de acesso para o novo sistema de inventário de última geração adquirido de um fabricante europeu. Inicialmente, o projeto será realizado na subsidiária colombiana. Se tiver sucesso, ele deverá ser realizado em todas as outras subsidiárias, porém respeitando a cultura local de cada companhia. O trabalho, portanto, consiste em mover alguns dados da plataforma que agrega as informações de milhares de nós de acesso para o novo sistema centralizado, o qual, por sua vez, usa uma base de dados Oracle. Para resolver o problema, a companhia contratou uma empresa integradora para realizar a tarefa: a Beta Int. AGORA QUE ENTENDEMOS O PROBLEMA, VEREMOS A SOLUÇÃO APRESENTADA PELA EMPRESA INTEGRADORA CONTRATADA. A Beta Int. colocou seus analistas e arquitetos fisicamente dentro do escritório do cliente em contato com profissionais dos departamentos de TI, redes e engenharia. O pessoal de redes e de engenharia conhece bem a realidade dos sistemas e das modelagens empregadas e será de grande valia na hora de entender os dados e sua criticidade. Por outro lado, o pessoal de TI é dono dos sistemas e pode dar as permissões necessárias para o acesso aos bancos, bem como ajudar a minimizar os tempos de transferência de dados, alocando mais banda ou definindo horários para a carga massiva. Além disso, as VPNs eventualmente precisam ser usadas ou firewalls têm de ser desviados para prover acesso a pessoal externo ou permitir transferências de dados entre redes internas. É responsabilidade do grupo de segurança do departamento de TI prover acessos de maior nível e aprovar qualquer eventual requerimento especial de acesso. Um projeto desse tipo costuma ser dividido em macrofases, como, por exemplo: FASE DE ANÁLISE O trabalho começa com o time de analistas escrevendo a especificação técnica da migração de dados na fase de análise. O documento é escrito por várias mãos e precisa estar pronto antes do início da fase de desenvolvimento, já que ele vai orientar o trabalho dos programadores. Ainda dentro da fase de análise, todas as fontes passam por um escrutínio. Os técnicos fazem uma revisão da documentação existente (até para verificar se as fontes são suficientes), solicitam permissões de acesso e levantam todos os dados necessários para o projeto. FASE DE DESENVOLVIMENTO Durante a fase de desenvolvimento, os programadores recebem todos os requisitos dos analistas funcionais e iniciam a confecção dos scripts ou as customizações necessárias. Devem ser feitos tantos ensaios quanto necessários: os chamados dry runs. Ajustes de desempenho também precisam ser realizados para garantir que o período de execução do código caiba na janela de tempo disponível, bem como as devidas verificações: integridade referencial, estrutura, unicidade, análise de redundância, dependências etc. Os dados também são combinados, limpos e filtrados de acordo com as regras de negócios, enquanto as duplicatas são eliminadas. O time de desenvolvimento produz relatórios de pré-carga contendo os resultados dos ensaios realizados, inclusive os erros encontrados e corrigidos, os problemas enfrentados, os riscos e seus mitigadores. É preciso estabelecer e acordar com o cliente os indicadores de qualidade que serão usados como parâmetro para a carga real. O artefato final da fase de desenvolvimento é um acordo assinado entre o cliente e a empresa integradora (business agreement) contendo o roteiro, os scripts e os parâmetros para a carga real que será feita com dados reais de produção. FASE DE TESTES É possível e muitas vezes recomendado que uma equipe diferente daquela que desenvolveu os códigos de migração faça os testes para evitar enviesamento. Para isso, uma fase adicional de testes é criada, enquanto o cliente observa atentamente os resultados. O objetivo da fase de testes é produzir um parecer independente sobre a qualidade do trabalho de desenvolvimento e gerar métricas de qualidade. FASE DE PRODUÇÃO Uma vez tendo a aprovação do time de teste e qualidade, é chegado o momento da entrada em produção. A execução final tem de ser feita com acompanhamento do cliente. Validações e verificações adicionais devem ser feitas após a carga final para decidir se executam rollback ou não. O projeto termina quando a empresa integradora recebe o aceite do cliente e passa a operar o sistema novo. SAIBA MAIS É possível que um projeto possua um detalhamento maior envolvendo outras etapas: análise, planejamento, extração, limpeza, carga e verificação. Em 12 meses, após a assinatura do contrato, a empresa Beta Int. migrou dados de 17 tipos diferentes de gestores de redes que usavam bases distintas, algumas proprietárias e outras comerciais. Porém alguns sistemas não davam suporte à extração massiva, e foi preciso improvisar. Esses gestores foram configurados para gerar diariamente arquivos de sistema contendo as informações de inventário atualizadas em uma pasta visível para um servidor FTP. Essa pasta movia os arquivos para outro servidor durante a madrugada. Convertidos para o formato CSV, tais arquivos, em seguida, eram carregados na staging area. Os dados então foram limpos, consolidados, transformados e encaixados no schema da base Oracle usada pelo sistema comprado. DOCUMENTO TÉCNICO PARA MIGRAÇÃO DE DADOS COM ETL A especificação técnica e funcional sobre o trabalho de migração de dados é o documento que baliza e norteia o esforço de vários profissionais ao longo das diversas fases do projeto. Ele leva em conta as técnicas da ETL, como melhor prática, sendo, portanto, extremamente importante. Clareza, detalhamento, concisão e rigor técnico são atributos necessários que o artefato precisa ter para garantir que todos os envolvidos no projeto o entendam e possam segui-lo sem dúvidas de interpretação. Normalmente, ele é escrito em inglês mesmo em projetos no Brasil ou em países na América Latina, porque os times podem incluir fornecedores ou pessoal técnico estrangeiro. Portanto, o inglês é o idioma técnico universal usado para confeccioná-lo. Não existe um formato rígido para o documento, mas algumas seções são importantes e precisam estar contidas. Algumas são únicas, como as seções escopo, fora do escopo, validade, datas, requerimentos não funcionais e segurança e premissas, embora as outras precisem ser repetidas para cada fonte de dados/sistema que seja parte do escopo de trabalho. Além disso, pode haver a necessidade de se adicionar seções diferentes e específicas. Não há problema nesses casos, mas verifique se a ideia já não está contida em alguma seção antes de adicioná-la. Agora observaremos algumas dessas seções: ESCOPO A seção escopo resume os limites do acordo de trabalho realizado entre o cliente e a empresa integradora. Todas as referências do trabalho são listadas nesta seção, como, por exemplo, sistemas, fontes de dados, interfaces e casos de negócios. É preciso ser minucioso para evitar divergências no futuro. FORA DO ESCOPO A seção fora do escopo lista os itens que não serão considerados durante a execução do trabalho. Ela é importante porque pessoas e departamentos diferentes podem ter entendimentos distintos sobre o mesmo tema, tecnologia ou sistema. Por exemplo, no caso de uso anterior, todos os links físicos e lógicos existentes na base legada estão fora do escopo da migração. REQUERIMENTOS NÃO FUNCIONAIS E PARÂMETROS DE DESEMPENHO Todos os parâmetros não funcionais, bem como aqueles relacionados ao desempenho e à qualidade precisam estar listados e descritos nesta seção. Exemplos: tempos máximos para os processos de ETL, tempo das janelas de manutenção, quantidade de erros máximo permitido, tempos de time out, arquivamento, auditoria etc. SEGURANÇA Similarà seção anterior, todos os parâmetros e critérios de segurança, principalmente aqueles relacionados à privacidade dos dados, devem estar listados e descritos, como, por exemplo, autenticação, autorização e criptografia. PREMISSAS Nesta seção, precisam estar listadas as premissas feitas ou informadas ao time de integração, principalmente aquelas que embasam as decisões técnicas. VALIDADE DO DOCUMENTO O dia a dia operacional de uma empresa é muito dinâmico. Sistemas são modificados e bases de dados são atualizadas diariamente. É importante determinar um prazo de validade, o qual, quando ultrapassado, indica a necessidade de atualização do documento. Quando ele estiver pronto, será necessário haver uma certa urgência em revisá-lo e aprová-lo. DATAS (CRONOGRAMA) É preciso anexar o cronograma aprovado do projeto. Assim, o documento fica contextualizado nas fases e nos momentos do projeto. PADRÕES E MELHORES PRÁTICAS É conveniente referenciar os guias de padrões e as melhores práticas que serão seguidos durante a execução do projeto. Isso normaliza jargões e expressões técnicas e ajuda a audiência não técnica, como, por exemplo, gestores e gerentes, a ter uma compreensão melhor da parte técnica e entender o motivador das decisões técnicas. Podem ser referenciados tanto as melhores práticas da indústria quanto os guias fornecidos por fabricantes e fornecedores de tecnologia. O ETL deve ser citado nesse momento. DESCRIÇÃO FUNCIONAL Nesta seção, o sistema ou a fonte de dados precisa ser brevemente explicado do ponto de vista funcional. É importante também que a descrição seja agnóstica. Por exemplo: o autor precisa descrever o perfil dos dados contidos, a regularidade em que ele é atualizado, os sistemas dependentes dessas informações e proprietários, entre outros itens, sem sugerir soluções técnicas nem ter um viés voltado para determinada plataforma ou tecnologia. REQUERIMENTOS TÉCNICOS Aqui são listadas todas as características técnicas da fonte de dados e as soluções técnicas dadas para cumprir o processo de ETL. Por exemplo: uma das fontes de dados do projeto pode ser a coleção de arquivos no formato CSV gerados diária e automaticamente por um dos sistemas gestores de elementos de rede. Nesse caso, é preciso explicar o formato dos arquivos, o encoding usado, o padrão de nomeação, o tamanho médio e a localização desses arquivos, assim como a maneira com que os dados serão lidos, exportados, tratados, convertidos etc. Havendo sistemas extras, como servidores de FTP necessários para copiar os dados, estes também precisam ser mencionados aqui. Mapas e diagramas são bem-vindos para situar o leitor. DESCRIÇÃO DOS PROCESSOS Nesta seção, é fornecida a visão macro do processo usado para extrair, transformar ou carregar os dados. Nela, uma breve descrição do fluxo que será seguido, além de um diagrama de sequência, costuma ser necessária para orientar a audiência. Por exemplo, no caso de uso anterior, a equipe de migração utilizou uma ferramenta proprietária para extrair os dados de gestores de rede e armazená-los em um formato intermediário em um servidor de FTP, que foi posteriormente modificado para ser carregado na staging area. A descrição do processo precisa inclusive mencionar o processo de limpeza do diretório e purgar os arquivos já carregados e não mais necessários. Basicamente, o processo de ETL é descrito nessa parte do documento. ESTRUTURA DE DADOS É preciso explicar em detalhes as estruturas de dadas da fonte de origem. Uma tabela ou lista com tipos, nomes, descrição e outras características, como, por exemplo, se é mandatório ou opcional, para cada tipo de registro e com uma breve explicação costuma ser suficiente. MENSAGERIA Os protocolos para a movimentação dos dados precisam ser mencionados. Por exemplo: o SFTP é usado para a transferência unidirecional do sistema X para o sistema de arquivos Y para ler, carregar e apagar os arquivos. VALIDAÇÕES Todas as regras funcionais de validação dos dados precisam ser listadas e explicadas nesta seção, como validações de tipo, regras de nomeação, domínio, valores permitidos e um exemplo. Pensemos neste exemplo para ilustrar o caso: o formato dos nomes para uma classe de objetos manda que eles sejam compostos por quatro partes, sendo a primeira de dois dígitos, de 0 a 9; a segunda de dois a cinco dígitos, de 0 a 9; a terceira composta por seis dígitos, também de 0 a 9; e a quarta parte formada por três letras do alfabeto americano, que inclui Y e W. GERENCIAMENTO E TRATAMENTO DE ERRO A equipe técnica precisa explicitar se haverá tratamento de erro automático ou se eles serão tratados manualmente. Ela deve informar ainda quais medidas serão tomadas, bem como quais tipos de erros são mais comuns. VERIFICANDO O APRENDIZADO CONCLUSÃO CONSIDERAÇÕES FINAIS À medida que os dados ganham cada vez mais importância no contexto empresarial, principalmente como fonte de receita, cresce a preocupação em mantê-los consistentes e utilizáveis. Extrair sentido e valor de grandes massas de dados tem sido o desafio e a maior preocupação de grandes corporações. Em paralelo, mudanças advindas da transformação digital, da modernização de sistemas e da necessidade de se mover o ambiente sistêmico para a nuvem fizeram com que os processos de ETL ganhassem nova relevância. Ao estudar este conteúdo, você compreendeu a necessidade de colocar suas habilidades de programação em prática em um contexto de migração de dados usando o ETL. O caso de uso e o roteiro para a criação do documento técnico de migração baseado em ETL ajudarão você a substanciar o aprendizado e lhe darão um vislumbre das melhores práticas empregadas pela indústria. PODCAST Neste podcast, abordaremos o conceito das fases de ETL. AVALIAÇÃO DO TEMA: REFERÊNCIAS CHHABRA, M. Setting up ETL using Python simplified. Hevodata. Publicado em: 5 abr. 2021. Consultado na internet em: 6 jul. 2021. COSTA, C. D. Want to do ETL with Python? Towards data science. Publicado em: 6 fev. 2021. Consultado na internet em: 6 jul. 2021. DEARMER, A. Top 6 Python ETL tools for 2021. Xplenty. Publicado em: 3 mar. 2021. Consultado na internet em: 6 jul. 2021. EXPLORE+ Para aprimorar os seus conhecimentos no assunto estudado, recomendamos a leitura das seguintes obras: CRICKARD III, P. Data engineering with Python: work with massive datasets to design data models and automate data pipelines using Python. Packt Publishing. 2020. DRASCENO, E. Integração de dados com Pentaho Data Integration. 2019. Edição Kindle. CONTEUDISTA Michel Souza Medeiros
Compartilhar