Introdução
Este post tem a finalidade de apresentar as principais soluções de Big Data.
Integração
Talend é um ETL de código aberto, desenvolvido pela empresa francesa Talend. Ele permite que você crie graficamente manipulação de dados e processos de transformação e, em seguida, gere o executável correspondente como um programa Java.
Sqoop é um projeto da Fundação Apache, que visa permitir uma melhor coabitação de sistemas tradicionais de tipo DBMS com a plataforma Hadoop. Assim, é possível exportar dados do banco de dados e realizar processamento caro, explorando o cluster Hadoop. Os bancos de dados tradicionais são generalizados e o Sqoop permite que aplicativos tradicionais aproveitem um cluster Hadoop.
Mensagem
Kafka é um sistema de mensagens distribuídas, desenvolvido originalmente pela equipe de Jay Kreps no LinkedIn, e publicado em 2011 como um projeto open source Apache.
Armazenagem
Redis é um repositório de dados de chave / valor criado pelo NoSQL e criado em 2009 por Salvatore Sanfilippo e Pieter Noordhuis. O projeto é patrocinado pela VMware e Pivotal.
Uma das principais características do Redis é manter todos os dados na memória. Isso proporciona um excelente desempenho, evitando o acesso ao disco, especialmente caro. Quando o tamanho dos dados é muito grande para manter a memória, o Redis também pode usar a memória virtual (swap).
Inicialmente desenvolvido pelo Facebook em 2008, foi lançado mais tarde e seu desenvolvimento agora é fornecido pela Fundação Apache. Datastax oferece suporte, bem como uma versão Enterprise com alguns recursos adicionais.
Cassandra é uma base de dados orientada a colunas. Estudou para implantações massivamente distribuídas (possivelmente em vários datacenters). Cassandra permite armazenar um elemento que é um conjunto de valores conectados entre si por um identificador exclusivo.
O HBase é um subprojeto do Hadoop, é um sistema de gerenciamento de banco de dados não-relacional distribuído, escrito em Java, com armazenamento estruturado para grandes tabelas.
HBase nasceu para fornecer acesso em tempo real a um cluster Hadoop. Ao contrário do HDFS, o acesso aos dados é aleatório e, portanto, mais eficiente, apesar da volumetria muito alta.
O Facebook no entanto, na origem de Cassandra, decidiu abandoná-lo em 2010 para o benefício da HBase.
O HBase é inspirado nas publicações do Google no BigTable, por isso é um banco de dados baseado em uma coluna e sem esquemas (em teoria). HBase está muito ligado ao Hadoop e o modo de cluster HDFS é necessário.
Cada valor de uma célula (campo no mundo relacional) é marcado com o tempo (como Cassandra), o que torna possível recuperar uma versão antiga do conteúdo.
O HDFS é um sistema de arquivos Java usado para armazenar dados estruturados e não estruturados em um conjunto de servidores distribuídos.
O HDFS é um sistema de arquivos distribuído, extensível e portátil desenvolvido pela Hadoop a partir do sistema desenvolvido pelo Google (GoogleFS).
Escrito em Java, foi projetado para armazenar volumes de dados muito grandes em uma grande quantidade de máquinas equipadas com discos rígidos padrão.
A HDFS depende do sistema de arquivos do sistema operacional nativo para apresentar um sistema de armazenamento unificado baseado em um conjunto de sistemas de arquivos e arquivos heterogêneos.
MongoDB é um banco de dados orientado a documentos da mobilidade NoSQL que permite o armazenamento de documentos no formato BSON (uma forma binária de JSON). O seu idioma de consulta também está no formato JSON.
Possui mecanismos de replicação e fragmento para garantir resiliência e escalabilidade, mesmo que sua arquitetura seja mestre / secundária. Um mecanismo de eleição assegura a continuidade do serviço no caso de uma falha do mestre.
MongoDB é schemaless, o que significa que os documentos da mesma coleção não têm todos os mesmos campos.Os campos podem ser adicionados / removidos para um documento sem migração.
Neo4j é um dos mais antigos bases de dados NoSQL (primeira versão em 2000). É um banco de dados baseado em gráficos escrito em Java.
Os dados são armazenados no disco como uma estrutura de dados otimizada para redes gráficas.
Os bancos de dados orientados por gráfico são particularmente adequados em contextos onde os dados estão fortemente conectados e organizados de acordo com modelos complexos. A estrutura da entidade (nó ou relação) é definida no momento do armazenamento de dados (estrutura de schemaless), o que lhe confere uma grande flexibilidade.
O CouchBase é um banco de dados baseado em documento nascido em 2011, que é o resultado de dois projetos de código aberto: Membase (baseado em memcached) e Apache CouchDB com os quais ele continua compatível.
O CouchBase armazena documentos no formato JSon e oferece as seguintes formas de acessar dados:
- usando a chave exclusiva,
- através das visualizações (de dois tipos MapReduce / espaciais criados a partir de funções JavaScript),
- usando uma linguagem pseudo SQL (N1QL),
- através de pesquisa de texto completo.
Assim como o MongoDB, o formato JSon permite que o CouchBase seja simplificado, também é possível definir uma vida útil automática dos dados (TTL).
O CouchBase suporta o gerenciamento de vários datacenter no modo bidirecional.
Isso garante a continuidade do serviço em caso de indisponibilidade de um datacenter, mas também do usuário para consultar o datacenter mais próximo em operação normal.
O CouchBase fornece filtros de replicação que permitem que você selecione os dados para replicar entre dois centros de dados (somente versão corporativa).
Transformação
Spark nasceu em 2009 no laboratório AMPLab da Universidade de Berkeley na premissa de que:
- Por um lado, a memória custa menos e mais barata e os servidores, portanto, estão cada vez mais disponíveis.
- Por outro lado, muitos conjuntos de dados denominados “Dados grandes” têm um tamanho da ordem de 10 GB e, portanto, estão na memória.
Por isso, era necessário um sistema de tratamento que privilegie o processamento em memória dos dados.
O projeto se juntou à incubadora Apache em junho de 2013 e se tornou um projeto de nível superior em fevereiro de 2014.
O projeto foi progressivamente enriquecido para propor hoje um ecossistema completo.
O ecossistema da faísca agora inclui várias ferramentas:
- Spark para tratamentos “lote”
- Spark Streaming para o processamento contínuo de fluxos de dados
- MLlib para aprendizagem de máquinas, completado pela SparkML desde 2012
- GraphX para cálculos de gráficos
- Spark SQL, uma implementação semelhante a SQL da consulta de dados.
Finalmente, o framework está escrito em Scala e oferece uma ligação Java que permite usá-lo sem problemas em Java. No entanto, o Java 8 é recomendado para explorar as expressões de lambdas que permitirão escrever um código mais funcional.
Existem versões específicas do Spark para Python e R para capitalizar as linguagens normalmente dominadas pelos Data Scientists.
MapReduce é uma estrutura de processamento paralelo, criada pelo Google para indexar o conteúdo de seu mecanismo de pesquisa na web. Disponível como um documento de pesquisa, sua primeira implementação apareceu no momento do desenvolvimento do Hadoop em 2005.
É uma estrutura que permite a decomposição de uma consulta importante em um conjunto de consultas menores que produzirão cada um um subconjunto do resultado final: esta é a função Map.
Todos os resultados são processados (agregação, filtro): esta é a função Reduzir.
Em um processo MapReduce, diferentes atores irão intervir:
- Trabalhadores: lista de nós Hadoop que podem lidar com empregos MapReduce
- Mestre: um trabalhador dedicado ao gerenciamento de tarefas
- Cliente: lança o processamento MapReduce (muitas vezes chamado de driver)
As diferentes fases (Hadoop)
- Inicialização: o cliente / driver carrega um / mais arquivos no HDFS e envia um processamento MapReduce para a grade
- Split: os dados de entrada são opcionalmente divididos em blocos (16-64 MB)
- Atribuição: o mestre atribui as tarefas (Mapa e Redução) aos trabalhadores; a configuração define o número de tarefas Map e Reduce suportadas por cada um dos nós
- Mapa: leitura de divisões passadas para a função Map; Os conjuntos de chave / valor produzidos pela função são primeiro armazenados na memória antes de serem periodicamente escritos localmente e não em HDFS
- Shuffle: os resultados das funções Map são agregados pelo valor da chave para produzir uma lista de valores processados pelo Reducer
- Reduzir: o mestre distribui para o Redutor a lista de dados a serem processados; os resultados são enviados para o fluxo de saída (HDFS, serviços web, …)
- Combinar: otimização, usa os resultados intermédios do mapa de entrada para um tratamento geralmente equivalente ao redutor (sem garantia de passagem)
- Fim: o mestre retorna ao programa do cliente
O Apache Flink é um projeto Apache de nível superior desde dezembro de 2014.
Anteriormente chamado Stratosphere e projeto de pesquisa da Data Artisans, foi criado em 2009 (como Spark).
O objetivo é fornecer uma estrutura de processamento distribuída em memória adaptada ao processamento em tempo real.
Diferenças com Spark:
- O Flink foi projetado desde o início por tempo real.
- Flink foi originalmente escrito em Java e suporta Scala com wrappers.
- O Flink pode realizar tratamentos Hadoop diretamente (ideal para uma transição suave).
O Flink inclui:
- APIs em Java / Scala para processamento em lote e em tempo real,
- Um mecanismo de transformação do programa em fluxos de dados paralelos,
- Um mecanismo de execução para distribuir processamento em um cluster.
Análise
Hive é um projeto iniciado pelo Facebook em 2008.
Como Pig, Hive permite a escrita de tarefas de processamento / consulta de dados para desenvolvedores que não conhecem o Java.
Onde Pig define uma linguagem processual para explorar o cluster, o Hive permite definir tabelas estruturadas do tipo SQL e alimentá-las com dados do cluster ou fontes externas.
Hive é baseado nas seguintes noções:
- Tabelas: uma tabela é uma sucessão de colunas e linhas, assim como para o mundo do SGBD. A diferença vem do sistema de armazenamento distribuído (HDFS ou outro). Outra diferença importante é a ausência de uma noção de chave primária.
- Partições: uma tabela do Hive pode ser particionada para distribuir dados no cluster (dependendo do valor de vários campos)
- Baldes: uma vez que particionado, os dados podem ser divididos em uma única coluna da tabela para dividir o armazenamento de dados. O Bucketing melhora o desempenho das juntas e permite que você trabalhe apenas em amostras.
- Metastore: este é o lugar onde a Hive armazena os metadados das tabelas (esquema, direitos de acesso, estatísticas, …)
Uma tabela Hive pode ser:
- internamente, os dados são duplicados em um diretório HDFS dedicado a Hive (armazém).
- externamente, os dados são armazenados em um diretório HDFS externo e somente os metadados são mantidos em Hive.
consultas
Uma vez que o esquema da tabela é definido e os dados inseridos, é possível usar a linguagem HiveQL para consultar essas tabelas. O HiveQL possui uma sintaxe próxima ao SQL e possibilita a realização das operações essenciais de leitura possibilitando a realização de análises clássicas (seleção de campos, soma, agregação, triagem, junção, …).
Pig é uma ferramenta de processamento de dados que faz parte do conjunto Hadoop e permite a escrita de scripts que são executados na infraestrutura Hadoop sem ter que passar pela escrita da tarefa em Java através da estrutura MapReduce. Ele também possui recursos para carregar dados de uma fonte externa para o cluster HDFS ou recursos para exportar dados para uso por aplicativos de terceiros.
Pig depende de sua própria língua chamada Pig Latin. Ele também fornece acesso à camada de aplicação Java. Esse idioma é bastante simples, o que permite que o desenvolvedor venha de um mundo diferente do Java para produzir scripts de processamento executados no Hadoop muito mais rapidamente.
O projeto Drill foi colocado na incubadora da Fundação Apache em agosto de 2012, é um mecanismo de consulta SQL para o Hadoop, desenvolvido inicialmente no MapR.
Inspirado no projeto Dremel do Google, o Drill permite consultas SQL interativas sobre o Hadoop, com o objetivo primordial de dar aos usuários não-desenvolvedores acesso a análises a partir de dados armazenados em HDFS e Hadoop.
Mesmo que a comparação não seja totalmente justa (a broca é como um Spark fácil de acessar), encontramos os mesmos casos de uso que o Hive.
O Apache Impala é um mecanismo de consulta SQL de processamento massivamente paralelo de código aberto para dados armazenados em um cluster de computador que executa o Apache Hadoop. O Impala foi descrito como o equivalente ao código aberto do Google F1, que inspirou seu desenvolvimento em 2012.
Indexação
O ElasticSearch é um motor de busca aberto, distribuído e baseado em Lucene. Elasticsearch foi criado por Shay Banon, iniciador do projeto Compass, para substituir o último.
Ao contrário do Lucene, é um cluster de indexação, que depende de uma base de documento NoSQL interna usando o formato JSON para armazenamento de documentos. Além disso, exatamente como Solr e, ao contrário do Lucene, seu modo de consulta é de tipo cliente / servidor (não precisa ser implantado na mesma JVM que o cliente)
Os documentos são replicados para diferentes nós de armazenamento para melhorar o desempenho da pesquisa, mas também para gerenciar alta disponibilidade.
O papel da decomposição é o seguinte:
- Lucene gerencia operações de “baixo nível”, como indexação e armazenamento de dados,
- A pesquisa Elastic fornece várias camadas de abstração para aceitar o JSON, fornecendo uma API REST sobre HTTP e facilitando o clustering.
Ao contrário de alguns bancos de dados NoSQL, Elasticsearch não é esquemático. É possível indexar um documento sem qualquer informação sobre o seu formato (apenas os dados), mas o ElasticSearch criará um automaticamente a partir do formato de dados.
A pesquisa elástica está em constante evolução e, em desenvolvimentos recentes, deve-se notar:
- abandono do famoso sistema fluvial a favor de uma abordagem de tipo push por parte dos clientes,
- abandono de facetas em favor das agregações.
A linguagem de consulta é proprietária (Query DSL) e usa uma abordagem DSL e é baseada no formato JSon.
Ecossistema
Elastic, o editor da Elasticsearch, oferece um ecossistema cada vez mais rico em torno de seu mecanismo de busca.
Logstash
Logstash, permite coletar os logs, aplicar alguns tratamentos simples nas mensagens recebidas e depois transmiti-las a uma terceira solução, em particular, pesquisa Elastic para poder realizar pesquisas entre essas mensagens.
Kibana
A Kibana, outra solução bem conhecida, oferece uma interface gráfica para explorar e visualizar dados empurrados para o Elasticsearch ou aqueles armazenados em outras soluções além do editor.
Essas três soluções formam o trio mais comum para análise de log: ELK. Infelizmente, esses produtos tinham até recentemente um ciclo de vida independente que às vezes poderia levar a problemas de compatibilidade.
A nova embalagem foi renomeada como Elastic Stack. A Elastic Stack integra uma nova solução dedicada ao monitoramento, Beats, que é composto pelos seguintes produtos:
- PacketBeat: supervisão de rede,
- TopBeat: monitoramento de memória e CPU,
- FileBeat: supervisão de arquivos
- WinlogBeat: Monitoramento de eventos do sistema operacional (somente Windows),
- LibBeat: utilitários.
Aprendizagem
MLlib
MLlib é um subprojeto Spark desde a versão 0.8. Como Spark, ele se originou no Berkeley Lab (AMPLab).
MLlib é a biblioteca de Aprendizagem de máquinas do Spark. Os algoritmos são projetados para aproveitar a computação paralela em um cluster Spark.
Por isso, é particularmente adaptado para volumetria elevada
MLlib, assim como o resto do framework Spark é desenvolvido em Scala. As operações de álgebra linear são baseadas nas bibliotecas Breeze e JBlas.
Algoritmos disponíveis:
- classificação: regressão logística, máquina de vetor de suporte linear (SVM), Bayes ingênuo,
- regressão: regressão linear generalizada (GLM)
- Filtragem colaborativa: alternando mínimos quadrados (ALS)
- agrupamento: k-means,
- decomposição: decomposição de valor singular (SVD), análise de componentes principais (PCA),
- dados escassos. (Dados escassos),
- Árvores de decisão (CART), Regressões Logísticas,
- Método Broyden-Fletcher-Goldfarb-Shanno (L-BFGS),
- avaliação modelo
- discretização.
Além de aproveitar o kernel Spark MLlib integra-se com:
- Spark SQL (DataFrames em entrada),
- Streaming (fluxo de previsão em tempo real),
- GraphX
Spark ML
Este subprojeto (disponível como pacote no Mllib desde a versão 1.5) é uma evolução para introduzir novos recursos (DataFrame, Pipeline) e padronizar APIs.
Apache Mahout é um projeto da Fundação Apache desde 2011 com o objetivo de criar implementações de algoritmos de aprendizado de máquinas e mineração de dados.
Embora os principais algoritmos de aprendizagem sejam baseados no MapReduce, não existe a obrigação de usar o Hadoop.
O Apache Mahout foi projetado para funcionar sem essa dependência.
Precursor histórico, o Mahout enfrenta novas bibliotecas mais adaptadas aos algoritmos iterativos, como o MLlib da Spark (completado pela Spark ML), ou do mundo dos cientistas de dados, como o Scikit-learn ou o idioma R.
É por isso que, desde a versão 0.10.0 (abril de 2015), a Mahout usou Apache Spark e H2O (dependendo dos algoritmos).
Uma integração com o Flink está em andamento.
Este novo ambiente matemático é chamado Samsara.
Mahout-Samsara é um remake de Mahout para promover escalabilidade e desempenho, mas também fornecer uma tela para criar seus próprios algoritmos (desenvolvimento em Scala).
Samsara também oferece um shell interativo para lançar os tratamentos em um Spark cluster
O Mahout é muito rico em algoritmos de aprendizagem, agrupamento, classificação, filtragem colaborativa, análise de itens freqüentes, etc.
Clustering:
- K-means (paralelizável),
- Fuzzy K-means (paralelizável),
- K-means Spectral (paralelizável).
classificação:
- Regressão logística (não paralelizada),
- Naive Bayes (paralelizável),
- Floresta aleatória (paralelizada)
- Perceptron multicapa (não paralelizado).
Dimensionamento reduzido:
- Decomposição de valor singular (paralelizada)
- PCA (paralelizável),
- Decomposição Lanczos (paralelizada)
- Decomposição QR (paralelizada).
Texto:
A Akka é uma estrutura para construir aplicativos concorrentes, distribuídos e resilientes com a JVM. A Akka é uma implementação orientada por ator que começou em 2009 por Jonas Boner e foi integrada pela primeira vez com a Scala.
A fonte de inspiração é a linguagem Erlang, que oferece uma arquitetura altamente competitiva e baseada em eventos. Akka agora é uma estrutura OpenSource suportada pelo TypeSafe (como Play e Scala), disponível tanto no Scala quanto no Java.
A programação por atores propõe os seguintes postulados:
Um ator é uma entidade que, após a recepção de um evento (mensagem) pode:
- enviar mensagens a outros atores
- criar novos atores,
- especifique o comportamento a seguir ao receber as mensagens que se seguem.
A execução dessas tarefas acima não está ordenada, para que elas possam ser paralelizadas.
O paradigma do ator dissocia o transmissor da mensagem da própria mensagem, permitindo assim o assincronismo das comunicações e a introdução de estruturas dedicadas ao gerenciamento das mensagens. Um ator deve conhecer o endereço do ator a quem ele deseja enviar uma mensagem. Os endereços podem ser trocados por mensagem.
Em resumo, um ator é:
- sistemas stateful,
- responde no recebimento de mensagens,
- envia mensagens aos atores:
> por nome ou endereço,
> em troca de receber uma mensagem,
> para um ator progenitor, …
Akka não é apenas uma implementação do modelo de ator:
- O apelido de transação que, no caso de um erro, permite cancelar as alterações e reiniciar o processo automaticamente.
- ordenou mensagens para um par transmissor / receptor.
Lista de estruturas construídas com Akka:
- Apache Spark,
- Gatling
- Fluxo Apache.
Akka, no entanto, tem os seguintes defeitos:
- processa as mensagens sequencialmente (mas podemos multiplicar o número de atores),
- nenhuma garantia de entrega / processamento de mensagens (entrega na maioria das vezes).