top of page

Search

84 itens encontrados para ""

  • Não quebre mais seus Dashboards: Entendendo DistKey e SortKey na prática

    Primeiro, Sobre o AWS Redshift O Redshift é um serviço de data warehouse em nuvem altamente escalável, oferecido pela AWS. Permite que as empresas analisem grandes volumes de dados rapidamente, utilizando SQL padrão e ferramentas de BI. A arquitetura do Redshift é otimizada para análise de dados em grande escala, aproveitando as vantagens da paralelização e armazenamento colunar. Recomendo a leitura onde falo dos detalhes da arquitetura e como funciona seus componentes, basta acessar o post Entendendo o AWS Redshift e seus componentes . Porquê usar DistKey e SortKey? Entendendo DistKey e SortKey na prática pode trazer diversos benefícios, como o principal deles, melhorar o desempenho das consultas. DistKey  otimiza joins  e agregações distribuindo dados de forma eficiente entre os nós, enquanto SortKey  acelera consultas que filtram e ordenam dados, permitindo que o Redshift leia apenas os blocos de dados necessários. Ambos ajudam a tornar as consultas mais rápidas e o uso de recursos mais eficiente. DistKey e seu funcionamento DistKey (ou Distribution Key) é a estratégia de distribuição de dados entre os nós de um cluster Redshift. Quando você define uma coluna como DistKey, os registros que compartilham o mesmo valor nessa coluna são armazenados no mesmo nó, o que pode reduzir a movimentação de dados entre nós durante as consultas. Uma das várias vantagens é a Redução da movimentação de dados entre nós, aumentando a performance das consultas e melhor utilização da capacidade de processamento distribuído do Redshift. Atenção para a cardinalidade Escolher uma coluna com baixa cardinalidade (poucos valores distintos) como DistKey pode resultar em uma distribuição desigual dos dados, criando "nós quentes" (nós com sobrecarga de dados) e degradando a performance. O que é a tal cardinalidade? A cardinalidade de uma coluna em uma tabela refere-se ao número de valores distintos que ela contém. Uma coluna com alta cardinalidade possui muitos valores distintos, o que geralmente a torna uma boa candidata para ser definida como DistKey  no Amazon Redshift. Isso ocorre porque uma coluna com alta cardinalidade tende a distribuir os dados de forma mais equilibrada entre os nós do cluster, evitando o problema de nós com sobrecarga de dados. Por mais que a ideia de DistKey é distribuir melhor os valores distintos entre os nós mantendo um balanço, devemos nos atentar que quanto mais estes dados movimentem entre os nós, menos desempenho teremos nas execuções de Queries complexas. Por isso é de grande importância definir uma boa estratégia na escolha da coluna para ser uma DistKey . Benefícios de se usar DistKey Para deixar mais claro, veja alguns dos benefícios na escolha de uma boa estratégia: Redução da Movimentação de Dados Entre Nós Quando os dados que compartilham a mesma DistKey  estão no mesmo nó, as operações de join  e agregações que utilizam essa chave podem ser realizadas localmente dentro de um único nó. Isso reduz significativamente a necessidade de movimentação de dados entre os nós, o que é um dos principais fatores que afetam a performance das consultas em sistemas distribuídos. Melhor Performance em Joins  e Consultas Filtradas Se as consultas frequentemente realizam joins  entre tabelas que compartilham a mesma DistKey , manter esses dados no mesmo nó pode melhorar drasticamente a performance. O tempo de resposta das consultas será mais rápido porque as operações não precisarão de redistribuição ou broadcast de dados entre os nós. Suponha que você tenha duas tabelas grandes em seu cluster Redshift: Tabela A (transações) : Contém bilhões de registros de transações de clientes. Tabela B (clientes) : Armazena informações sobre os clientes. Ambas as tabelas têm a coluna cliente_id . Se você frequentemente faz consultas que juntam essas duas tabelas para obter detalhes das transações por cliente, definir cliente_id como DistKey  em ambas as tabelas garante que os registros relacionados ao mesmo cliente estejam armazenados no mesmo nó. SELECT A.transacao_id, A.valor, B.nome_cliente FROM transacoes A JOIN clientes B ON A.cliente_id = B.cliente_id WHERE B.estado = 'CA'; Ao manter os dados de cliente_id no mesmo nó, os joins  podem ser realizados localmente, sem necessidade de redistribuir dados entre diferentes nós do cluster. Isso reduz drasticamente o tempo de resposta da consulta. Sem DistKey , o Redshift precisaria redistribuir os dados de ambas as tabelas entre os nós para executar o join , aumentando o tempo de execução. Com DistKey  em cliente_id, os dados já estão localizados no mesmo nó, permitindo uma execução muito mais rápida. Eficiência de Armazenamento e Processamento A execução local de operações em um único nó, sem a necessidade de redistribuição, permite uma utilização mais eficiente dos recursos de CPU e memória. Isso pode levar a uma melhor utilização do cluster como um todo, resultando em economia de custos e maior throughput das consultas. Desvantagens em usar DistKey Desequilíbrio de Dados (Data Skew) Uma das maiores desvantagens é o risco de criar um desequilíbrio de dados entre os nós, conhecido como data skew . Se a coluna escolhida como DistKey  tem baixa cardinalidade ou se os valores não estão distribuídos uniformemente, alguns nós podem acabar armazenando muito mais dados do que outros. Isso pode levar onde um nó está sobrecarregado, enquanto outros nós ficam subutilizados, resultando em performance degradada. Flexibilidade Reduzida para Consultas Ad Hoc Quando uma DistKey  é definida, ela otimiza especificamente para os tipos de consultas que utilizam essa chave. No entanto, se as consultas ad hoc ou as necessidades analíticas mudarem, a DistKey  pode não ser mais adequada. Alterar a DistKey  requer um redesenho da tabela e possivelmente a redistribuição dos dados, o que pode ser um processo demorado e disruptivo. Desempenho Pior em Consultas Não Otimizadas Se consultas que não utilizam a DistKey  de forma eficaz forem executadas, pode ocorrer uma performance ruim. Isso é particularmente relevante em cenários onde as consultas variam muito ou não seguem um padrão previsível. A ausência de movimentação de dados entre nós em consultas específicas pode ser um benefício em alguns casos, mas pode também limitar o desempenho em consultas que precisam acessar dados distribuídos em todos os nós. Como criar uma DistKey na prática Após a escolha da melhor estratégia baseando-se no que falamos acima, a criação é simples, basta adicionar a palavra chave DISTKEY na criação da tabela. CREATE TABLE vendas ( venda_id INT, cliente_id INT DISTKEY , data_venda DATE, valor DECIMAL(10, 2) ); No exemplo acima, a coluna cliente_id  foi definida como DistKey , otimizando as consultas que buscam dados de vendas por cliente. SortKey e seu funcionamento SortKey é a chave usada para determinar a ordem física em que os dados são armazenados nas tabelas do Redshift. A ordenação dos dados pode acelerar consideravelmente as consultas que utilizam filtros baseados nas colunas definidas como SortKey . Sortkey e seus benefícios Desempenho de Consultas com Filtros e Agrupamentos Uma das principais vantagens de usar SortKey  é a melhora do desempenho das consultas que aplicam filtros ( WHERE ), ordenações ( ORDER BY ), ou agrupamentos ( GROUP BY ) nas colunas definidas como SortKey . Como os dados são armazenados fisicamente no disco na ordem especificada pela SortKey , o Redshift pode ler apenas os blocos de dados necessários, em vez de realizar uma leitura completa da tabela. Redução de I/O e Aumento da Eficiência Com os dados ordenados por SortKey , o Redshift pode minimizar o I/O (input/output) ao acessar apenas os blocos de dados relevantes para a consulta. Isso é especialmente útil em tabelas grandes, onde a leitura completa de todas as linhas seria dispendiosa em termos de tempo e recursos. A redução do I/O resulta em um tempo de resposta mais rápido para as consultas. Facilidade de Gerenciamento de Dados Temporais SortKeys  são particularmente úteis em colunas de data ou tempo. Quando você usa uma coluna de data como SortKey , consultas que filtram por intervalos de tempo, como "últimos 30 dias" ou "este ano", podem ser executadas muito mais rapidamente. Essa abordagem é muito comum em cenários onde os dados são consultados com base em datas, como logs de transações, acessos ou registros de eventos. Apoio ao Comando VACUUM O comando VACUUM  é usado para reorganizar os dados no Redshift, removendo espaços livres e aplicando o ordenamento definido pela SortKey . Tabelas com uma SortKey  bem definida se beneficiam mais desse processo, pois o VACUUM  pode reorganizar os dados de maneira mais eficiente, resultando em uma tabela mais compacta e consultas ainda mais rápidas. Desvantagens no uso da SortKey Escolha Incorreta da Coluna de SortKey Se uma coluna inadequada for escolhida como SortKey , pode não haver melhora significativa na performance das consultas, ou pior, a performance pode até piorar. Por exemplo, se a coluna escolhida não é frequentemente utilizada em filtros ou ordenações, a vantagem de acessar blocos de dados de maneira eficiente é perdida, ou seja, o Redshift irá varrer mais blocos, resultando em maior latência nas consultas. Um exemplo seria definir uma coluna status  (com poucos valores distintos) como SortKey  em uma tabela onde as consultas geralmente filtram por transaction_date  resultará em pouca ou nenhuma melhoria no tempo de execução. Tamanho de tabela e reorganização Em tabelas muito grandes, a reorganização dos dados para manter a eficiência da SortKey  pode ser lenta e consumir muitos recursos. Isso pode afetar a disponibilidade e a performance geral do sistema. Um exemplo seria quando uma tabela com bilhões de registros precisa ser reorganizada devido a inserções ou alterações que desordenam a SortKey , a operação de VACUUM  pode demorar horas ou até dias, dependendo do tamanho da tabela e da carga de trabalho do cluster. Difícil alteração da SortKey Alterar a SortKey  de uma tabela existente pode ser complicado e demorado, especialmente em tabelas grandes. Isso envolve a criação de uma nova tabela, a cópia dos dados para a nova tabela com a nova SortKey , e a remoção da tabela antiga. Ou seja, se ê perceber que a coluna original escolhida como SortKey  não está mais otimizando as consultas conforme esperado, a alteração da SortKey  pode exigir uma migração completa dos dados, o que pode ser disruptivo. Como criar uma SortKey na prática Aqui, data_venda foi definida como SortKey , ideal para consultas que filtram registros com base em datas específicas ou intervalos de datas. CREATE TABLE vendas ( venda_id INT, cliente_id INT, data_venda DATE SORTKEY , valor DECIMAL(10, 2) ); Concluindo tudo que falamos SortKey  é particularmente eficaz para acelerar consultas que filtram, ordenam ou agrupam dados. Ao ordenar fisicamente os dados no disco, SortKeys  permitem que o Redshift leia apenas os blocos de dados relevantes, resultando em tempos de resposta mais rápidos e menor utilização de recursos. No entanto, a escolha errada de uma SortKey  ou a falta de planejamento para gerenciar a reorganização dos dados pode levar a uma performance inferior e aumentar a complexidade do gerenciamento do banco de dados. Por outro lado, DistKey  é essencial para otimizar joins  e agregações entre grandes tabelas. Ao distribuir os dados de maneira eficiente entre os nós do cluster, uma DistKey  bem escolhida pode minimizar a movimentação de dados entre os nós, melhorando significativamente o desempenho das consultas. A escolha da coluna de DistKey  deve ser baseada em sua cardinalidade e no padrão de consultas, para evitar problemas como desequilíbrio de dados e "nós quentes." No entanto, tanto SortKey  quanto DistKey  requerem uma análise cuidadosa e planejamento. Usá-las de forma inadequada pode resultar em pouca ou nenhuma melhoria de performance, ou até mesmo piorá-la. Alterações nas SortKeys  ou DistKeys  também podem ser complexas e disruptivas em tabelas grandes. Portanto, a chave para o uso eficaz de SortKey  e DistKey  no Redshift é um entendimento claro dos padrões de acesso aos dados e das necessidades de performance. Com o planejamento e monitoramento adequados, essas ferramentas podem transformar a maneira como você gerencia e consulta seus dados no Redshift, garantindo que seus dashboards e relatórios sejam rápidos e eficientes, mesmo à medida que o volume de dados cresce. Espero que tenha gostado da leitura sobre o uso deste recursos poderosos do Redshift, todos os pontos levantadas aqui foram baseados no dia a dia do meu time acompanhando ás áreas que utilizam dos dados na entrega de valor. Busquei a simplicidade para explicar de forma clara sobre a importância de pensar nas estratégias antes de definir as DistKeys e SortKeys , e também trouxe exemplos claros do mundo real facilitando o entendimento, Até a próxima!

  • Data Mesh: Ainda faz sentido adotar?

    Introdução Data Mesh: Ainda faz sentido adotar? À medida que as empresas crescem, os volumes de dados que precisam ser processados, armazenados e analisados aumentam exponencialmente. Com isso, as arquiteturas de dados tradicionais, centradas em um único repositório ou equipe, começaram a mostrar sinais de ineficiência. O modelo centralizado, como os famosos Data Warehouses e Data Lakes, frequentemente se depara com gargalos, escalabilidade limitada e dificuldades em atender à demanda crescente de dados de múltiplas áreas de negócios. Nesse contexto, o Data Mesh  surge como uma abordagem inovadora, que propõe a descentralização das operações e governança de dados, distribuindo a responsabilidade para domínios orientados a produtos de dados. Cada domínio, ou área de negócio, torna-se responsável pela criação, manutenção e uso dos seus próprios dados como um produto completo, atendendo tanto a requisitos de qualidade quanto de consumo. Com o Data Mesh, as empresas podem lidar de forma mais eficiente com o crescimento dos dados, permitindo que diferentes áreas funcionais assumam a posse dos dados que geram e consomem. A gestão descentralizada oferece escalabilidade, autonomia e maior velocidade no fornecimento de insights valiosos, além de resolver muitos dos desafios encontrados nas arquiteturas tradicionais centralizadas. Essa abordagem está rapidamente ganhando relevância no campo do Big Data, especialmente em organizações que precisam se adaptar a um ecossistema de dados em rápida evolução. O Data Mesh não é apenas uma nova arquitetura, mas também uma mudança cultural em como os dados são geridos e valorizados dentro das empresas. Mas o que é Data Mesh afinal ? O Data Mesh  é uma abordagem moderna para a arquitetura de dados que busca resolver os desafios das arquiteturas centralizadas, propondo uma descentralização tanto do processamento quanto da governança dos dados. A ideia central do Data Mesh é tratar os dados como um produto , onde cada domínio da organização é responsável por gerenciar e fornecer seus próprios dados de maneira autônoma, de forma similar a como eles gerenciam outros produtos ou serviços. O conceito foi desenvolvido para enfrentar os problemas que surgem nas arquiteturas centralizadas à medida que o volume, a complexidade e a diversidade dos dados aumentam. Ao invés de depender de uma equipe central de dados para gerenciar e processar todas as informações, o Data Mesh distribui a responsabilidade para equipes multifuncionais. Isso significa que cada equipe, ou domínio, se torna o "dono" de seus dados, garantindo que eles sejam confiáveis, acessíveis e de alta qualidade. O Data Mesh é sustentado por alguns pilares essenciais que moldam sua abordagem única. Primeiro, ele descentraliza a gestão de dados ao delegar a responsabilidade para os domínios  dentro de uma organização. Cada domínio é responsável pelos seus próprios dados, permitindo que as equipes de negócio cuidem dos dados que produzem e utilizam, de forma independente. Além disso, um dos conceitos-chave do Data Mesh é tratar os dados como um produto . Isso significa que os dados não são mais vistos apenas como subprodutos dos processos de negócios, mas sim como ativos valiosos, com equipes responsáveis por garantir que eles sejam confiáveis, acessíveis e úteis para os consumidores. Para que isso funcione, é fundamental que exista uma arquitetura  robusta, que ofereça aos times ferramentas necessárias para gerenciar, acessar e compartilhar dados de maneira eficiente e autônoma, sem depender de uma equipe centralizada. Essa infraestrutura facilita a criação e manutenção de pipelines de dados e o monitoramento da qualidade. Por fim, a governança federada  garante que, apesar da descentralização, existam regras e padrões que todas as equipes sigam, assegurando conformidade e interoperabilidade dos dados entre diferentes domínios. A falta de autonomia no acesso aos Dados Um dos maiores desafios enfrentados pelas áreas de negócios em muitas organizações é a dependência de equipes centralizadas de dados  para obter as informações necessárias para decisões estratégicas. Equipes de marketing, vendas, operações e outras precisam constantemente de dados para guiar campanhas, melhorar processos e otimizar suas operações. No entanto, o acesso a esses dados geralmente está limitado a uma equipe central de dados ou TI, o que gera diversos gargalos. Essa falta de autonomia impacta diretamente a agilidade  das áreas de negócios. Cada nova solicitação de dados precisa ser formalmente encaminhada para a equipe de dados, que, por sua vez, já está sobrecarregada com outras demandas. O resultado? Longos tempos de espera para análises, relatórios e insights que deveriam ser gerados rapidamente. Muitas vezes, as decisões precisam ser tomadas com base em dados desatualizados ou incompletos, prejudicando a competitividade e a capacidade de adaptação da empresa a novas oportunidades. Outro ponto crítico é a falta de visibilidade . As áreas de negócios muitas vezes têm dificuldade em acompanhar o que está disponível no catálogo de dados, onde encontrar os dados relevantes e até entender a qualidade dessas informações. O alinhamento entre os requisitos de negócio e a entrega de dados acaba sendo prejudicado, criando uma lacuna entre o que o negócio precisa e o que a equipe de dados consegue entregar. Além disso, a centralização de dados em uma equipe exclusiva dificulta o desenvolvimento de soluções personalizadas para diferentes áreas. Cada equipe de negócio tem necessidades específicas em relação aos dados que consome, e o modelo centralizado geralmente oferece uma abordagem genérica, que nem sempre atende a todas as necessidades. Isso pode levar a frustrações e à sensação de que os dados não são úteis ou acionáveis no contexto específico de cada área. Esses fatores demonstram a necessidade de uma mudança de paradigma na forma como as empresas gerenciam e acessam dados. O Data Mesh  propõe uma solução para essa falta de autonomia, ao descentralizar a responsabilidade de gestão e dar mais poder às áreas de negócio, permitindo que elas mesmas sejam donas dos dados que produzem e consomem. No entanto, essa mudança vem acompanhada de desafios culturais e organizacionais que precisam ser superados para garantir o sucesso dessa nova abordagem. Mudanças culturais são necessárias A adoção do Data Mesh  não é apenas uma questão de mudar a arquitetura de dados; ela exige uma transformação cultural profunda dentro das organizações. Uma das maiores mudanças é a descentralização da responsabilidade  sobre os dados. Em um modelo tradicional, uma equipe central de TI ou de dados geralmente é a única responsável por gerenciar, processar e fornecer acesso aos dados. Com o Data Mesh, essa responsabilidade é transferida para as próprias áreas de negócio, que passam a ser donas dos dados que produzem e consomem. Essa mudança cultural pode ser desafiadora, pois as equipes de negócios, muitas vezes, não estão acostumadas a lidar diretamente com a governança e o processamento de dados. Elas precisarão se adaptar a novas ferramentas e tecnologias  e, mais importante, a um novo mindset , onde o uso e a qualidade dos dados se tornam uma prioridade em suas atividades diárias. Isso requer treinamento e o desenvolvimento de novas habilidades, como entendimento sobre modelagem de dados e melhores práticas de governança. Outro aspecto cultural crítico é a colaboração entre as equipes de negócio e de tecnologia . No modelo de Data Mesh, a TI não é mais o único ponto de contato para todas as necessidades relacionadas a dados. As áreas de negócio ganham autonomia, mas isso não significa que a TI e os engenheiros de dados deixam de ser importantes. Pelo contrário, a colaboração entre as duas partes torna-se ainda mais essencial. A TI deve fornecer as ferramentas e a infraestrutura para que os domínios possam operar de maneira independente, enquanto as áreas de negócio precisam garantir que seus dados atendam aos padrões de qualidade e governança estabelecidos pela organização. Essa nova divisão de responsabilidades pode gerar resistência interna , especialmente em empresas acostumadas a uma estrutura hierárquica e centralizada. As equipes de dados podem sentir que estão perdendo controle sobre a governança, enquanto as áreas de negócio podem se sentir sobrecarregadas com suas novas responsabilidades. Superar essa resistência exige uma liderança forte, comprometida em alinhar toda a organização em torno de um objetivo comum: usar os dados como um ativo estratégico e distribuído. Além disso, o sucesso do Data Mesh depende da adoção de uma cultura de responsabilidade compartilhada . Cada domínio precisa ver os dados como um produto que deve ser gerido com o mesmo cuidado e atenção que qualquer outro produto oferecido ao mercado. Isso requer um compromisso claro com a qualidade, acessibilidade e usabilidade dos dados, o que pode ser um grande salto para áreas que até então não se preocupavam com esses aspectos. Nem só de mudanças culturais vive o Data Mesh, quais são as ferramentas comuns nesse ecossistema? A implementação de um Data Mesh exige um conjunto de ferramentas e tecnologias robustas que suportem a descentralização dos dados, mantendo ao mesmo tempo a governança, a qualidade e a eficiência no processamento e consumo de informações. As ferramentas usadas no ecossistema de Data Mesh variam, mas normalmente estão relacionadas a três áreas principais: plataformas de armazenamento e processamento de dados , ferramentas de orquestração e automação , e ferramentas de governança e qualidade de dados . Plataformas de Armazenamento e Processamento de Dados Uma das bases para o Data Mesh é garantir que cada domínio tenha controle sobre os dados que produz, o que implica na necessidade de plataformas flexíveis e escaláveis para armazenamento e processamento. Algumas das tecnologias mais comuns incluem: AWS S3 e Azure Data Lake : Essas plataformas de armazenamento oferecem uma infraestrutura flexível para dados brutos e processados, permitindo que os domínios mantenham seus dados com controle de acesso individualizado. Apache Kafka : É frequentemente usado para gerenciar o fluxo de dados entre os domínios. Ele permite o streaming de dados em tempo real, essencial para empresas que precisam lidar com grandes volumes de informações de maneira contínua e descentralizada. Spark e Databricks : Ferramentas poderosas de processamento de grandes volumes de dados que ajudam a escalar pipelines distribuídos, essenciais para manter a autonomia e eficiência entre os domínios. Kubernetes : Atua como uma plataforma de orquestração de contêineres, permitindo a criação de ambientes de execução isolados para que diferentes domínios executem seus próprios pipelines de dados de maneira independente. Ferramentas de Orquestração e Automação Para que os domínios consigam gerenciar seus próprios dados sem depender de uma equipe centralizada, é fundamental contar com ferramentas de orquestração que automatizem processos de ETL (Extract, Transform, Load), monitoramento e atualização de dados. Algumas das mais comuns são: Apache Airflow : Uma ferramenta open-source que facilita a automação de pipelines de dados, agendamento de tarefas e monitoramento de workflows. Ela ajuda os domínios a manterem seus processos de ingestão e transformação de dados sem intervenção manual contínua. dbt (Data Build Tool) : Focado na transformação de dados, o dbt permite que os analistas de dados realizem transformações diretamente no data warehouse, facilitando a implementação de mudanças nos modelos de dados de cada domínio com maior autonomia. Prefect : Outra ferramenta de orquestração, similar ao Airflow, mas com foco em simplicidade e flexibilidade na gestão de fluxos de trabalho, facilitando a implementação e manutenção dos pipelines de dados. Ferramentas de Governança e Qualidade de Dados A descentralização traz consigo um grande desafio: manter a governança e garantir a qualidade dos dados em todos os domínios. Algumas ferramentas são projetadas para lidar com esses desafios de maneira eficiente: Great Expectations : Uma das principais ferramentas de validação de dados, permitindo que os domínios implementem e monitorem a qualidade dos dados diretamente nos pipelines de ETL. Isso garante que os dados entregues estejam dentro dos padrões esperados, independentemente do domínio. Monte Carlo : Uma plataforma de monitoramento de dados que alerta automaticamente sobre problemas de qualidade e anomalias. Isso ajuda a manter a confiabilidade dos dados mesmo em um ambiente distribuído. Collibra : Usado para manter um catálogo de dados e implementar governança de forma centralizada, mesmo em uma arquitetura descentralizada. Ele ajuda a garantir que todas as áreas sigam normas comuns de governança, mantendo a interoperabilidade e conformidade dos dados. Infraestrutura de Consumo ou Auto atendimento Uma das chaves para o sucesso do Data Mesh é fornecer às equipes de negócio uma infraestrutura de autoatendimento, permitindo que elas possam criar, gerenciar e consumir seus próprios dados. Isso envolve desde a criação de pipelines até o uso de dashboards para análise de dados: Tableau e Power BI : São frequentemente usados como ferramentas de visualização e exploração de dados, permitindo que os usuários finais acessem e interpretem os dados de maneira rápida e eficiente. Jupyter Notebooks : Usados por equipes de ciência de dados para experimentação e análise, permitindo que os domínios analisem dados de forma independente, sem a necessidade de intervenção de equipes centrais. Quais os riscos ao adotar Data Mesh? Embora o Data Mesh traga inúmeras vantagens, como escalabilidade, agilidade e descentralização, sua adoção também implica desafios consideráveis, que vão desde as mudanças culturais profundas até o risco financeiro. Essas desvantagens podem comprometer a implementação bem-sucedida do modelo e, se não forem abordadas adequadamente, podem resultar em ineficiências ou até mesmo em falhas no projeto. Vamos explorar essas desvantagens em mais detalhes: Complexidade Cultural e Organizacional A transição para um modelo de Data Mesh requer uma mudança cultural significativa em como os dados são geridos e percebidos dentro da empresa. Isso pode ser um obstáculo, especialmente em organizações com uma longa tradição de centralização de dados. Mudança de Mindset : Tradicionalmente, muitas empresas vêem os dados como uma responsabilidade exclusiva da TI ou de uma equipe central de dados. No Data Mesh, essa responsabilidade é distribuída, e as áreas de negócio precisam adotar uma mentalidade de “dados como produto”. Essa mudança exige que os domínios se comprometam a tratar seus dados com o mesmo rigor que tratam qualquer outro produto que entregam. No entanto, essa transição pode encontrar resistência, especialmente em equipes que não têm experiência técnica em governança e gestão de dados. Treinamento e Capacitação : Uma desvantagem clara está no esforço necessário para treinar equipes de negócio a gerenciar e processar seus próprios dados. Isso pode incluir desde o uso de ferramentas de dados até a compreensão das melhores práticas de governança. As empresas precisam investir em treinamentos contínuos para garantir que as equipes estejam preparadas para suas novas responsabilidades, o que pode ser oneroso e demorado. Resistência Interna : Implementar o Data Mesh significa alterar a dinâmica de poder e responsabilidade dentro da organização. Equipes de dados centralizadas podem resistir à descentralização, temendo a perda de controle sobre a governança de dados. Ao mesmo tempo, as equipes de negócios podem sentir que estão sendo sobrecarregadas com novas responsabilidades que antes não faziam parte de suas atribuições. Gerenciar essa resistência requer uma liderança forte e bem alinhada. Fragmentação de Dados e Governança Uma das grandes preocupações ao adotar uma arquitetura descentralizada é o risco de fragmentação dos dados . Se não houver uma governança eficaz e federada, diferentes domínios podem adotar padrões e formatos de dados divergentes, o que pode resultar em silos de dados, duplicação de informações e dificuldades de integração. Inconsistência de Dados : Sem uma governança clara, a descentralização pode levar a inconsistências nos dados entre os domínios. Cada área de negócio pode ter suas próprias definições e práticas para coletar e tratar dados, criando um ambiente em que é difícil consolidar ou comparar informações de diferentes partes da empresa. Desafios na Governança Federada : Implementar uma governança federada eficiente é um dos maiores desafios do Data Mesh. Isso requer a criação de políticas e padrões de dados que sejam seguidos por todos os domínios, garantindo interoperabilidade e qualidade. No entanto, garantir que todos os domínios sigam essas regras, especialmente em grandes organizações, pode ser difícil. Se a governança for relaxada ou fragmentada, os benefícios do Data Mesh podem ser comprometidos. Custos Financeiros Elevados A implementação do Data Mesh também pode implicar custos financeiros  consideráveis, tanto no curto quanto no longo prazo. Isso acontece principalmente pela necessidade de investimentos em novas tecnologias, treinamentos e processos. Investimento em Infraestrutura : Para garantir que cada domínio tenha a capacidade de gerenciar seus próprios dados, as empresas precisam investir em infraestrutura robusta de autoatendimento, o que pode incluir plataformas de armazenamento, processamento e orquestração de dados. O custo inicial de construir essa infraestrutura pode ser elevado, especialmente se a empresa já estiver operando em um modelo centralizado que exige reestruturação. Manutenção Contínua : Além do custo inicial de implementação, a manutenção de um modelo descentralizado pode ser mais cara do que um sistema centralizado. Cada domínio requer recursos dedicados para gerenciar e garantir a qualidade dos seus dados, o que pode aumentar os custos operacionais. Além disso, ferramentas e serviços para garantir a governança federada e a interoperabilidade entre domínios exigem atualizações e monitoramento contínuo. Risco de Ineficiência Financeira : Se a implementação do Data Mesh for mal executada, a empresa pode acabar gastando mais do que inicialmente planejava, sem colher os benefícios esperados. Por exemplo, a falta de governança pode gerar duplicação de dados e esforços redundantes entre os domínios, levando a um desperdício de recursos financeiros e humanos. Dificuldade de Integração e Alinhamento Por fim, a descentralização dos dados pode resultar em dificuldades de integração  entre os domínios, especialmente se não houver um alinhamento claro entre as áreas de negócios e os padrões de dados estabelecidos pela organização. Coordenação entre Domínios : Com o Data Mesh, cada domínio opera de maneira autônoma, o que pode criar desafios de coordenação entre as equipes. A falta de comunicação clara e frequente pode resultar em dados inconsistentes ou incompatíveis, dificultando análises integradas entre diferentes áreas da empresa. Padrões de Qualidade : Manter um padrão de qualidade uniforme entre os domínios pode ser um desafio. Cada área de negócio pode ter uma visão diferente sobre o que constitui dados de qualidade, e sem uma governança clara, isso pode resultar em dados fragmentados ou de baixa confiabilidade. Quais as vantagens e desvantagens? Quais são os benefícios de empresas que adotaram Data Mesh com as que não adotaram? Ao comparar uma empresa que adotou o Data Mesh  com uma que ainda segue o modelo tradicional centralizado, várias diferenças significativas surgem, tanto em termos de vantagens quanto de desvantagens. Essa comparação nos ajuda a entender os cenários onde o Data Mesh pode ser mais apropriado, bem como os desafios que ele pode apresentar em relação ao modelo convencional. Velocidade e Agilidade na Entrega de Insights Empresa com Data Mesh : Ao adotar o Data Mesh, as áreas de negócio ganham autonomia para gerenciar e acessar seus próprios dados. Isso significa que, em vez de depender de uma equipe central de dados, cada domínio pode construir e ajustar seus pipelines de dados de acordo com suas necessidades específicas. Isso geralmente leva a uma redução drástica no tempo necessário para obter insights acionáveis, já que as áreas de negócio não enfrentam os gargalos comuns em uma abordagem centralizada. Empresa sem Data Mesh : Na abordagem centralizada, todas as demandas de dados precisam passar por uma equipe central, que muitas vezes já está sobrecarregada com múltiplas solicitações. Isso resulta em longos tempos de espera para relatórios, análises e insights. Além disso, o backlog de pedidos de dados pode se acumular, atrasando a tomada de decisões críticas para o negócio. Vantagem do Data Mesh: A descentralização acelera o acesso a insights, tornando a empresa mais ágil e capaz de reagir rapidamente às mudanças de mercado. Qualidade e Consistência dos Dados Empresa com Data Mesh : No modelo Data Mesh, cada domínio é responsável pela qualidade dos dados que gera. Embora isso possa significar que os dados são mais contextualizados para as necessidades do domínio, existe o risco de inconsistências se a governança federada não for bem implementada. Cada domínio pode adotar padrões ligeiramente diferentes, o que pode resultar em problemas de interoperabilidade e comparabilidade dos dados entre os domínios. Empresa sem Data Mesh : Em uma empresa com um modelo centralizado, a governança de dados é mais rígida e controlada, o que garante maior consistência nos dados em toda a organização. No entanto, isso também pode criar um gargalo na implementação de novos padrões ou na adaptação de dados para necessidades específicas de diferentes áreas de negócios. Desvantagem do Data Mesh: A descentralização pode resultar em inconsistências nos dados, especialmente se não houver uma governança forte o suficiente para padronizar práticas entre domínios. Escalabilidade Empresa com Data Mesh : O Data Mesh foi projetado para escalar de maneira eficiente em grandes organizações. À medida que a empresa cresce e novos domínios surgem, esses domínios podem rapidamente estabelecer seus próprios pipelines de dados sem sobrecarregar uma equipe central. Isso permite que a organização se expanda sem criar um gargalo nas operações de dados. Empresa sem Data Mesh : Em um modelo centralizado, a escalabilidade é um grande desafio. À medida que a empresa cresce e mais áreas precisam de acesso a dados, a equipe centralizada se torna um ponto de estrangulamento. A expansão da infraestrutura central também pode ser cara e complexa, dificultando a adaptação da empresa a novos volumes e tipos de dados. Vantagem do Data Mesh : Escalabilidade mais natural e eficiente, à medida que as áreas de negócio podem gerir seus próprios dados sem depender de uma equipe central sobrecarregada. Custos Operacionais Empresa com Data Mesh : Embora o Data Mesh ofereça maior autonomia e escalabilidade, os custos operacionais podem ser mais altos no início. A implementação de infraestrutura de autoatendimento, governança descentralizada e treinamento das equipes de negócio para gerir dados pode ser onerosa. Além disso, há o custo contínuo de manutenção de padrões de qualidade e governança entre os domínios. Empresa sem Data Mesh : Um modelo centralizado pode ser mais barato em termos de manutenção e governança, já que a equipe de dados central tem controle total sobre o sistema. No entanto, os custos ocultos podem aparecer na forma de ineficiências e perda de oportunidades devido à lentidão na entrega de dados. Desvantagem do Data Mesh : Maior custo inicial e custos operacionais contínuos relacionados à governança e manutenção de infraestrutura descentralizada. Inovação e Experimentação Empresa com Data Mesh : Com cada domínio autônomo no gerenciamento de seus dados, há uma maior flexibilidade para experimentar novos métodos de coleta e processamento de dados. As equipes podem ajustar suas abordagens para atender às suas necessidades específicas sem esperar pela aprovação ou disponibilidade de uma equipe central de TI. Isso incentiva uma cultura de inovação, onde diferentes áreas podem testar hipóteses rapidamente e adaptar-se às mudanças. Empresa sem Data Mesh : No modelo centralizado, qualquer experimentação ou inovação no uso de dados precisa passar pelo processo burocrático de priorização e execução da equipe central. Isso pode atrasar a inovação e limitar a flexibilidade das áreas de negócio para adaptar suas práticas rapidamente. Vantagem do Data Mesh : Maior flexibilidade e capacidade de inovação nas áreas de negócio, que podem experimentar livremente com seus próprios dados. Governança e Conformidade Empresa com Data Mesh : Manter a governança e a conformidade em uma arquitetura descentralizada pode ser desafiador. Sem uma governança federada bem implementada, há um risco de que diferentes domínios adotem práticas divergentes, o que pode comprometer a qualidade dos dados e até mesmo colocar a empresa em risco de violação de regulamentos de proteção de dados, como o GDPR ou a LGPD. Empresa sem Data Mesh : No modelo centralizado, a governança é muito mais controlada, e a conformidade com normas regulatórias é gerenciada por uma única equipe de dados, o que reduz o risco de violações e inconsistências. Contudo, isso pode levar a uma abordagem mais rígida e lenta para lidar com novas exigências regulatórias. Desvantagem do Data Mesh : A governança descentralizada pode aumentar os riscos de não conformidade regulatória e inconsistência nos dados. Data Mesh é uma bala de prata? O conceito e suas ideias podem servir como uma bala de prata para muitas das dificuldades em que uma arquitetura centralizada enfrenta quando é necessário acompanhar o rápido crescimento da companhia e a necessidade das áreas nas extração de insights de forma ágil. Embora o Data Mesh  seja uma abordagem poderosa para resolver desafios de escalabilidade e autonomia em dados, ele não é uma solução universal. Ele oferece vantagens significativas, como descentralização e maior agilidade, mas também traz desafios complexos, como a necessidade de uma governança federada eficaz e altos custos de implementação. A principal limitação do Data Mesh é que ele exige uma mudança cultural profunda, onde as áreas de negócio se tornam responsáveis pela qualidade e governança dos dados. Empresas que não estão preparadas para essa transformação podem enfrentar fragmentação dos dados e falta de padronização. Além disso, ele não é indicado para todas as organizações. Empresas menores ou com menor maturidade em dados podem achar o Data Mesh excessivamente complexo e caro, optando por soluções mais simples, como Data Lakes ou Data Warehouses. Portanto, o Data Mesh não é uma bala de prata . Ele resolve muitos problemas de dados, mas não é uma solução mágica para todas as empresas e situações. Seu sucesso depende da maturidade e da prontidão da organização para adotar uma arquitetura descentralizada e adaptativa. Espero que tenham curtido esse post, compartilhem e até mais!

  • Afinal o que é a Cloudflare?

    Nos últimos dias os internautas brasileiros foram surpreendidos com a retomada do X (antigo Twitter) por algumas horas acendendo uma chama de esperança na retomada do serviço no Brasil. Porém a retomada durou poucas horas e muitos veículos da Internet iniciaram um grande debate afim de entender o que podia ter acontecido. Muito se falou de que a empresa de Elon Musk "driblou" o bloqueio recente feito pelas operadoras de Internet utilizando os serviços de nuvem da Cloudflare, que por sua vez que usou o serviço de proxy reverso onde basicamente "mascara" o IP dificultando novos bloqueios. Mas afinal, o que é a Cloudflare? Origem da empresa O Cloudflare  foi fundado em 2009 por Matthew Prince , Lee Holloway , e Michelle Zatlyn . A ideia surgiu de um projeto de pesquisa criado por Matthew e Lee na Universidade de Harvard, onde tentaram entender melhor como funcionavam as ameaças de spam e tráfego indesejado na internet. Com o tempo, eles perceberam que o problema não era apenas identificar essas ameaças, mas também proteger sites de tráfego malicioso e garantir que continuassem funcionando rapidamente. Junto com Michelle Zatlyn, que ajudou a transformar a ideia em um negócio, eles lançaram o Cloudflare oficialmente em 2010. O Cloudflare rapidamente se destacou no mercado por sua proposta inovadora e acessível. Diferente de outras soluções da época, que eram caras e complicadas, o Cloudflare oferecia proteção e melhorias de desempenho de forma acessível para empresas de todos os tamanhos. Hoje, a empresa é uma das maiores do mundo no setor de infraestrutura de internet, protegendo milhões de sites. Entendendo melhor os serviços da Cloudflare O Cloudflare  pode ser comparado a um "escudo" e um "acelerador" para sites. Ele faz duas coisas principais que impactam diretamente a experiência de quem navega na internet: Proteção contra ataques cibernéticos : Na internet, existem pessoas mal-intencionadas que tentam derrubar sites, fazer com que eles fiquem fora do ar ou roubar informações valiosas. Um dos ataques mais comuns é o chamado DDoS  (Ataque de Negação de Serviço Distribuído), que acontece quando milhares de solicitações são enviadas a um site ao mesmo tempo, fazendo com que ele sobrecarregue e saia do ar. O Cloudflare funciona como um portão de segurança, bloqueando esse tipo de ataque e garantindo que apenas visitantes reais consigam acessar o site. Melhoria de velocidade : Imagine que você quer acessar um site que está hospedado em outro continente. Naturalmente, isso levaria um tempo maior, já que os dados precisam viajar grandes distâncias. O Cloudflare resolve esse problema armazenando cópias de partes do site em diversos servidores ao redor do mundo. Quando você acessa o site, o Cloudflare busca as informações do servidor mais próximo de você, o que acelera o carregamento da página. Isso é chamado de Content Delivery Network (CDN)  ou Rede de Distribuição de Conteúdo. Além dessas funções principais, o Cloudflare também oferece várias ferramentas para otimizar o desempenho de sites, garantir privacidade e melhorar a segurança, tudo isso de forma automática, sem que o usuário final precise se preocupar com nada. Quais empresas usam a Cloudflare ? O Cloudflare é utilizado por uma ampla gama de empresas, de pequenos blogs até grandes corporações. Sua flexibilidade permite que ele seja acessível tanto para quem está começando na internet quanto para gigantes da tecnologia. Aqui estão algumas das principais empresas que confiam no Cloudflare: Uber : A plataforma de transporte usa o Cloudflare para garantir que o aplicativo funcione de forma estável, mesmo em momentos de alta demanda. Além disso, o Cloudflare protege contra ataques que podem comprometer a segurança dos dados dos usuários. Shopify : Uma das maiores plataformas de e-commerce do mundo, o Shopify usa o Cloudflare para garantir que as lojas online que ele hospeda fiquem rápidas e seguras, proporcionando uma experiência de compra tranquila para milhões de clientes. Pinterest : O site de compartilhamento de imagens usa o Cloudflare para acelerar o carregamento das páginas, garantindo que os usuários possam visualizar fotos e conteúdos de forma rápida, independentemente de onde estejam no mundo. Scribd : O Scribd, uma plataforma de leitura digital, utiliza o Cloudflare para garantir que seus milhões de documentos, livros e artigos sejam carregados de maneira rápida e segura, permitindo que os usuários acessem o conteúdo sem interrupções. Discord : Popular entre gamers e comunidades online, o Discord usa o Cloudflare para garantir que suas conversas em tempo real e o compartilhamento de arquivos aconteçam sem atrasos ou interrupções, especialmente em momentos de tráfego intenso. Para concluir O Cloudflare  pode ser invisível para quem navega na internet, mas ele desempenha um papel crucial ao garantir que sites e serviços funcionem de maneira mais rápida e segura. Desde sua criação em 2009, a empresa cresceu e se tornou uma peça fundamental na infraestrutura da internet moderna, ajudando empresas de todos os tamanhos a oferecerem uma melhor experiência para seus usuários. Seja você um usuário comum ou alguém que gerencia um site, o Cloudflare está trabalhando nos bastidores para garantir que tudo funcione como esperado, mantendo a internet um lugar mais seguro e rápido para todos.

  • Entendendo o AWS Redshift e seus componentes

    Introdução No mundo orientado a dados de hoje, a capacidade de analisar rapidamente e com eficiência grandes conjuntos de dados é mais crítica do que nunca. Entre o AWS Redshift, a resposta da Amazon Web Services para a crescente necessidade de soluções abrangentes de armazenamento de dados. Mas o que é o AWS Redshift, e por que está se tornando um item básico no arsenal de analistas de dados e empresas? Em sua forma mais básica, o AWS Redshift é um serviço baseado na nuvem que permite aos usuários armazenar, consultar e analisar grandes volumes de dados. Ele é projetado para lidar com petabytes de dados em um cluster de servidores, fornecendo a potência necessária para análises complexas sem a necessidade de gerenciamento de infraestrutura normalmente associada a essas tarefas. Para aqueles que são novos no conceito, você pode se perguntar como ele difere de bancos de dados tradicionais. Ao contrário dos bancos de dados convencionais que são otimizados para processamento de transações, o AWS Redshift é construído especificamente para análise de alta velocidade e relatórios de grandes conjuntos de dados. Este foco em análise permite que o Redshift entregue insights a partir de dados em velocidades muito mais rápidas do que os sistemas de banco de dados tradicionais. Um dos principais benefícios do AWS Redshift é sua escalabilidade. Você pode começar com apenas algumas centenas de gigabytes de dados e escalar para um petabyte ou mais, pagando apenas pelo armazenamento e poder de computação que você usa. Isso torna o Redshift uma solução econômica para empresas de todos os tamanhos, de startups a empresas globais. Além disso, o AWS Redshift integra-se perfeitamente com outros serviços da AWS, como o S3 para armazenamento de dados, o Data Pipeline para movimentação de dados e o QuickSight para visualização, criando um ecossistema robusto para armazenamento de dados e análise. Essa integração simplifica o processo de configuração e gerenciamento de seus fluxos de trabalho de dados, permitindo que você se concentre mais em derivar insights e menos na infraestrutura subjacente. Em essência, o AWS Redshift democratiza o armazenamento de dados, tornando-o acessível não apenas para grandes corporações com bolsos profundos, mas para qualquer pessoa com dados a analisar. Seja você um cientista de dados experiente ou um analista de negócios procurando aproveitar o poder dos seus dados, o AWS Redshift oferece uma plataforma poderosa, escalável e econômica para dar vida aos seus dados. Entendendo o AWS Redshift e seus componentes pode ajudá-lo a tomar decisões se você estiver interessado em usar essa poderosa ferramenta. Nas próximas seções, vamos mergulhar no Redshift e em seus componentes. AWS Redshift é um Banco de Dados? Embora o AWS Redshift compartilhe algumas características com bancos de dados tradicionais, ele é mais precisamente descrito como um serviço de armazenamento de dados. Essa distinção é crucial para entender sua função principal e capacidades. Bancos de dados tradicionais são projetados principalmente para processamento de transações online (OLTP), focando na eficiência em lidar com um grande número de transações curtas e atômicas. Esses bancos de dados são excelentes em operações como inserir, atualizar, deletar e consultar por uma única linha, tornando-os ideais para aplicações que requerem acesso em tempo real aos dados, como sites de e-commerce ou sistemas bancários. Por outro lado, o AWS Redshift é otimizado para processamento analítico online (OLAP). Ele é projetado para realizar consultas complexas em grandes conjuntos de dados, tornando-se adequado para inteligência empresarial, análise de dados e tarefas de relatório. O Redshift alcança alta performance de consulta em grandes conjuntos de dados usando armazenamento colunar, compressão de dados e execução paralela de consultas, entre outras técnicas. Então, o AWS Redshift é um banco de dados? Não no sentido tradicional de gerenciar transações do dia a dia. Em vez disso, é um serviço de armazenamento de dados especializado projetado para agregar, armazenar e analisar vastas quantidades de dados de múltiplas fontes. Sua força reside em permitir que os usuários ganhem insights e tomem decisões informadas com base na análise de dados históricos, em vez de lidar com o processamento de transações em tempo real. Em resumo, embora o Redshift tenha funcionalidades semelhantes às de um banco de dados, especialmente em armazenamento de dados e execução de consultas, seu papel como um serviço de armazenamento de dados o diferencia dos sistemas de banco de dados convencionais. É essa distinção que capacita as empresas a aproveitar todo o potencial de seus dados para análises e processos de tomada de decisão. Vantagens de se usar Redshift Eficiência de Desempenho: O AWS Redshift utiliza armazenamento colunar e técnicas de compressão de dados, o que melhora significativamente o desempenho da consulta, reduzindo a quantidade de I/O necessária para a recuperação de dados. Isso o torna excepcionalmente eficiente para operações de armazenamento de dados. Escalabilidade: O Redshift permite escalar seu armazém de dados para cima ou para baixo rapidamente para atender às suas necessidades de computação e armazenamento sem interrupções, garantindo que sua análise de dados não seja interrompida conforme o volume de dados cresce. Custo-Benefício: Com seu modelo de preços pay-as-you-go, o AWS Redshift oferece uma solução econômica para armazenamento de dados. Você paga apenas pelos recursos que usa, o que ajuda a gerenciar custos de forma mais eficaz em comparação com soluções tradicionais de armazenamento de dados. Fácil de Configurar e Gerenciar: A AWS fornece um processo de configuração direto para o Redshift, incluindo a provisão de recursos e a configuração do seu armazém de dados sem a necessidade de extensa experiência em administração de banco de dados. Segurança: O Redshift oferece recursos de segurança robustos, incluindo criptografia de dados em trânsito e em repouso, isolamento de rede usando o Amazon VPC e permissões granulares com o AWS Identity and Access Management (IAM). Integração com o Ecossistema AWS: O Redshift se integra perfeitamente com outros serviços da AWS, como S3, Glue e QuickSight, possibilitando uma solução de nuvem abrangente para processamento, armazenamento e análise de dados. Processamento Paralelo Massivo (MPP): A arquitetura do Redshift é projetada para distribuir e paralelizar consultas em todos os nós de um cluster, permitindo a execução rápida de análises de dados complexas em grandes conjuntos de dados. Alta Disponibilidade: O AWS Redshift é projetado para alta disponibilidade e tolerância a falhas, com replicação de dados entre diferentes nós e substituição automática de nós com falha, garantindo que seu armazém de dados permaneça operacional. Desvantagens de se usar Redshift Complexidade na Gestão: Apesar dos esforços da AWS para simplificar, gerenciar um cluster Redshift ainda pode ser complexo, especialmente quando se trata de ajustar o desempenho e gerenciar recursos de forma eficiente. Custo em Escala: Embora o Redshift seja econômico para muitos cenários, os custos podem aumentar rapidamente com o aumento do volume de dados e a complexidade das consultas, especialmente se não forem otimizados adequadamente. Curva de Aprendizado: Novos usuários podem achar que há uma curva de aprendizado significativa para utilizar o Redshift de forma eficaz, especialmente aqueles não familiarizados com os princípios de armazenamento de dados e SQL. Concorrência Limitada: Em alguns casos, o Redshift pode ter dificuldades com cenários de alta concorrência, onde muitas consultas são executadas simultaneamente, impactando o desempenho. Sobrecarga de Manutenção: Tarefas regulares de manutenção, como vacuum (para recuperar espaço) e analyze (para atualizar estatísticas), são necessárias para o desempenho ideal, mas podem ser difíceis de gerenciar. Desempenho de Load: Carregar grandes volumes de dados no Redshift pode ser demorado, especialmente sem uma gestão cuidadosa das operações de carga e otimizações. Tempo de Cold Start: Iniciar um novo cluster Redshift ou redimensionar um existente pode levar um tempo significativo, levando a atrasos no processamento e análise de dados. Arquitetura Redshift e seus componentes A arquitetura do AWS Redshift é projetada para oferecer alto desempenho e confiabilidade. A seguir, vamos explorar seus componentes principais e como eles interagem para processar e armazenar dados com eficiência. Olhando a imagem acima você pode notar alguns componentes desde a interação do cliente até como os dados são processados ​​​​através dos próprios componentes. A seguir descreveremos cada componente e sua importância para o funcionamento do Redshift: Leader Node Funcionalidade: O Leader Node é responsável por coordenar a execução de consultas. Ele analisa e desenvolve planos de execução para consultas SQL, distribuindo a carga de trabalho entre os nós de computação (Compute Nodes) Comunicação: Ele também agrega os resultados retornados pelos nós de computação e finaliza os resultados das consultas a serem retornados ao cliente. Compute Nodes Funcionalidade: Estes nós são onde o armazenamento de dados reais e a execução de consultas ocorrem. Cada nó de computação contém uma ou mais fatias, que são partições do conjunto total de dados. Armazenamento:  Os nós de computação armazenam dados em formato colunar, que é ótimo para consultas analíticas, pois permite uma compressão eficiente e recuperação rápida de dados. Processamento: Eles realizam as operações instruídas pelo Leader node como filtro, agregação e junção de dados. Node Slices Funcionalidade: Os Nodes Slices são subdivisões da memória e espaço em disco de um nó de computação (Compute Nodes), permitindo que os recursos do nó sejam usados de maneira mais eficiente. Processamento Paralelo: Cada Slice processa sua porção da carga de trabalho em paralelo, o que acelera significativamente os tempos de execução de consultas. AWS Redshift e seus recursos O Redshift contém alguns recursos que ajudam a fornecer desempenho ao processamento e compactação de dados, a seguir alguns desses recursos: Arquitetura Massively Parallel Processing (MPP) Funcionalidade: O Redshift utiliza uma arquitetura chamada MPP, que permite distribuir dados e executar consultas em todos os nós e fatias (slices) disponíveis. Benefícios: Essa arquitetura permite que o Redshift lide com grandes volumes de dados e consultas analíticas complexas com facilidade, proporcionando desempenho de consulta rápido. Armazenamento colunar Funcionalidade:  Os dados no Redshift são armazenados em colunas em vez de linhas, o que é ideal para armazenamento e análise de dados porque permite compactação de dados altamente eficiente e reduz a quantidade de dados que precisam ser lidos do disco para consultas. Benefícios: Esse formato de armazenamento é particularmente vantajoso para consultas que envolvem um subconjunto de colunas de uma tabela, pois minimiza os requisitos de I/O de disco e acelera a execução da consulta. Compressão de Dados Funcionalidade: O Redshift aplica automaticamente técnicas de compactação aos dados armazenados em suas colunas, reduzindo significativamente o espaço de armazenamento necessário e aumentando o desempenho da consulta. Custumização: Os usuários podem selecionar vários algoritmos de compactação, dependendo da natureza de seus dados, para otimizar ainda mais o armazenamento e o desempenho. Redshift Spectrum Funcionalidade:  Uma extensão dos recursos do Redshift, o Spectrum permite que os usuários executem consultas em exabytes de dados armazenados no Amazon S3, diretamente do Redshift, sem a necessidade de carregar ou transformar os dados. Benefícios: Isso fornece uma integração perfeita entre o Redshift e o ecossistema de dados mais amplo da AWS, permitindo consultas complexas em um data warehouse e data lake. Integrações com AWS Redshift A capacidade do Redshift de integrar-se com diversos serviços da AWS e aplicações de terceiros expande sua utilidade e flexibilidade. Esta seção destaca integrações chaves que aprimoram as capacidades de armazenamento de dados do Redshift. Amazon S3 (Simple Storage Service) O Redshift pode consultar diretamente os dados armazenados no S3, usando o Redshift Spectrum, sem necessidade de carregar os dados nas tabelas do Redshift. Os usuários podem criar tabelas externas que referenciam dados armazenados no S3, permitindo que o Redshift acesse dados para fins de consulta. AWS Glue O AWS Glue pode automatizar o processo ETL para o Redshift, transformando dados de várias fontes e carregando-os de forma eficiente nas tabelas do Redshift. Também pode gerenciar o esquema de dados no Catálogo de Dados do Glue, que o Redshift pode utilizar. Como benefícios, essa integração simplifica a preparação de dados, automatiza tarefas ETL e mantém um catálogo de esquema centralizado, resultando em uma redução do ônus operacional e um tempo mais rápido para obter insights. AWS Lambda Você pode usar o Lambda para pré-processar dados antes de carregá-los no Redshift ou para acionar fluxos de trabalho com base nas saídas de consultas. Esta integração automatiza os processos de transformação e carregamento de dados, aprimorando os fluxos de trabalho de dados e reduzindo o tempo gasto na preparação de dados. Amazon DynamoDB O Redshift pode consultar diretamente tabelas do DynamoDB usando o recurso Redshift Spectrum, possibilitando consultas complexas entre seus dados do DynamoDB e do Redshift. Isso oferece uma combinação poderosa de processamento de dados transacionais em tempo real no DynamoDB com análises complexas e processamento em lote no Redshift, oferecendo uma solução de análise de dados mais abrangente. Amazon Kinesis O Redshift integra-se com o Kinesis Data Firehose, que pode carregar dados de streaming diretamente nas tabelas do Redshift. Essa integração possibilita capacidades de análise de dados em tempo real, permitindo que as empresas tomem decisões mais rápidas e informadas baseadas nos dados mais recentes. Conclusão O AWS Redshift exemplifica uma solução poderosa e escalável, feita sob medida para armazenamento de dados eficiente e análises complexas. Sua integração com o amplo ecossistema da AWS, incluindo S3, AWS Glue, Lambda, DynamoDB e Amazon Kinesis, destaca sua versatilidade e capacidade de simplificar fluxos de trabalho de dados, da ingestão ao insight. A arquitetura do Redshift, aproveitando o armazenamento colunar e o processamento paralelo massivo, garante análises de dados em alta velocidade e eficiência no armazenamento. Isso permite que as organizações lidem eficazmente com vastas quantidades de dados, facilitando análises em tempo real e a tomada de decisões. Em essência, o AWS Redshift se destaca de forma estratégica para as organizações orientadas por dados, oferecendo uma plataforma abrangente e pronta para o futuro que não apenas atende às demandas analíticas atuais, mas também está posicionada para evoluir com o cenário de dados em avanço.

  • O Que os Engenheiros de Dados Precisam Saber em 2024

    A Evolução da Engenharia de Dados A engenharia de dados testemunhou uma jornada transformadora, evoluindo da simples coleta e armazenamento de dados para processamento e análise sofisticados. Uma visão geral histórica revela suas raízes no gerenciamento tradicional de banco de dados, progredindo através do advento do Big Data, para o foco atual em análises em tempo real e computação em nuvem. Avanços recentes foram catalisados pela integração da inteligência artificial (IA) e aprendizado de máquina (ML), forçando os limites do que é possível em tomada de decisão baseada em dados. Habilidades para Engenheiros de Dados em 2024 O Que os Engenheiros de Dados Precisam Saber em 2024? Para prosperar em 2024, os engenheiros de dados devem dominar uma mistura de habilidades fundamentais e de ponta: Linguagens de Programação: Proficiência em linguagens como Python, Scala e SQL é inegociável, permitindo manipulação e análise eficientes de dados. Gerenciamento de Banco de Dados: Compreender bancos de dados relacionais e NoSQL, ao lado de soluções de armazenamento de dados, forma a espinha dorsal de estratégias eficazes de armazenamento de dados. Plataformas de Computação em Nuvem: Expertise em AWS, Google Cloud Platform e Azure é crucial, à medida que os serviços de nuvem se tornam centrais para projetos de engenharia de dados. Modelagem de Dados & Processos ETL: Desenvolver modelos de dados robustos e simplificar processos ETL (Extract, Transform, Load) são chave para garantir a qualidade e acessibilidade dos dados. Tecnologias Emergentes e Seu Impacto Tecnologias emergentes como IA e ML, frameworks de Big data e ferramentas de automação estão redefinindo a paisagem: Inteligência Artificial & Aprendizado de Máquina: Estas tecnologias são vitais para modelagem preditiva e análise de dados avançada, oferecendo insights sem precedentes. Tecnologias de Big Data: Hadoop, Spark e Flink facilitam o manuseio de vastos conjuntos de dados, permitindo processamento de dados escalável e eficiente. Por mais que Hadoop tem sido menos usado e sendo absorvido por novas tecnologias, entender o seu funcionamento ajuda e entender todo o ecosistema de Big Data. Ferramentas de Automação e Orquestração: Ferramentas como Apache Airflow e Kubernetes aumentam a eficiência, automatizando fluxos de trabalho e gerenciamento de pipelines de dados. A Importância da Governança e Segurança de Dados Com o aumento de violações de dados e preocupações com privacidade, a governança e segurança de dados tornaram-se primordiais: Conformidade Regulatória: Familiaridade com GDPR, CCPA e outras regulamentações é essencial para a conformidade legal. Técnicas de Privacidade de Dados: Implementar criptografia, anonimização e controles de acesso seguros protege informações sensíveis de acesso não autorizado. Engenharia de Dados na Era da Nuvem A mudança para computação em nuvem exige um entendimento profundo dos serviços e tecnologias de nuvem: Provedores de Serviços de Nuvem: Navegar pelas ofertas dos principais provedores garante o uso ótimo dos recursos da nuvem. Tecnologias Nativas da Nuvem: Conhecimento em contêineres, microserviços e computação sem servidor é crucial para práticas modernas de engenharia de dados. Processamento de Dados em Tempo Real A capacidade de processar e analisar dados em tempo real está se tornando cada vez mais importante: Tecnologias de Dados em Streaming: Ferramentas como Apache Kafka e Amazon Kinesis suportam streams de dados de alta vazão e baixa latência. Análises em Tempo Real: Técnicas para análise de dados em tempo real permitem insights imediatos, melhorando os processos de tomada de decisão. Análises Avançadas e Inteligência de Negócios Ferramentas de análise avançada e BI são essenciais para converter dados em insights acionáveis: Análises Preditivas: Usando modelos estatísticos e aprendizado de máquina para prever tendências e comportamentos futuros. Ferramentas de Visualização: Ferramentas como Tableau e Power BI ajudam a tornar dados complexos compreensíveis através de visualizações interativas. Caminhos de Carreira e Oportunidades de Crescimento Explorar certificações, treinamento e manter-se informado sobre a demanda do setor prepara engenheiros de dados para avanços na carreira: Certificação e Treinamento: Buscar certificações em tecnologias ou metodologias específicas pode aumentar a expertise e credibilidade. Demanda do Setor: Entender a demanda de mercado em evolução garante que os engenheiros de dados possam alinhar suas habilidades com futuras oportunidades. Preparando-se para o Futuro Aprendizado contínuo e engajamento com a comunidade são chave para permanecer relevante no campo acelerado da engenharia de dados: Aprendizado Contínuo: Adotar uma mentalidade de aprendizado ao longo da vida garante que os engenheiros de dados possam se adaptar a novas tecnologias e metodologias. Redes de Contato e Engajamento Comunitário: Participar de fóruns, comparecer a conferências e contribuir para projetos de código aberto fomenta o crescimento profissional e inovação. Conclusão À medida que os dados se tornam cada vez mais cruciais para o sucesso de uma organização, o papel dos Engenheiros de Dados também se torna imprescindível. Criando processos de extração de dados, mecanismos de automação visando a entrega do dados cada vez mais rápida para que tomadas de decisões sejam feitas, usar tecnologias emergentes cria-se um contexto cada vez mais eficiente e ao mesmo tempo reduz gastos. Para isso, é de grande importância que cada vez mais os profissionais atentem-se as novidades de mercado e que as próprias empresas apoiem e criem uma cultura para que profissionais tenham cada vez mais autonomia de buscar novidades e aplica-las.

  • Tendências de Linguagens de Programação para 2024: O que os desenvolvedores precisam saber

    No cenário em constante evolução da tecnologia, as linguagens de programação são as ferramentas fundamentais que capacitam a inovação, impulsionam o progresso e moldam o mundo digital que habitamos. Ao adentrarmos em 2024, a importância de entender e aproveitar essas linguagens nunca foi tão evidente. Desde alimentar a inteligência artificial até possibilitar o desenvolvimento web sem falhas, as linguagens de programação desempenham um papel fundamental na definição da trajetória das tendências tecnológicas e na promoção de mudanças transformadoras em diversas indústrias. Nesta era de avanço tecnológico rápido, manter-se atualizado sobre as linguagens de programação mais recentes não é apenas vantajoso, é imperativo. Desenvolvedores, engenheiros e entusiastas da tecnologia devem reconhecer o impacto profundo que dominar essas linguagens pode ter em sua capacidade de navegar e prosperar no dinâmico cenário tecnológico de 2024. As linguagens de programação servem como os blocos de construção da inovação, fornecendo aos desenvolvedores os meios para transformar ideias em soluções tangíveis. Em 2024, a familiaridade com linguagens de ponta equipa indivíduos com as ferramentas necessárias para empurrar os limites do que é possível, seja através do desenvolvimento de aplicativos impulsionados por IA, criação de experiências virtuais imersivas ou arquitetura de sistemas de software resilientes. Com cada avanço tecnológico surgem oportunidades esperando para serem aproveitadas. Seja capitalizando nos campos emergentes da ciência de dados, tecnologia blockchain ou computação quântica, a proficiência nas linguagens de programação certas posiciona os indivíduos para aproveitar essas oportunidades e criar seu nicho no cenário digital de 2024. Em um mercado de trabalho cada vez mais competitivo, a proficiência em linguagens de programação em demanda pode ser um diferencial para o avanço na carreira. Empregadores de diversas indústrias estão buscando profissionais qualificados capazes de aproveitar as ferramentas e tecnologias mais recentes para impulsionar o sucesso dos negócios. Ao se manter à frente da curva e dominar as linguagens emergentes, os indivíduos podem melhorar sua empregabilidade e desbloquear uma infinidade de oportunidades de carreira. Para este post, decidi escrever sobre as tendências das linguagens de programação para 2024 e espero que isso possa ser útil para você na tomada das melhores decisões e quais rumos deseja seguir este ano. Python O Python continua a manter sua posição como uma das linguagens de programação mais populares e versáteis. Com sua simplicidade, legibilidade e amplo ecossistema de bibliotecas e estruturas, o Python é amplamente utilizado em áreas como ciência de dados, inteligência artificial, desenvolvimento web e automação. Em 2024, a relevância do Python é ampliada ainda mais pela sua adoção em tecnologias emergentes como aprendizado de máquina, computação quântica e metaverso. Rust O Rust tem ganhado tração como uma linguagem de programação de sistemas conhecida por sua performance, segurança e recursos de concorrência. Em 2024, o Rust é cada vez mais utilizado no desenvolvimento de sistemas críticos, incluindo sistemas operacionais, motores de jogos e navegadores web. Seu foco na segurança de memória e abstrações de custo zero o torna particularmente adequado para a construção de software seguro e confiável, sendo uma escolha favorita para projetos que exigem alta performance e robustez. TypeScript O TypeScript, um superset do JavaScript com tipagem estática, continua a ver uma adoção generalizada no desenvolvimento web. Sua capacidade de detectar erros em tempo de compilação, melhorar a manutenibilidade do código e aumentar a produtividade do desenvolvedor fez dele uma escolha preferida para a construção de aplicativos web em grande escala. Em 2024, a popularidade do TypeScript permanece forte, impulsionada pela sua integração com frameworks populares como Angular, React e Vue.js, bem como seu suporte a recursos modernos do JavaScript. Julia Julia, uma linguagem de programação de alto nível projetada para computação numérica e científica, está ganhando destaque em áreas como ciência de dados, biologia computacional e finanças. Conhecida por sua velocidade e facilidade de uso, a Julia combina a flexibilidade de linguagens dinâmicas com o desempenho de linguagens compiladas, tornando-a adequada para tarefas envolvendo cálculos matemáticos e análise de dados em grande escala. Em 2024, a Julia continua a atrair pesquisadores, engenheiros e cientistas de dados que buscam ferramentas eficientes e expressivas para computação científica. Kotlin Kotlin, uma linguagem de programação com tipagem estática para a Máquina Virtual Java (JVM), emergiu como uma escolha popular para o desenvolvimento de aplicativos Android. Oferecendo recursos modernos, interoperabilidade com Java e integração perfeita com ferramentas de desenvolvimento populares, o Kotlin permite que os desenvolvedores construam aplicativos Android robustos e eficientes. Em 2024, a adoção do Kotlin no ecossistema Android permanece forte, impulsionada por sua sintaxe amigável para desenvolvedores, forte suporte de ferramentas e endosso pelo Google como uma linguagem preferida para o desenvolvimento Android. Golang (Go) Go, frequentemente referido como Golang, continua a ganhar tração como uma linguagem para a construção de sistemas escaláveis e eficientes. Conhecido por sua simplicidade, desempenho e suporte embutido para concorrência, o Go é adequado para o desenvolvimento de aplicativos nativos da nuvem, microsserviços e sistemas distribuídos. Em 2024, a popularidade do Go é impulsionada por seu papel em permitir o desenvolvimento de arquiteturas de software resilientes e de alto desempenho, especialmente em computação em nuvem, DevOps e orquestração de contêineres. Quais linguagens de programação as big techs usam? Abaixo temos um panorama sobre as linguagens de programação que as principais grandes empresas de tecnologia estão utilizando em seus stacks, então se você quer trabalhar em uma Big Tech prepare-se para aprender essas linguagens. Conclusão Em 2024, o panorama de programação é caracterizado por um conjunto diversificado de linguagens, cada uma atendendo a casos de uso específicos e requisitos de desenvolvimento. Desde a versatilidade do Python até o desempenho do Rust, a produtividade do TypeScript e as capacidades de computação científica da Julia, o desenvolvimento de aplicativos Android do Kotlin ao desenvolvimento de sistemas do Go, os desenvolvedores têm uma ampla variedade de ferramentas à disposição para enfrentar os desafios e oportunidades apresentados pelas tecnologias emergentes e tendências da indústria. Seja construindo aplicativos alimentados por IA, criando serviços web escaláveis ou otimizando o desempenho do sistema, a escolha da linguagem de programação desempenha um papel crucial na formação do sucesso e impacto dos projetos de software no dinâmico cenário tecnológico de 2024.

  • Explorando Virtual Threads no Java 21

    Introdução a Virtual Threads no Java 21 A concorrência sempre foi um pilar fundamental da programação Java, capacitando os desenvolvedores a criar aplicativos responsivos e escaláveis. No entanto, gerenciar threads de forma eficiente, garantindo alto desempenho e baixo consumo de recursos, tem sido um desafio perene. Com o lançamento do Java 21, uma funcionalidade inovadora chamada Virtual Threads emerge como um divisor de águas no mundo da programação concorrente. Desafios da programação concorrente em Java e os problemas no uso de Threads tradicionais A concorrência em Java apresenta aos desenvolvedores tanto oportunidades imensas para otimização de desempenho quanto desafios em garantir a segurança de threads e gerenciar recursos compartilhados de forma eficaz. À medida que os aplicativos crescem e se tornam mais complexos, navegar por esses desafios torna-se cada vez mais crucial. A seguir alguns dos desafios e os problemas mais comuns no uso de Threads tradicionais: Gerenciamento de Recursos Compartilhados: Um dos desafios fundamentais na programação concorrente é o gerenciamento de recursos compartilhados entre várias threads. Sem mecanismos de sincronização adequados, o acesso concorrente a dados compartilhados pode levar à corrupção de dados e inconsistências. Evitando Deadlocks: Deadlocks ocorrem quando duas ou mais threads estão bloqueadas indefinidamente, aguardando que uma outra libere recursos. Identificar e prevenir deadlocks é crucial para manter a responsividade e a estabilidade de aplicativos concorrentes. Gargalos de Desempenho: Embora a concorrência possa melhorar o desempenho aproveitando várias threads, também pode introduzir overheads, levando a gargalos de desempenho. É essencial projetar algoritmos concorrentes com cuidado e usar mecanismos adequados de sincronização para minimizar a contenção e maximizar o throughput (vazão). Alto Consumo de Memória: Threads tradicionais em Java são implementadas como threads nativas gerenciadas pelo sistema operacional. Cada thread nativa consome uma quantidade significativa de memória, tipicamente na faixa de vários megabytes. Esse overhead se torna problemático quando uma aplicação precisa criar um grande número de threads, pois pode rapidamente esgotar os recursos do sistema operacional. Escalabilidade Limitada: O mapeamento um-para-um entre threads Java e threads nativas impõe um limite na escalabilidade. À medida que o número de threads aumenta, também aumenta o overhead de memória e a complexidade de agendamento. Isso limita o número de tarefas concorrentes que uma aplicação pode lidar eficientemente, prejudicando sua escalabilidade e responsividade. O que são Virtual Threads? Virtual Threads representam uma mudança de paradigma na forma como o Java lida com concorrência. Tradicionalmente, os aplicativos Java dependem de threads em nível de sistema operacional, que são entidades gerenciadas pelo sistema operacional. Cada thread consome recursos significativos de memória, limitando a escalabilidade e impondo overhead (sobrecarga) ao sistema. Virtual Threads, por outro lado, são leves e gerenciadas pela Máquina Virtual Java (JVM) em si. Elas são projetadas para serem altamente eficientes, permitindo a criação de milhares ou até milhões de threads virtuais sem esgotar os recursos do sistema. As Threads Virtuais oferecem um modelo de concorrência mais escalável e responsivo em comparação com as threads tradicionais. Benefícios ao usar Virtual Threads Virtual Threads vêm com uma série de recursos e benefícios que as tornam uma escolha atraente para aplicativos Java modernos: Leveza: Virtual Threads têm sobrecarga mínima de memória, permitindo a criação de grandes números de threads sem esgotar os recursos do sistema. Essa natureza leve as torna ideais para aplicativos altamente concorrentes. Concorrência Estruturada: Virtual Threads promovem a concorrência estruturada, o que ajuda os desenvolvedores a escrever código concorrente mais confiável e fácil de manter. Ao impor limites claros e ciclos de vida para tarefas concorrentes, a concorrência estruturada simplifica o tratamento de erros e o gerenciamento de recursos. Escalabilidade Melhorada: Com Virtual Threads, os desenvolvedores podem alcançar maior escalabilidade e throughput em comparação com as threads tradicionais. O agendador da JVM gerencia eficientemente as threads virtuais, garantindo a utilização ideal dos recursos do sistema. Integração com CompletableFuture: O Java 21 introduz uma integração perfeita entre Virtual Threads e CompletableFuture, simplificando a programação assíncrona. CompletableFuture fornece uma API fluente para compor e encadear tarefas assíncronas, tornando mais fácil escrever aplicativos responsivos e sem bloqueio. Exemplos de como usar Virtual Threads Criando e Executando uma Thread Virtual Este exemplo demonstra a criação e execução de uma thread virtual. Utilizamos o método Thread.startVirtualThread() para iniciar uma nova thread virtual com a tarefa especificada, que imprime uma mensagem indicando sua execução. Em seguida, chamamos join() na thread virtual para aguardar sua conclusão antes de prosseguir. CompletableFuture com Virtual Threads Este exemplo demonstra o uso de threads virtuais com CompletableFuture. Encadeamos tarefas assíncronas usando os métodos supplyAsync(), thenApplyAsync() e thenAcceptAsync(). Essas tarefas executam em threads virtuais, permitindo processamento assíncrono eficiente. Virtual Thread Pool Neste exemplo, criamos um pool de Virtual Threads usando Executors.newVirtualThreadExecutor(). Em seguida, enviamos tarefas para este pool usando o método submit(). Cada tarefa é executada em uma thread virtual, demonstrando um gerenciamento eficiente de concorrência. Usando ThreadFactory com Virtual Threads Aqui, demonstramos o uso de uma ThreadFactory com threads virtuais. Criamos uma fábrica de threads virtuais usando Thread.builder().virtual().factory(), e então a utilizamos para criar um pool de threads de tamanho fixo com Executors.newFixedThreadPool(). Tarefas enviadas para este pool executam em threads virtuais criadas pela fábrica de threads virtuais. Virtual Thread Group Neste último exemplo, demonstramos como organizar threads virtuais em um grupo de threads. Obtemos um grupo de threads virtuais usando Thread.builder().virtual().getThreadGroup() e então criamos uma thread virtual dentro deste grupo. A tarefa executada pela thread virtual imprime uma mensagem indicando sua execução. Conclusão Em conclusão, Virtual Threads ou Threads Virtuais introduzidas no Java 21 marcam um marco significativo na evolução do modelo de concorrência do Java. Ao fornecerem concorrência leve e escalável dentro da JVM, as Threads Virtuais abordam muitas das limitações associadas às threads tradicionais, oferecendo aos desenvolvedores uma abordagem mais eficiente e flexível para a programação concorrente. Com as Threads Virtuais, os desenvolvedores podem criar e gerenciar milhares ou até milhões de threads com sobrecarga mínima, resultando em uma melhoria na escalabilidade e na responsividade das aplicações Java. O modelo de concorrência estruturada aplicado pelas Threads Virtuais simplifica o tratamento de erros e o gerenciamento de recursos, tornando mais fácil escrever código concorrente confiável e de fácil manutenção. Além disso, a integração das Threads Virtuais com CompletableFuture e outros construtores de programação assíncrona permite que os desenvolvedores aproveitem todo o poder do framework de concorrência do Java, enquanto se beneficiam das vantagens de desempenho das Threads Virtuais. No geral, as Threads Virtuais no Java 21 representam um avanço significativo que capacita os desenvolvedores a construir aplicações altamente concorrentes e responsivas com maior eficiência e escalabilidade. À medida que os desenvolvedores continuam a explorar e adotar as Threads Virtuais, podemos esperar ver mais otimizações e melhorias que elevarão ainda mais as capacidades do Java na programação concorrente.

  • Listando tabelas AWS Glue

    Utilizar a SDK da AWS é sempre uma boa opção caso precise explorar algum recurso mais a fundo em busca de uma solução. Neste post, iremos explorar um pouco do AWS Glue utilizando SDK. O Glue é uma ferramenta de ETL da AWS, que proporciona um repositório central de metadados, este chamado de Glue Catalog. Resumindo, o Glue Catalog mantém toda a estrutura de bancos e tabelas e seus schemas em um único lugar. A ideia deste post será listar todas as tabelas de um determinado banco de dados existente no Glue Catalog de forma programática utilizando a SDK. Dependências Maven Neste exemplo, estamos utilizando a versão do Java 8 para explorar melhor o uso de Streams na interação. Passo a passo O objeto awsGlue é o responsável pelo acesso ao recurso através das credencias que devem ser configuradas. Neste post não vamos entrar neste detalhe. O objeto getTablesRequest é o responsável por setar os parâmetros de requisição, neste caso, estamos setando o database. O objeto getTablesResult é o responsável por listar as tabelas com base nos parâmetros setados pelo objeto getTablesRequest e também controlar o fluxo do resultado. Perceba que além de retornar as tabelas através do método getTablesResult.getTableList(), este mesmo objeto retorna um token que será explicado melhor no próximo item. O token é representado pelo método getTablesResult.getNextToken(), a ideia do token é controlar o fluxo de resultados, pois todos os resultados são paginados e caso exista token para cada resultado, significa que ainda existem dados a serem retornados. No código, utilizamos uma estrutura de repetição com base na validação da existência do token, ou seja, se ainda existe token, este será setado no objeto getTableRequest através do código getTableRequest.setNextToken(token), para retornar mais resultados. Livros para estudar e ler Se você deseja aprender mais sobre e atingir um alto nível de conhecimento, recomendo fortemente a leitura do(s) seguinte(s) livro(s): AWS Cookbook (Versão Inglês) é um guia prático contendo 70 receitas detalhadas sobre os recursos da AWS e como resolver diferentes desafios. É um livro bem escrito e de fácil entendimento cobrindo os principais serviços da AWS através de exemplos práticos. A AWS ou Amazon Web Services é o serviço de nuvem mais utilizando atualmente em todo o mundo, caso queira entender mais sobre o tema para ficar bem posicionado no mercado, recomendo fortemente o estudo. Recomendações de Setup Se você tem interesse em saber qual é o meu setup que uso para desenvolver meus tutoriais, segue: Notebook Dell Inspiron 15 15.6 Monitor LG Ultrawide 29WL500-29 Espero que tenha curtido!

  • Criando Alarmes com AWS CloudWatch

    A utilização de alarmes é um requisito imprescindível quando se trabalha com diversos recursos na nuvem. É uma das formas mais eficientes em monitorar e entender o comportamento de uma aplicação caso as métricas estejam diferentes do esperado. Neste post, vamos criar um alarme do zero utilizando AWS CloudWatch. Existem diversas outras ferramentas que nos possibilita configurarmos alarmes, mas quando se trabalha com AWS, configurar alarmes utilizando CloudWatch é bem simples e rápido. Let's do this! Primeiramente, precisamos escolher algum recurso no qual vamos monitorar, para simplificar, vamos criar um SQS e utilizar uma de suas métricas para que a gente possa utilizar no nosso alarme. Criando uma fila SQS Vamos criar uma fila SQS simples e escolher alguma métrica para que a gente possa utilizar no nosso alarme. Acesso o console da AWS e na barra de pesquisa, digite "SQS" conforme imagem abaixo e em seguida, acesse o serviço. Após acessar o serviço, clique em Criar Fila Vamos criar uma fila padrão para o exemplo, o nome da fila será sqs-messages conforme mostrado abaixo. Não precise se atentar aos outros detalhes, apenas clique no botão Criar Fila para finalizar a criação. Fila criada, agora o próximo passo é criar o nosso alarme. Criando o Alarme Todo recurso/serviço é composto de uma ou mais métricas, são basicamente características. Imagine um carro, no carro temos características do tipo, KMs rodados, KM/hora, quantidade de passageiros em um certo momento e quantidade de combustível no tanque e entre outros. Em uma fila SQS temos métricas do tipo, número de mensagens enviadas, número de recebimentos vazios, tamanho das mensagens enviadas, número de mensagens recebidas e etc. Para o nosso exemplo, vamos escolher a métrica baseada em número de mensagens enviadas (numberOfMessagesSent). Na prática, poderíamos escolher essa métrica por vários motivos. Imagine em uma aplicação que, em casos de instabilidade, mensagens serão enviadas para uma determinada fila, assim, evitando perdas. É de grande importância sabermos que existem mensagens que foram enviadas para uma determinada fila neste contexto de instabilidade. Dessa forma, o alarme deverá ser acionado. Acesse a AWS via console e procure por Cloudwatch na barra de pesquisa, conforme imagem abaixo. Após acessar o serviço, clique na opção Em alarme no canto esquerdo da tela e em seguida clique no botão Criar alarme. Selecione a métrica conforme a tela abaixo Escolha a opção SQS Em seguida, clique em Métricas da fila Na barra de pesquisa, digite sqs-messages para buscar as métricas relacionadas a SQS criada nos passos anteriores. Após a pesquisa da fila e suas métricas, selecione o item da coluna Nome da métrica identificado como NumberOfMessagesSent, e em seguida, clique em Selecionar métrica. Na próxima tela iremos configurar mais detalhes sobre o alarme como: período, estatística, condição para o acionamento, valor limite e pontos de dados. Configurando as métricas Nome da métrica: é a métrica escolhida nos passos anteriores, ou seja, esta métrica mede o número de mensagens enviadas para a SQS (NumberOfMessagesSent). QueueName: Nome da SQS no qual o alarme será configurado. Estatística: Neste campo podemos escolher opções como Média, Soma, Mínimo e entre outros. Isso vai depender do contexto o qual você vai precisar para configurar o alarme e a métrica. Neste exemplo escolhemos Soma, pois queremos pegar a soma do número de mensagens enviadas em um determinado período. Período: Neste campo definimos o período em que o alarme será acionado caso atinja a condição limite, no qual, será definido nos próximos passos. Configurando as condições Tipo de limite: Para este exemplo vamos utilizar o Estático. Sempre que o NumberOfMessagesSent for...: Vamos selecionar a opção Maior que...: Neste campo vamos configurar a quantidade de NumberOfMessagesSent como condição para acionar o alarme. Vamos colocar 5. Configuração adicional Para a configuração adicional, temos o campo Pontos de dados para o alarme no qual gostaria de detalhar um pouco mais o seu funcionamento. Pontos de dados para o alarme Esta opção adicional, flexibiliza a configuração do alarme combinado as condições definidas anteriormente. Por padrão, esta configuração é: 1 de 1 Como funciona? O primeiro campo refere-se a quantidade de pontos e o segundo campo, refere-se ao período. Mantendo as configurações anteriores mais a adicional significa que, o alarme será acionado caso a métrica NumberOfMessagesSent for maior que a soma de 5 em um período de 5 minutos. Até então, a configuração adicional padrão não altera as configurações definidas anteriormente, nada muda. Agora, vamos alterar esta configuração para entender melhor. Vamos alterar de: 1 de 1 para 2 de 2. Isso nos diz que, quando a condição do alarme for atingida, ou seja, para a métrica NumberOfMessagesSent, a soma for maior do que 5, o alarme será acionado para 2 pontos de dados em 10 minutos. Perceba que o período foi multiplicado devido ao segundo campo com o valor 2. Resumindo de forma mais objetiva, mesmo que a condição seja atingida, o alarme somente será acionado se existir 2 pontos de dados acima do limite em um período de 10 minutos. Isso nos dá uma certa flexibilidade afim de evitar falsos alarmes. Vamos entender melhor ainda quando efetuamos alguns testes de acionamento do alarme. Vamos manter as configurações a seguir e clique em Próximo Configurando as ações Na próxima tela, vamos configurar as ações responsáveis por notificar um destino caso o alarme seja acionado. Nesta tela, vamos manter a configuração Em alarme e em seguida, vamos criar um novo tópico e por último, vamos adicionar um email no qual desejamos receber as notificações de erros. Na prática, existem melhores formas de notificação, mas não entraremos nestes detalhes. Selecione a opção Criar novo tópico e preencha com um nome desejado e em seguida, digite um email valido no campo Endpoints de e-mail que receberão a notificação ... Feito o preenchimento, clique em Criar tópico e em seguida, um email será enviado para confirmar a inscrição no tópico criado. Faça a confirmação no seu email e clique em Próximo na tela do alarme para prosseguir com a criação. Agora, precisamos adicionar o nome do alarme na tela abaixo e em seguida clicar em Próximo. A próxima tela será a de revisão, clique em Criar alarme para finalizar a criação. Pronto, agora temos um alarme criado e é hora de testar. Testando o alarme Para testar o alarme, vamos enviar 6 mensagens para a fila criada anteriormente conforme a tela abaixo. Repita esta ação por 6 vezes clicando em Enviar mensagem, fique a vontade para mudar o conteúdo da mensagem. Após o envio das mensagens, perceba que mesmo que o limite seja ultrapassado, o alarme não foi acionado. Isso se deve a configuração adicional, caso contrário, bastaria ter configurado os pontos de dados para 1 de 1 para que o alarme fosse acionado. Agora, vamos enviar várias outras mensagens que exceda o limite em períodos curtos dentro da janela de 10 minutos. Perceba que na imagem acima o alarme foi acionado, pois além de ter atingido a condição especificada nas configurações, também atingiu os 2 pontos de dados. Verifique no email adicionado nas configurações de notificação pois, provavelmente um email foi enviado com os detalhes do alarme. Após o período de 10 minutos, o alarme passa de Em alarme para OK. É isso, curtiu? Até mais!

  • Introdução ao Apache Hive com Spark e Java

    O Hive é um software de Data Warehouse que possibilita a leitura, escrita e o gerenciamento de dados distribuídos e permite a utilização de SQL em consultas estruturadas. Vamos utilizar o contexto do Spark para a configuração inicial, mas é possível fazer de outras formas sem a utilização do Spark. Maven org.apache.spark spark-core_2.12 2.4.5 org.apache.spark spark-hive_2.12 2.4.5 O primeiro passo é criar a configuração do contexto inicial: String dwDir = new File("warehouse-dir").getAbsolutePath(); SparkConf sparkConf = new SparkConf() .set("spark.sql.warehouse.dir", wareHouseDir); SparkSession sparkSession = SparkSession.builder() .config(sparkConf) .enableHiveSupport() .master("local[1]") .getOrCreate(); Entendendo as configurações acima: 1. Neste trecho a variável dwDir recebe o caminho da pasta warehouse-dir que será utilizada nas configurações do Spark. Até então essa pasta não foi criada. String dwDir = new File("warehouse-dir").getAbsolutePath(); 2. No próximo trecho é setado a parâmetro spark.sql.warehouse.dir no contexto do Spark com o caminho do diretório referenciado no primeiro trecho. Dessa forma o Spark usará este diretório como o repositório dos bancos que serão criados. SparkConf sparkConf = new SparkConf() .set("spark.sql.warehouse.dir", wareHouseDir); 3. E por fim, a criação do SparkSession onde estão as configurações criadas anteriormente, o local onde o master será executado (localmente - local[1]) e a ativação do Hive. SparkSession sparkSession = SparkSession.builder() .config(sparkConf) .enableHiveSupport() .master("local[1]") .getOrCreate(); 4. Agora podemos executar algumas operações de DML e DDL 4.1. Criando um banco de dados sparkSession.sql("CREATE DATABASE IF NOT EXISTS hive_tutorial"); 4.2. Criando os Parquets Neste passo iremos criar uma tabela já apontando para o DataSource. Neste caso o DataSource será um Parquet. O Parquet é um arquivo de formato colunar que provê um melhor desempenho nas consultas. Para isso vamos criar um Parquet a partir de um JSON com seguinte o conteúdo: Arquivo data/pessoa.json {"id":1,"nome":"Joao","idade":12} {"id":2,"nome":"Kelly","idade":21} {"id":3,"nome":"Monica","idade":29} {"id":4,"nome":"Laura","idade":32} {"id":5,"nome":"Kiko","idade":23} {"id":6,"nome":"Miguel","idade":55} {"id":7,"nome":"Junior","idade":25} {"id":8,"nome":"Luis","idade":36} Executando a leitura do arquivo para um DataFrame. Dataset df = sparkSession.read().json("data/pessoa.json"); Criando os arquivos Parquet com base no DataFrame dentro do diretório data/parquet do seu projeto df.write().parquet("data/parquet/") Veja que os arquivos foram criados Pronto, agora temos um Data Source criado. 4.3. Criando a Tabela Segue os passos: sparkSession.sql("USE hive_tutorial"); Após selecionar o banco HIVE_TUTORIAL. O comando CREATE TABLE possui alguns argumentos extras, segue: STORED AS PARQUET : É um argumento que o Hive utilizará para saber que tipo de arquivo será usado na conversão, neste caso o Parquet. LOCATION: Diretório do Data Source criado anteriormente. sparkSession.sql("CREATE TABLE IF NOT EXISTS pessoa " + "(id BIGINT, nome STRING, idade BIGINT) " + "STORED AS PARQUET " + "LOCATION 'data/parquet/'"); É possível verificar a tabela criada executando o trecho abaixo: sparkSession.sql("SHOW TABLES").show(); Independente do fim da execução do programa, a tabela será mantida. Diferente de uma view criada com SparkSQL que é somente mantida em memória. 5. Exemplos de consultas Selecione o banco de dados sparkSession.sql("USE hive_tutorial"); Exemplo 1 sparkSession.sql("SELECT id, nome, idade " + "FROM hive_tutorial.pessoa " + "WHERE idade between 10 and 30 " + "ORDER BY nome desc ").show(); Resultado Exemplo 2 sparkSession.sql("SELECT count(nome) " + "FROM hive_tutorial.pessoa " + "WHERE idade > 45 ").show(); Resultado 6. Exemplos de consultas mais complexas Agora vamos criar duas novas tabelas para explorar melhor os recursos do Hive. Crie o arquivo JSON data/produto.json {"id":1,"desc":"video game","preco":1800.0,"tipo":"eletronico"} {"id":2,"desc":"geladeira","preco":1600.0,"tipo":"eletronico"} {"id":3,"desc":"cama","preco":2000.0,"tipo":"quarto"} {"id":4,"desc":"armário","preco":750.0,"tipo":"sala"} {"id":5,"desc":"notebook","preco":4500.0,"tipo":"eletronico"} {"id":6,"desc":"mesa","preco":2500.0,"tipo":"sala"} {"id":7,"desc":"cadeira","preco":110.0,"tipo":"sala"} {"id":8,"desc":"TV","preco":1500.0,"tipo":"eletronico"} {"id":9,"desc":"fogão","preco":900.0,"tipo":"cozinha"} Crie os parquets para Produto Dataset dfP = sparkSession.read().json("data/produto.json"); dfProd.write().parquet("data/parquet/produto/"); Crie o arquivo JSON data/item.json {"id":1,"id_produto":2,"qtde":1} {"id":2,"id_produto":1,"qtde":2} {"id":3,"id_produto":3,"qtde":3} {"id":4,"id_produto":4,"qtde":2} {"id":5,"id_produto":5,"qtde":5} Crie os parquets para Item Dataset dfItem = sparkSession.read().json("data/item.json"); dfItem.write().parquet("data/parquet/item/"); Com base nos parquets criado, agora vamos criar a tabelas Produto e Item sparkSession.sql("USE hive_tutorial"); sparkSession.sql("CREATE TABLE IF NOT EXISTS produto " + "(id BIGINT, desc STRING, " + "preco BIGINT, " + "tipo STRING) " + "STORED AS PARQUET " + "LOCATION 'data/parquet/produto'"); sparkSession.sql("CREATE TABLE IF NOT EXISTS item " + "(id BIGINT, " + "id_produto BIGINT, " + "qtde BIGINT) " + "STORED AS PARQUET " + "LOCATION 'data/parquet/item/'"); Tabelas criadas sparkSession.sql("SHOW TABLES").show(); Consultas utilizando JOIN Exemplo 1 sparkSession.sql("SELECT prod.id, " + "prod.desc, " + "prod.preco, " + "prod.tipo, " + "item.qtde " + "FROM produto prod inner join item item " + "on (prod.id = item.id_produto) " + "order by prod.id ").show(); Resultado Exemplo 2 sparkSession.sql(" SELECT " + "prod.tipo, " + "sum(item.qtde) " + "FROM produto prod inner join item item " + "on (prod.id = item.id_produto) " + "group by prod.tipo").show(); Resultado Exemplo 3 sparkSession.sql(" SELECT " + "prod.tipo, " + "sum(item.qtde), " + "sum(item.qtde * prod.preco) " + "FROM produto prod inner join item item " + "on (prod.id = item.id_produto) " + "group by prod.tipo").show(); Resultado Pra finalizar, dê uma olhada na documentação oficial para mais detalhes: https://spark.apache.org/docs/latest/sql-data-sources-hive-tables.html https://hive.apache.org/ É isso, espero ter ajudado!

  • Primeiros passos com Delta Lake

    O que é o Delta Lake? O Delta Lake é um projeto open-source que visa gerenciar a camada de armazenamento (Storage Layer) que segundo o seu conceito: "traz confiabilidade para Datalakes". Na prática é uma abstração do Apache Spark reutilizando os mesmos mecanismos mas oferencendo recursos extras interessantes. Dentre eles, suporte para transações ACID. Todos sabem que manter a integridade dos dados em uma pipeline de dados é uma tarefa crítica diante do alta concorrência de leitura e escrita de dados. Neste caso, o ACID possibilita gerenciar ambientes como estes. Dentre outras vantagens, o Delta Lake provê histórico de auditoria, versionamento de dados, suporta operações DML do tipo delete e update e vários outras vantagens. Para este tutorial, vamos simular uma pipeline de dados simples de forma local, com o foco no que o Delta Lake pode nos oferecer de vantagens. Na etapa de ingestão, vamos carregar um Spark DataFrame a partir de um JSON, criaremos uma view temporária para nos auxiliar, criaremos uma tabela Delta via SQL e por fim, utilizaremos o Delta Lake para executar algumas operações de DML utilizando a view que será criada. Vamos utilizar Java e Maven para gerenciar as dependências, além de Spark e Hive no qual este, vai nos auxiliar em manter a tabelas em um catálogo de dados. Maven org.apache.spark spark-core_2.12 3.0.1 org.apache.spark spark-sql_2.12 3.0.1 org.apache.spark spark-hive_2.12 3.0.1 io.delta delta-core_2.12 0.8.0 O código será desenvolvido em pequenos trechos para um melhor entendimento. Configurando Spark com Delta e Hive String val_ext="io.delta.sql.DeltaSparkSessionExtension"; String val_ctl="org.apache.spark.sql.delta.catalog.DeltaCatalog"; SparkConf sparkConf = new SparkConf(); sparkConf.setAppName("app"); sparkConf.setMaster("local[1]"); sparkConf.set("spark.sql.extensions",var_ext); sparkConf.set("spark.sql.catalog.spark_catalog",val_ctl); SparkSession sparkSession = SparkSession.builder() .config(sparkConf) .enableHiveSupport() .getOrCreate(); Entendendo o trecho acima Definimos duas variáveis val_ext e val_ctl atribuindo os valores para as chaves (spark.sql.extensions e spark.sql.catalog.spark_catalog) . Estas, necessárias para a configuração do Delta junto com o Spark Demos o nome do contexto do Spark de app Como não estamos rodando o Spark em um cluster, o master está configurado para rodar local local[1] O Spark tem suporte para o Hive, nesse caso o habilitamos no trecho enableHiveSupport( ) Ingestão dos Dados Vamos trabalhar com Spark Dataframe como fonte dos dados. Carregaremos um Dataframe a partir de um JSON. Arquivo order.json {"id":1, "date_order": "2021-01-23", "customer": "Jerry", "product": "BigMac", "unit": 1, "price": 8.00} {"id":2, "date_order": "2021-01-22", "customer": "Olivia", "product": "Cheese Burguer", "unit": 3, "price": 21.60} {"id":3, "date_order": "2021-01-21", "customer": "Monica", "product": "Quarter", "unit": 2, "price": 12.40} {"id":4, "date_order": "2021-01-23", "customer": "Monica", "product": "McDouble", "unit": 2, "price": 13.00} {"id":5, "date_order": "2021-01-23", "customer": "Suzie", "product": "Double Cheese", "unit": 2, "price": 12.00} {"id":6, "date_order": "2021-01-25", "customer": "Liv", "product": "Hamburger", "unit": 1, "price": 2.00} {"id":7, "date_order": "2021-01-25", "customer": "Paul", "product": "McChicken", "unit": 1, "price": 2.40} Criando Dataframe Dataset df = sparkSession.read().json("datasource/"); df.createOrReplaceGlobalTempView("order_view"); Entendendo o trecho acima No trecho anterior, estamos criando um Dataframe a partir do arquivo JSON que está dentro do diretório datasource/ , crie este diretório para que a estrutura do seu código fique mais compreensiva e em seguida, crie o arquivo order.json com base no conteúdo mostrado anteriormente. Por último, criamos um view temporária que vai nos auxiliar mais a frente nos próximos passos. Criando a Tabela Delta (Delta Table) Vamos criar a Delta Table a partir de um script SQL. A princípio a criação é simples, mas perceba que usamos tipagens diferentes de uma tabela utilizada em um banco relacional. Como por exemplo, utilizamos STRING ao invés de VARCHAR e assim por diante. Estamos particionando a tabela pelo campo date_order. Este campo foi escolhido como partição pois acreditamos que haverá diferentes datas. Dessa forma, as consultas podem utilizar este campo como filtro, visando um melhor desempenho. E por fim, definimos a tabela como Delta Table a partir do trecho USING DELTA. String statement = "CREATE OR REPLACE TABLE orders (" + "id STRING, " + "date_order STRING," + "customer STRING," + "product STRING," + "unit INTEGER," + "price DOUBLE) " + "USING DELTA " + "PARTITIONED BY (date_order) "; sparkSession.sql(statement); Entendendo o trecho acima No trecho anterior estamos criando uma tabela Delta chamada orders e em seguida executamos a criação. Operações DML Delta suporta operações como Delete, Update e Upsert utilizando Merge Utilizando Merge junto com Insert e Update Neste passo, vamos executar um Merge que possibilita controlar o fluxo de inserção e atualização de dados através de uma tabela, Dataframe ou view. O Merge trabalha a partir de row matches que ficará mais compreensível no trecho seguinte. String mergeStatement = "Merge into orders " + "using global_temp.order_view as orders_view " + "ON orders.id = orders_view.id " + "WHEN MATCHED THEN " + "UPDATE SET orders.product = orders_view.product," + "orders.price = orders_view.price " + "WHEN NOT MATCHED THEN INSERT * "; sparkSession.sql(mergeStatement); Entendendo o trecho acima No trecho acima estamos executando o Merge a partir da view order_view criada nos passos anteriores. No mesmo trecho temos uma condição orders.id = orders_view.id que vai auxiliar nos matches seguintes. Caso a condição anterior seja verdadeira, ou seja o MATCHED seja verdadeiro. Os dados serão atualizados. Caso a condição não seja verdadeira, NOT MATCHED. Os dados serão inseridos. No caso acima, os dados serão inseridos, pois até então não existia dados na tabela orders. Execute o comando abaixo para visualizar os dados inseridos. sparkSession.sql("select * from orders").show(); Atualize o arquivo datasource/order.json alterando o campo product, price e execute todos os trechos novamente. Você verá que todos os registros serão atualizados. Comando Update É possível executar Update sem a necessidade de usar o Merge, basta executar o comando abaixo: String updateStatement = "update orders " + "set product = 'Milk-Shake' " + "where id = 2"; sparkSession.sql(updateStatement); Comando Delete String deleteStatement = "delete from pedidos where id = 2"; sparkSession.sql(deleteStatement); Além de poder executar o comando Delete, é possível utilizar este comando junto ao Merge. Entendendo o Delta Lake Transaction Log (DeltaLog) Além de dar suporte a transações ACID, o delta gera alguns arquivos JSON que servem como uma forma de auditar e manter o histórico de cada transação, desde comandos DDL e DML Com este mecanismo é possível até voltar em um estado específico da tabela caso necessário. Para cada transação executada um arquivo JSON é criado dentro da pasta _delta_log. O arquivo inicial sempre será 000000000.json, contendo os commits da transação. Neste nosso cenário, este primeiro arquivo contém os commits da criação da tabela orders. Para visualizar melhor, acesse a pasta local que provavelmente foi criada na raiz do seu projeto chamada spark-warehouse. Esta pasta foi criada pelo Hive para alocar os recursos criados desde os arquivos JSON e os parquets. Dentro dela terá uma estrutura de pastas conforme imagem abaixo: Perceba que os arquivos são criados em ordem crescente a partir de cada transação executada. Acesse cada arquivo JSON e verá cada transação que foi executado através do campo operation, além de outras informações. 00000000000000000000.json "operation":"CREATE OR REPLACE TABLE" 00000000000000000001.json "operation":"MERGE" 00000000000000000002.json "operation":"UPDATE" 00000000000000000003.json "operation":"DELETE" Perceba também que os arquivos parquets foram gerados particionados em pastas pelo campo date_order. Utilizar partição visa consultas com melhores desempenho, mas não entraremos em detalhes neste post, futuramente falaremos mais sobre isso. Espero que neste post foi possível esclarecer algumas dúvidas sobre o que é o Delta Lake e seu funcionamento. Até a próxima!

  • Usando Comparator.comparing para ordenar Java Stream

    Introdução A ordenação de dados é uma tarefa comum em muitos projetos de desenvolvimento de software. Quando trabalhamos com coleções de objetos em Java, uma abordagem poderosa e flexível para realizar a ordenação é o uso da interface Comparator.comparing em conjunto com Streams. Neste post, vamos mostrar que usando Comparator.comparing para ordenar Java Stream pode tornar a ordenação elegante e eficiente. O que é a interface Comparator.comparing? A interface Comparator.comparing é uma funcionalidade introduzida no Java 8 como parte do pacote java.util.Comparator. Ela fornece um método estático chamado comparing, que permite especificar uma função de chave (chave de ordenação) para comparar objetos. Essa função é usada para extrair um valor de um objeto e compará-lo com base nesse valor durante a ordenação. Flexibilidade na ordenação com Comparator.comparing Uma das principais vantagens da interface Comparator.comparing é sua flexibilidade. Com ela, podemos realizar ordenações em diferentes campos de um objeto, permitindo a criação de lógicas de ordenação complexas de forma simples e concisa. Perceba no código abaixo que simplemente no método sorted(), passamos como argumento a interface Comparator.comparing que por sua vez, passou o campo city como argumento utilizando method reference (People::getCity) executando a ordenação por este campo. Saída da execução Monica John Mary Anthony Seth Ordenação de múltiplos critérios Muitas vezes, é necessário realizar ordenações com base em múltiplos critérios. Isso é facilmente alcançado com a interface Comparator.comparing. Basta encadear vários métodos comparing, cada um especificando um critério diferente. O Java se encarregará de realizar a ordenação de acordo com a sequência especificada. Por exemplo, podemos ordenar a mesma lista por city e, em seguida, por name: Comparator.comparing(People::getCity).thenComparing(People::getName). Ordenação ascendente e descendente Outra vantagem importante da interface Comparator.comparing é a capacidade de realizar ordenações tanto em ordem ascendente quanto descendente. Para isso, basta encadear o método reversed() como no código abaixo: Saída da execução Seth Mary John Anthony Monica Eficiência e simplicidade Ao usar a interface Comparator.comparing em conjunto com Streams, a ordenação se torna mais eficiente e elegante. A combinação desses recursos permite escrever código limpo, de fácil leitura e manutenção. Além disso, o Java otimiza internamente a ordenação usando algoritmos eficientes, resultando em um desempenho satisfatório mesmo para grandes conjuntos de dados. Conclusão final A interface Comparator.comparing é uma ferramenta poderosa para realizar a ordenação de Streams em Java. Sua flexibilidade, capacidade de ordenação ascendente e descendente, suporte para múltiplos critérios e eficiência na execução tornam-na uma opção valiosa para qualquer desenvolvedor Java. Ao aproveitar essa interface, podemos obter um código mais conciso, menos verboso e eficiente, facilitando a manipulação de objetos em uma Stream. Espero que tenha curtido!

bottom of page