Linguagem de programação que rege os frameworks Data Intensive (Big Data + Fast Data)

Md Kamaruzzaman Blocked Unblock Seguir Seguindo 6 de janeiro

Nos bons e velhos tempos, as empresas utilizavam principalmente uma linguagem de programação principal (por exemplo, C, C ++, Java, C #,…), um tipo de banco de dados (SQL) e dois formatos de troca de dados (XML, JSON). A situação mudou desde o início do século 21 com o surgimento de internet e dispositivos móveis. Todos os anos, o volume e a velocidade dos dados se multiplicam e continuam a crescer exponencialmente.

Grandes empresas de TI como Amazon, Google de repente descobriu que as ferramentas e estruturas existentes não foram suficientes para lidar com esses dados grandes, rápido. Essas empresas desenvolveram frameworks de código fechado para trabalhar com dados da “escala da Web” e compartilharam seu conceito / arquitetura na forma de documentos. Em 2003, o Google publicou o documento do sistema de arquivos do Google, seguido do artigo Map Reduce e do Big Table . Também a Amazon publicou o artigo da Dynamo em 2007. Como toda a indústria enfrentava o mesmo problema de manipulação de dados em escala da Web, a comunidade e a indústria de desenvolvedores adaptaram o conceito desses papéis e desenvolveram sistemas como ecossistema Hadoop , bancos de dados NoSQL e outras estruturas. Com a proliferação do GitHub e a facilidade do código aberto, muitos outros frameworks Data Intensive foram desenvolvidos e adaptados pela indústria nos anos seguintes.

Recentemente, eu estava lendo o excelente livro: “ Designing Data-Intensive Applications ”, escrito por Martin Kleppmann, que oferece uma visão geral abrangente e aprofundada de várias estruturas de dados intensivas. Ao ler esse livro, uma pergunta surgiu em minha mente: qual é a Linguagem de Programação mais usada em estruturas de Dados Intensivas?

Aqui vou tentar encontrar a linguagem de programação mais usada entre os frameworks Intensivos de Dados de Código Aberto. Como há muitas estruturas / bibliotecas de Data Intensive, vou focar principalmente nas principais estruturas de software livre em cada categoria. Além disso, se uma estrutura / biblioteca for escrita em linguagens de programação poliglota, apenas captarei apenas a linguagem principal.

Motores de busca

Em 1997, Doug Cutting estava tentando desenvolver um mecanismo de pesquisa de texto completo usando a então linguagem de programação Java “new kid on the block”. Ele concluiu o desenvolvimento do recurso básico em três meses e lançou a biblioteca Java como Lucene para pesquisa / recuperação de informações em 1999. O Lucene é uma biblioteca Java e não pode ser integrado a outras linguagens de programação. O Apache Solr é o mecanismo de pesquisa que oferece um wrapper HTTP em torno do Lucene para que ele possa ser integrado a outras linguagens de programação. O Solr também oferece pesquisa de texto completo distribuída e escalável com o SolrCloud. Como o Lucene, o Solr também foi desenvolvido em Java e originalmente aberto em 2006. Para pesquisar receitas para sua esposa, Shay Banon desenvolveu o mecanismo de pesquisa distribuído Elasticsearch (antigo Compass ). O Elasticsearch oferece uma API RESTful em torno do Lucene, bem como uma pilha completa (ELK) para pesquisa de texto completo distribuído. Foi lançado em 2010 e desenvolvido em Java . Esfinge é o mecanismo de pesquisa final distribuído nesta lista. Em 2001, Andrew Aksyonoff começou a desenvolver o mecanismo de busca Sphinx para pesquisar sites baseados em banco de dados. A Sphinx oferece o REST, bem como o cliente de pesquisa SQL (SphinxQL) e desenvolvido em C ++ .

Sistemas de arquivos

Em 2002, Doug Cutting e Mike Cafarella estavam trabalhando no Project Nutch para rastrear e indexar toda a Internet. Em 2003, eles atingiram o limite de uma máquina e quiseram dimensioná-la em quatro máquinas, mas enfrentaram o problema de mover dados entre nós, alocação de espaço ( History of Hadoop ). Em 2003, o Google publicou seu documento do sistema de arquivos do Google . Tomando o modelo de papel do Google, Doug Cutting e Mike Cafarella desenvolveu o Hadoop Distributed File Sistema HDFS (então chamado NDFs), que oferece esquema menos, falha do sistema durável, Tolerante armazenamento distribuído. O HDFS desempenhou um papel fundamental no desenvolvimento do ecossistema Hadoop e dos frameworks Big Data. Embora o Hadoop MapReduce esteja perdendo seu apelo para estruturas mais novas (Spark / Flank), o HDFS ainda é usado como o sistema de arquivos distribuído de fato. Como outras estruturas do Hadoop, ela foi desenvolvida em Java e aberta em 2005. Na Gluster Inc. , Anand Babu Periasamy desenvolveu um GlusterFS de armazenamento distribuído definido por software para dados de grande escala. Aberto em 2010, o GlusterFS está escrito em C. Inspirado pelo artigo do Facebook Encontrando uma agulha no Haystack: o armazenamento de fotos do Facebook , Chris Lu implementou um sistema de arquivos distribuído simples e altamente escalável chamado SeaweedFS, que pode armazenar bilhões de arquivos. Foi aberto em 2011 e escrito em Go . Outra plataforma poderosa de armazenamento distribuído é o Ceph, que oferece armazenamento em nível de objeto, bloco e arquivo. O Ceph foi inicialmente desenvolvido pela Inktank e atualmente desenvolvido por um grupo de empresas lideradas pela Red Hat . Embora tenha sido anunciado primeiro em 2006, o Ceph tem seu primeiro lançamento estável em 2012. Seus sistemas de arquivos, CephFS , são escritos em Rust, embora o armazenamento de objetos Ceph esteja escrito em C ++ . O Fraunhofer Institute na Alemanha desenvolveu um sistema de arquivos Parallel Cluster BeeGFS otimizado para computação de alto desempenho com foco em flexibilidade, escalabilidade e usabilidade. A primeira versão beta do BeeGFS foi lançada em 2007. É desenvolvida em C ++ de uma maneira muito compacta (~ 40k linhas de código). Embora o BeeGFS seja um sistema de arquivos paralelo e usado extensivamente nos Super Computers, ele pode ser usado como uma alternativa mais rápida ao HDFS.

Processamento em lote

Depois de desenvolver o HDFS , Doug Cutting e Mike Cafarella quiseram executar computação em larga escala em várias máquinas para o Project Nutch . Inspirado pelo Google Map Reduce Doug Cutting e uma equipe do Yahoo começaram a desenvolver computação distribuída em grande escala usando hardware de commodity e o Hadoop MapReduce nasceu. Lançado pela primeira vez em 2005, o Hadoop MapReduce juntamente com o HDFS teve enorme sucesso e abriu caminho para todo um ecossistema de frameworks Data Intensive, incluindo Yarn, HBase, Zookeeper e outros. Como Lucene e Nutch, o Hadoop MapReduce e quase todo o ecossistema do Hadoop foi desenvolvido em Java e, sem dúvida, definiu o Java como a linguagem de programação de fato no domínio Data Intensive. Se o Hadoop MapReduce foi pioneiro em computação distribuída em larga escala, o Apache Spark é a estrutura de processamento de lote mais dominante no momento. Desenvolvido no famoso Berkley AMPLab, liderado por Matei Zaharia , ele trata das limitações do framework Hadoop MapReduce (por exemplo, armazenar dados após cada Map Job). Além disso, o Spark oferece uma maneira de compor múltiplos Job como um pipeline de processamento de dados de maneira similar ao Unix, e fornece uma API amigável ao desenvolvedor para programar as tarefas distribuídas usando RDD, DataSet, DataFrame . O Spark é desenvolvido principalmente no Scala e lançado em 2014. O Apache Flink é outro framework de computação Cluster muito popular e promissor. Como Spark, também veio da academia e originou-se do projeto Stratosphere da TU Berlin Big Data. Ao contrário do Spark, que é um framework Batch-first, o Flink é uma estrutura do Stream first e manipula o Batch Job como um caso especial do Stream. Como o Spark, o Flink também oferece API amigável ao desenvolvedor para programar computação distribuída usando DataSet, DataStream . O Flink é escrito principalmente em Java e lançado em 2015.

Processamento de Fluxo

O envio de mensagens é uma das formas preferidas de se comunicar entre processos / Micro Serviços / sistemas por causa de sua natureza assíncrona. Predominantemente, o sistema de mensagens é implementado por meio de uma Fila, onde os produtores escrevem mensagens na Fila, os consumidores leem as mensagens da Fila e, assim que todos os consumidores lerem a mensagem, ela é excluída da Fila (estilo ignorar e esquecer). Quando o Linkedin quebrou seu aplicativo Monolith muito grande para muitos Micro Services, eles tiveram a questão de lidar com o fluxo de dados entre os Micro Services de forma escalonável, sem nenhum ponto único de falha. Um grupo de Engenheiros do Linkedin ( Jey Kreps, Neha Narkhede, Jun Rao ) usou Log distribuído (como write ahead log in Databases) em vez de Pub / Sub Queue para mensagens e desenvolveu o Apache Kafka . Assim como os sistemas de arquivos ou bancos de dados no processamento em lote, o Kafka funciona como uma “ única fonte de verdade ” no mundo de processamento do Stream e usado intensamente para o fluxo de dados entre os Microservices. O Kafka é desenvolvido principalmente em Java e aberto pela primeira vez em 2011. O Yahoo desenvolveu o Apache Pulsar como uma estrutura distribuída do Messaging que oferece mensagens baseadas em Log (como Kafka) e mensagens baseadas em fila. O Apache Pulsar foi aberto em 2016 e desenvolvido principalmente em Java . A Rabbit Technologies Inc. desenvolveu o tradicional sistema Pub-Sub baseado em filas, o RabbitMQ . Foi lançado pela primeira vez em 2007 e desenvolvido usando Erlang . O ActiveMQ é outro sistema Pub-Sub baseado em Filas que implementa o Java Message Service (JMS). Foi inicialmente desenvolvido pela empresa LogicBlaze e aberto em 2004. O ActiveMQ é desenvolvido em Java . Um sistema pub-sub distribuído baseado em Fila relativamente novo, mas muito promissor é o NATS . É desenvolvido por Derek Collison no CloudFoundry em um fim de semana usando Ruby. O NATS foi lançado em 2016 e mais tarde reimplementado no Go .

Bancos de dados

Eu usei o ranking da DB-Engines para obter os 5 principais bancos de dados distribuídos do século XXI . De acordo com esse ranking, o MongoDB está classificado em 5º lugar e foi substituído apenas pelos bancos de dados Big Four SQL. O MongoDB é um banco de dados orientado a documentos distribuído desenvolvido pela 10gen (atualmente MongoDB Inc. ) e lançado em 2009. É um dos bancos de dados NoSQL mais populares e usados principalmente em C ++ . Outro banco de dados NoSQL imensamente popular é o Redis, que é um banco de dados de armazenamento de valor de chave distribuído. Em 2001, um desenvolvedor italiano Salvatore Sanfilippo começou a desenvolver o Redis para resolver o problema de escalabilidade de sua startup. Lançado em 2009, o Redis é escrito em C. Avinash Laskshman (co-autor do artigo da Amazon Dynamo) e Prashant Malik desenvolveu o Cassandra no Facebook para melhorar a pesquisa na caixa de entrada do Facebook. Fortemente influenciada pelo artigo do Google BigTable e do Amazon Dynamo , Cassandra foi aberta pelo Facebook em 2008. O Cassandra é tanto um repositório de valor de chave distribuído quanto um repositório de colunas largas que é usado predominantemente para séries temporais ou dados OLAP e escrito em Java . Parte do projeto Apache Hadoop, o HBase é desenvolvido como um banco de dados de coluna distribuída e lançado em 2008. Como quase todo o ecossistema Hadoop, o HBase é desenvolvido em Java . Neo4j é o banco de dados NoSQL final nesta lista e padrão de fato como banco de dados de gráficos. Desenvolvido por Neo4j, Inc , foi lançado em 2007 e escrito em Java .

Veredito

Se considerarmos as linguagens de programação usadas na maioria das estruturas Data Intensive dominantes, então há um vencedor claro: Java . Embora criticado nos primeiros dias como uma linguagem lenta, o Java claramente superou as linguagens do Metal próximo, como C, C ++ ou algumas linguagens amigáveis de concorrência como Erlang, Scala neste campo. Aqui estou listando cinco razões principais para o sucesso do Java nos frameworks Data Intensive:

  • JVM : Embora as máquinas virtuais de processo existam desde 1966, a JVM levou o conceito de máquina virtual a outro nível e desempenhou um grande papel na popularidade de Java e no uso de Java nas estruturas Data Intensive. Com a JVM, o Java abstraiu a máquina de baixo nível dos desenvolvedores e deu a primeira linguagem de programação popular “Write Once, Run anywhere”. Além disso, com o suporte da Generation Garbage Collection, o desenvolvedor não precisa se preocupar com o gerenciamento do ciclo de vida do objeto (embora tenha uma parcela de problemas) e possa se concentrar totalmente no problema do domínio. O primeiro Sun e mais tarde o Oracle melhorou a JVM ao longo dos anos e atualmente a JVM é a gigantesca batalha que passou no teste do tempo. Há uma razão pela qual muitas linguagens (por exemplo, Kotlin, Scala, Clojure) também usam a JVM em vez de desenvolver sua própria máquina virtual.
  • Suporte Linguístico e Frameworks: Como o Java foi desenvolvido 23 anos depois de C e 10 anos depois de C ++, James Gosling e col. A Sun analisou claramente os pontos problemáticos do C / C ++ e tentou resolver esses problemas em Java. Java introduziu suporte a idiomas para multithreading, tratamento de exceção / erro, serialização, RTTI, reflexões desde o início. Além disso, o Java oferece um grande ecossistema de bibliotecas que facilitam o desenvolvimento do software em Java. É verdade que, com arquitetura e algoritmo de software semelhantes, o C / C ++ pode superar muito o Java na maioria das vezes. Mas, em muito tempo, a arquitetura de software e o paradigma de programação desempenham um papel maior no desempenho de um aplicativo, em vez de na linguagem de programação. Esta é a razão pela qual o framework Hadoop MapReduce desenvolvido em Java superou o framework similar desenvolvido em C ++ no Yahoo .
  • Produtividade do Desenvolvedor: A produtividade do desenvolvedor é o Santo Graal na indústria, na maioria das vezes, a hora do desenvolvedor é um recurso mais caro do que a CPU / Memória. Quando o Java chegou pela primeira vez em 1995, era muito mais simples, mais enxuto comparado ao C / C ++, o que leva a um tempo de desenvolvimento mais rápido. Como Bjarne Stroustrup (criador de C ++) apontou , o Java evoluiu mais tarde para uma linguagem mais pesada e complexa, mas durante 2000–2010, quando a maioria dos frameworks Data Intensive dominantes foi desenvolvida, Java era provavelmente a melhor linguagem que equilibrava o equilíbrio entre produtividade e desempenho do desenvolvedor. Além disso, a produtividade do desenvolvedor leva a um ciclo de desenvolvimento mais curto, que foi significativamente importante para os primeiros frameworks Data Intensive.
  • Tolerância a falhas: Um dos principais objetivos do Data Intensive Frameworks é usar hardware barato, em vez de hardware especial dispendioso. A desvantagem dessa abordagem é que o hardware comum pode falhar e a tolerância a falhas é a base dos aplicativos Data Intensive. Com o suporte a linguagem embutida de tratamento de erros, coleta de lixo geracional, verificação vinculada e programação independente de hardware, o Java oferece melhor tolerância a falhas em comparação com C / C ++.
  • Fator Hadoop: O uso do Java no ecossistema Hadoop desempenhou um grande papel na adaptação geral do Java no domínio Data Intensive e funcionou como uma propaganda para o Java. Como o HDFS e o Hadoop MapReduce foram indiscutivelmente os primeiros frameworks Data Intensive, os frameworks posteriores sempre os observaram e usaram o Java comprovado pelo Hadoop para desenvolver sua própria estrutura Data Intensive.

Futuro

Todos os anos, o volume e a velocidade dos dados aumentam exponencialmente e trazem novos desafios. Além disso, o panorama Data Intensive é tão diverso que a idade de “uma solução para todos” acabou. Embora com o Advento do GraalVM e as novas coleções Garbage ( ZGC ), o Java será dominante na paisagem do Big Data, no entanto, acredito que o Java conceda seu espaço a outras linguagens. Quais são as linguagens de programação que podem deslocar o Java nos frameworks Data Intensive nos próximos anos? Espero escrever em um post de acompanhamento.