Hadoop: fundamentos e instalação

Este artigo aborda os fundamentos básicos e a instalação da tecnologia Apache Hadoop em um ambiente para desenvolvimento de aplicações que manipulam grandes volumes de dados (big data).

Fique por dentro
Este artigo aborda os fundamentos básicos e a instalação da tecnologia Apache Hadoop em um ambiente para desenvolvimento de aplicações que manipulam grandes volumes de dados (Big Data).

Hadoop destaca-se como uma tecnologia aberta, baseada no paradigma MapReduce, que utiliza a computação paralela e distribuída para resolver o problema da escalabilidade no processamento de BigData, com garantias de tolerância a falhas. Das vantagens em adotá-lo, está o fato de se utilizar aglomerados de máquinas convencionais, tornando-o eficaz como solução de baixo custo de implantação. Ademais, com ele as empresas podem conquistar uma grande vantagem competitiva, dispondo de um mecanismo que possibilita avaliar grandes quantidades de dados em busca de novas informações.


Guia do artigo:

Vivenciamos a era da informação, na qual volumes expressivos de dados são produzidos pelas mais diversas organizações e estruturas de sistemas, alcançando dimensões que superam com facilidade os petabytes diários. Tal volume surge de diversas fontes de dados, como, por exemplo, medições coletadas por sensores dos mais diversos tipos, histórico dos serviços oferecidos por sistemas Web, variados conteúdos produzidos pelos usuários em redes sociais, acesso a bases de dados de imagens e mapas, e muito mais. Tais fontes heterogêneas produzem uma quantidade de dados acima da capacidade que normalmente pode ser processada por tecnologias tradicionais de banco de dados relacional.

Nesse contexto, o termo Big Data (aqui denominado Bigdata) foi definido considerando as seguintes questões:

  1. Volume de dados em grande quantidade (acima de terabytes);
  2. Velocidade nacriação e captura de dados brutos a taxas muito rápidas, podendo ser arquivos em lote, obtidos de bancos de dados, ou dados gerados em tempo real (em streaming); e,
  3. Variedade no formato dos dados, podendo ser estruturado, semiestruturado, e até mesmo não estruturado, ou uma combinação dessas variações. Essas três questões estão ilustradas na Figura 1.
Figura 1. As três dimensões do Bigdata: volume, variedade e velocidade

Assim, considerando as características extremas do Bigdata, uma nova classe de aplicações deve ser construída para analisar grandes bases de dados, processar pesados cálculos sobre esses dados, identificar comportamentos e disponibilizar serviços especializados em seus domínios.

Entretanto, não é uma tarefa trivial implementar tais soluções, pois há, na maioria das vezes, a inviabilidade de executá-las no modelo computacional tradicional, usando tecnologias baseadas em banco de dados relacional, e processando em máquinas com escalabilidade baixa. Os ditos problemas grandes ou complexos chegam a consumir horas ou dias de processamento nas arquiteturas convencionais. Embora em constante evolução, os recursos computacionais convencionais são insuficientes para acompanhar a crescente complexidade das novas aplicações.

Como proposta para superar os desafios, surge o Apache Hadoop, um framework para o processamento de grandes quantidades de dados em aglomerados e grades computacionais. A ideia de promover soluções para os desafios dos sistemas distribuídos em uma só plataforma é o ponto central do projeto Hadoop. Nessa plataforma, problemas como integridade dos dados, disponibilidade dos nós, escalabilidade da aplicação e recuperação de falhas são simplificadas para quem desenvolve as aplicações.

Além disso, seu modelo de programação e sistema de armazenamento dos dados promove um rápido processamento, muito superior às outras tecnologias similares. Atualmente, além de estar consolidado no mundo empresarial, o Hadoop tem obtido crescente apoio da comunidade acadêmica, proporcionando, assim, estudos científicos e práticos.

Com base em tudo o que foi citado, este artigo apresenta os fundamentos das técnicas e dos conceitos envolvidos no projeto Apache Hadoop, em especial o modelo de programação MapReduce. Em seguida, são detalhadas as etapas para a instalação e configuração de um ambiente Hadoop a ser utilizado no desenvolvimento e testes de aplicações Bigdata.

O que é o Apache Hadoop?

O Apache Hadoop é um framework open source para o armazenamento e processamento de dados em larga escala. Ele oferece como ferramentas principais uma implementação do modelo MapReduce, responsável pelo processamento distribuído, e o Hadoop Distributed File System (HDFS), para armazenamento de grandes conjuntos de dados, também de forma distribuída.

Embora recente, o Apache Hadoop tem se destacado como uma ferramenta eficaz, sendo utilizado por grandes corporações como IBM, Oracle, Facebook, Yahoo!, entre outras. Mas para chegar nesse ponto, alguns eventos importantes ocorreram nos últimos dez anos, como demonstram os fatos históricos a seguir:

Ao ser hospedado como um projeto da Apache Software Foundation, o Hadoop segue o modelo de licenciamento da Apache, bem mais flexível que outras modalidades de licença para software livre, permitindo modificações e redistribuição do código-fonte. Dessa forma, várias empresas surgiram no mercado distribuindo implementações do Hadoop.

Cada uma dessas implementações normalmente acrescenta novas funcionalidades, aplicam especificidades de um nicho de mercado, ou ainda se limitam a prestação de serviços como implantação, suporte e treinamento. Dentre algumas empresas com estes objetivos temos a Amazon Web Service, Cloudera, Hortonworks, KarmaSphere, Pentaho e Tresada. Atualmente, a Cloudera é uma das líderes no mercado, chefiada por Douglas Cutting, um dos criadores do Apache Hadoop original.

Nota: A licença Apache exige a inclusão do aviso de direitos autorais (copyright) e termo de responsabilidade, mas não é uma licença totalmente livre, comcopyleft, permitindo seu uso em um software comercial.

Arquitetura Hadoop

Os componentes chave do Hadoop são o modelo de programação MapReduce e o sistema de arquivos distribuído HDFS. Entretanto, em meio a sua evolução, novos subprojetos, que são incorporados como componentes à arquitetura Hadoop, completam a infraestrutura do framework para resolver problemas específicos. Uma visão simplificada dessa organização de componentes pode ser vista na Figura 2.

Na camada de armazenamento de dados há o sistema de arquivos distribuído Hadoop Distributed File System (HDFS), um dos principais componentes do framework. Já na camada de processamento de dados temos o MapReduce, que também figura como um dos principais subprojetos do Hadoop. Na camada de acesso aos dados são disponibilizadas ferramentas como Pig, Hive, Avro, Mahout, entre outras.

Estas ferramentas tendem a facilitar a análise e consulta dos dados, fornecendo uma linguagem de consulta similar às utilizadas em bancos de dados relacionais (como a SQL, por exemplo). Assim, todo um ecossistema em volta do Hadoop é criado com ferramentas que suprem necessidades específicas; por exemplo, ZooKeeper, Flume e Chukwa, que melhoram a camada de gerenciamento. Essas ferramentas fornecem uma interface com o usuário que busca diminuir as dificuldades encontradas no manuseio das aplicações que rodam nessa plataforma.

Figura 2. Componentes da arquitetura Hadoop

Para funcionar, uma aplicação Hadoop exige no mínimo a utilização das ferramentas da camada de armazenamento (HDFS) e processamento MapReduce. As demais camadas podem ser adicionadas conforme a necessidade. A seguir, cada componente é explicado em sua essência.

Componentes principais

O projeto Hadoop, em sua versão estável (a 1.0), atualmente sob a tutela da Fundação Apache, inclui os seguintes módulos, mantidos como subprojetos:

Componentes adicionais

Além desses, há outros projetos na comunidade Apache que adicionam funcionalidades ao Hadoop, como:

Funcionamento da arquitetura básica

O Hadoop fornece uma arquitetura para que aplicativos MapReduce funcionem de forma distribuída em um cluster de máquinas, organizadas em uma máquina mestre e várias escravo. Para simplificar o desenvolvimento dessas aplicações, é possível instalar e executar o framework no modo simplificado, utilizando apenas uma máquina (que irá simular um ambiente paralelizável/distribuído).

Para que o Hadoop funcione, é necessários cinco processos: NameNode, DataNode, SecondaryNameNode, JobTracker e TaskTracker. Os três primeiros são integrantes do modelo de programação MapReduce, e os dois últimos do sistema de arquivo HDFS. Os componentes NameNode, JobTracker e SecondaryNameNode são únicos para toda a aplicação, enquanto que o DataNode e JobTracker são instanciados para cada máquina do cluster.

Considerando os dois principais componentes do Hadoop (MapReduce e HDFS), a arquitetura básica será explica a seguir.

HDFS (Hadoop Distributed File System)

Um sistema de arquivos distribuído é responsável pela organização, armazenamento, localização, compartilhamento e proteção de arquivos que estão distribuídos em computadores de uma rede. Em sistemas distribuídos, quando mais de um usuário tenta gravar um mesmo arquivo simultaneamente, é necessário um controle da concorrência (acesso simultâneo ao mesmo recurso) para que haja uma operação atômica dos processos a fim de garantir a consistência das informações.

Neste caso, um sistema de arquivos distribuídos deve garantir a atomicidade nas operações de leitura, escrita, criação ou remoção de um arquivo, de forma transparente para quem manipula os dados, como se fosse similar a um sistema de arquivos local.

Nota: Um sistema de arquivos é um componente do sistema operacional que permite ao usuário interagir com os arquivos e diretórios, seja para salvar, modificar ou excluir arquivos e diretórios (pastas), bem como instalar, executar ou configurar programas. Um sistema de arquivos distribuído faz tudo isso, mas em um ambiente de rede, onde os arquivos estão fisicamente espalhados em máquinas distintas. Para quem usa tais arquivos, o sistema deve permitir as mesmas facilidades de um sistema de arquivos local.

O HDFS atua como um sistema de arquivos distribuído, localizado na camada de armazenamento do Hadoop, sendo otimizado para alto desempenho na leitura e escrita de grande arquivos (acima dos gigabytes) que estão localizados em computadores (nós) de um cluster.

Dentre as características do HDFS estão a escalabilidade e disponibilidade graças à replicação de dados e tolerância a falhas. O sistema se encarrega de quebrar os arquivos em partes menores, normalmente blocos de 64MB, e replicar os blocos um número configurado de vezes (pelo menos três cópias no modo cluster, e um no modo local) em servidores diferentes, o que torna o processo tolerante a falhas, tanto em hardware quanto em software.

O fato é que cada servidor tem muitos elementos com uma probabilidade de falha, o que significa que sempre haverá algum componente do HDFS falhando. Por serem críticas, falhas devem ser detectadas de forma rápida e eficientemente resolvidas a tempo de evitar paradas no sistema de arquivos do Hadoop.

A arquitetura do HDFS é estruturada em master-slave (mestre-escravo), com dois processos principais, que são:

MapReduce

O MapReduce é um modelo computacional para processamento paralelo das aplicações. Ele abstrai as dificuldades do trabalho com dados distribuídos, eliminando quaisquer problemas que o compartilhamento de informações pode trazer em um sistema dessa natureza. Consiste das seguintes funções:

A arquitetura do MapReduce segue o mesmo princípio master-slave, necessitando de três processos que darão suporte à execução das funções map e reduce do usuário, a saber:

Na Figura 3 observa-se como os processos da arquitetura do Hadoop estão interligados, organizados em nós mestre e escravos. O mestre contém o NameNode, o JobTracker e possivelmente o SecondaryNameNode. Já a segunda camada, constituída de nós escravos, comporta em cada uma de suas instâncias um TaskTracker e um DataNode, vinculados respectivamente ao JobTracker e ao NameNode do nó mestre.

Uma tarefa (task) que roda em um nó escravo pode ser tanto de uma função map quanto de uma função reduce.

Figura 3. Funcionamento da arquitetura básica do Hadoop

Instalação do ambiente Hadoop

O Hadoop possui três formas de instalação e execução da plataforma:

Na prática, é possível alternar entre essas configurações bastando que se editem as propriedades relacionadas em três arquivos: core-site.xml, hdfs-site.xml e mapred-site.xml. A seguir, é realizada a instalação do modo padrão (local), e no final é demonstrado o funcionamento da plataforma com a execução de uma aplicação exemplo.

Configuração do ambiente no modo local

O Hadoop está disponível como pacote open-source no portal da Apache (ver seção Links). Neste endereço você encontra a versão mais estável (1.2.x), a versão preliminar de atualização (a 2.x) e todas as versões anteriores a mais estável.

Entretanto, há no mercado versões que empacotam todo o ambiente de execução, bem como as configurações da plataforma operacional para a maioria das distribuições Linux atualmente em uso (Ubuntu, CentOS, RedHat, etc.).

Entre essas versões comerciais, porém gratuitas, uma das mais utilizadas é a ofertada pela empresa Cloudera (ver seção Links), denominada CDH (atualmente nas versões 3.x e 4.x), que pode ser instalada em uma máquina virtual (VMware, por exemplo), baseada no Linux CentOS.

Para efeito de demonstração, foi escolhida a instalação padrão do projeto Apache. Neste caso, é necessário verificar se a instalação Linux escolhida está configurada com os pacotes Java e SSH. Para os exemplos deste artigo, foi utilizado o seguinte ambiente: Linux Ubuntu 12.x, Java JDK 1.7, Apache Hadoop-1.2.1.

Após a definição e ativação do sistema operacional Linux, é recomendado criar um usuário e um grupo dedicados para o Hadoop, executando os comandos vistos na Listagem 1.

// Criando grupo com o nome “hadoopgrupo”: $ sudo addgroup hadoopgrupo // Adicionado o usuário “hadoop” ao grupo: $ sudo adduser --ingroup hadoopgrupo hadoop
Listagem 1. Comandos para criação de usuário e grupo

Em seguida, providencie uma chave de autenticação SSH. Isso se faz necessário porque o Hadoop utiliza conexão segura (SSH) para gerenciar seus nós (mestre e escravos). No caso de conexão local (localhost), não há necessidade de senha na configuração do SSH. Os comandos vistos na Listagem 2 mostram como criar a chave de conexão SSH para o localhost.

$ ssh-keygen -t rsa -P “” $ cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
Listagem 2. Comandos para criação da chave SSH

Certifique-se que o Hadoop esteja instalado na versão definida neste artigo (a 1.2.x). Uma forma de instalar o Hadoop no Linux é baixando o pacote a partir de um endereço homologado pela Apache. Em nosso exemplo, a opção foi a oferecida pela Unicamp. Os comandos para esse tipo de instalação podem ser vistos na Listagem 3.

$ cd /usr/local $ sudo wget http://ftp.unicamp.br/pub/apache/hadoop/core/hadoop-1.2.1/ hadoop-1.2.1.tar.gz $ sudo tar xzf hadoop-1.2.1.tar.gz $ sudo ln -s hadoop-1.2.1 hadoop $ sudo chown -R hadoop:hadoopgrupo hadoop-1.2.1
Listagem 3. Comandos para instalação do pacote Hadoop

Logo após, adicione a variável de ambiente da instalação Java (variável $JAVA_HOME) com os comandos (confirme os locais e versões do Java) mostrados na Listagem 4.

$sudo nano /usr/local/hadoop/conf/haoop-env.sh export JAVA_HOME=/usr/lib/jvm/java-7-oracle
Listagem 4. Configuração da variável de ambiente para o compilador Java

A instalação exige que se crie um diretório que servirá de apoio ao armazenamento temporário dos arquivos de uma aplicação cliente, que serão manipulados no HDFS. Para isso, crie esse diretório com o nome tmp, executando os comandos da Listagem 5.

$sudo mkdir /home/hadoop/tmp $sudo chown hadoop:hadoopgrupo /home/hadoop/tmp $sudo chmod 750 /home/hadoop/tmp
Listagem 5. Diretório tmp para apoio ao ambiente HDFS

Agora, atualize a referência ao caminho do diretório no arquivo de configuração, editando o arquivo core-site.xml, como é visto na Listagem 6.

$sudo nano /usr/local/hadoop/conf/core-site.xml
Listagem 6. Editando o arquivo de configuração core-site.xml

Neste arquivo de configuração, adicione o código visto na Listagem 7 entre as tags <configuration > e </configuration > . Dentro dessa marcação XML ficam todas as propriedades de configurações básicas do Hadoop, como a localização da pasta de arquivos temporários e o host do serviço do HDFS (hdfs://localhost:54310).

<configuration> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/tmp</value> <description>A base for other temporary directories.</description> </property> <property> <name>fs.default.name</name> <value>hdfs: //localhost:54310</value> <description>The name of the default file system. A URI whose scheme and authority determine the FileSystem implementation. The uri"s scheme determines the config property (fs.SCHEME.impl) naming the FileSystem implementation class. The uri"s authority is used to determine the host, port, etc. for a filesystem.</description> </property> </configuration>
Listagem 7. Atualizando a configuração do arquivo "core-site.xml"

Do mesmo modo, edite o arquivo de configuração hdfs-site.xml, como visto na Listagem 8.

$ sudo nano /usr/local/hadoop/conf/hdfs-site.xml
Listagem 8. Editando o arquivo hdfs-site.xml

No código deste arquivo, adicione o conteúdo mostrado na Listagem 9. Na propriedade dfs.replication você estabelece o fator de replicação padrão dos blocos de dados no HDFS. Esse valor define o número de réplicas que serão criadas e, normalmente, em uma instalação local do Hadoop (usada neste artigo), assume o valor “1”.

<configuration> <property> <name>dfs.replication</name> <value>1</value> <description>Default block replication. The actual number of replications can be sepecified when the file is created. The default is used if replication is not specified in create time. </description> </property> </configuration>
Listagem 9. Configuração do arquivo hdfs-site.xml

Feito isso, formate o sistema de arquivos para inicializar as pastas do nó principal do HDFS e permitir o uso do MapReduce, conforme os comandos da Listagem 10. O resultado desse processo é visto na Figura 4.

$su - hadoop $ /usr/local/hadoop/bin/hadoop namenode –format
Listagem 10. Formatação do sistema de arquivos
Figura 4.Tela com as mensagens da formatação do NameNode

O passo seguinte é preparar o Hadoop para ser utilizado, levantando todos os seus processos na memória. Para isso, execute o arquivo de comandos start-all.sh, confirmando o processo no final com “yes”. Depois, para verificar se tudo foi corretamente executado, chame o comando jps. Veja a sequência das instruções na Listagem 11 e o resultado na Figura 5.

$ /usr/local/hadoop/bin/start-all.sh $ jps
Listagem 11. Inicialização do Hadoop
Figura 5. Processos do Hadoop em execução
Nota:Para evitar a necessidade de digitar o caminho completo do Hadoop até os arquivos executáveis no momento de executar um comando, configuraremos a variável de ambiente PATH . Considerando que o caminho (diretório) onde estão localizados os comandos (arquivos executáveis) é o diretório de instalação (/usr/local/hadoop/bin), abra o arquivo bashrc (use nano ~/.bashrc) e acrescente esse caminho à variável PATH usando o código: export PATH=$PATH:/usr/local/hadoop/bin.

Teste do ambiente Hadoop

Para validar o ambiente, o Hadoop disponibiliza o clássico exemplo de contar palavras (WordCount), que ilustra de forma didática a execução de uma aplicação MapReduce. Esse exemplo utiliza como entrada de dados um conjunto de arquivos texto, a partir dos quais a frequência das palavras será contada. Como saída, será gerado outro arquivo texto contendo cada palavra e a quantidade de vezes que cada uma foi encontrada.

Para ilustrar esse processamento, baixe uma coleção de dados sobre livros da biblioteca Gutenberg (ver seção Links), cujo conteúdo está disponível para uso livre em diversos formatos (HTML, PDF, TXT, ePub, entre outros). Neste caso, foi feito o download do arquivo texto pg20417.txt para uma pasta chamada gutenberg, conforme demonstra os comandos da Listagem 12.

$ mkdir gutenberg $ lynx -dump http://www.gutenberg.org./cache/epub/20417/pg20417.txt > gutenberg/pg20417.txt
Listagem 12. Download do arquivo de entrada

Em seguida, usando o comando de cópia de pasta (copyFromLocal) do sistema HDFS, transfira o conteúdo da pasta que contém o arquivo de palavras (pg20417.txt) ao ambiente Hadoop. Para isto, execute: hadoop dfs -copyFromLocal gutenberg gutenberg.

Feito isso, abra a pasta do Hadoop e execute o exemplo WordCount (distribuído no pacote do framework), como demonstra a Listagem 13. Observe que o caminho /user/hadoop/gutenberg representa a entrada (in), e /user/hadoop/gutenberg-output, a pasta com a saída do processo reduce.

$ cd /usr/local/hadoop $ hadoop jar hadoop-examples-1.2.1.jar wordcount /user/hadoop/gutenberg /user/hadoop/gutenberg-output
Listagem 13. Executando as funções map e reduce do contador de palavras

No final do MapReduce é produzido um arquivo (denominado part-r-00000) que armazena a contagem de palavras presentes nos arquivo da pasta de entrada do Hadoop. Para ver esse conteúdo, execute o comando hadoop dfs -cat/user/hadoop/gutenberg-output/part-r-00000. A Figura 6 apresenta um trecho do resultado.

Figura 6 . Trecho do resultado do processo de contagem de palavras

Conclusão

Este artigo apresentou a ferramenta Hadoop como proposta para o processamento de grandes conjuntos de dados, que aqui chamamos de Bigdata . A ideia principal do funcionamento dessa ferramenta está no uso da técnica MapReduce, que permite a análise e tratamento desses dados facilitando a construção de aplicações que sigam o modelo previsto em duas funções, uma para o map e outra para o reduce.

Definidas as funções do MapReduce, Hadoop realiza o processamento distribuído em um conjunto (cluster) de computadores de baixo custo. O modelo de programação e a infraestrutura disponível na arquitetura MapReduce se encarregam de particionar e distribuir os dados de entrada, escalonar as execuções das funções map e reduce em máquinas distintas, tratar as falhas e a comunicação entre essas máquinas. Para assegurar a integridade e o controle dos dados na rede, Hadoop também apresenta um sistema de arquivos distribuído, o HDFS, fundamental para o funcionamento da arquitetura. O HDFS fornece os mecanismos que garantem a transparência na manipulação dos arquivos, com segurança e alto desempenho.

As características supracitadas constituem o sucesso da tecnologia, mas a sua adoção é restrita ao domínio de problemas que possam ser formulados e resolvidos dentro do contexto do paradigma; no caso, os dados devem estar organizados em uma coleção do tipo chave/valor e o processamento deve ser dividido em duas funções que se complementam, o map e o reduce.

Apesar de fazer parte de um projeto de código aberto, mantido pela comunidade Apache, Hadoop mostra ser, em pouco tempo de vida, uma tecnologia com maturidade e confiabilidade. Prova disso é a decisão que várias empresas de tecnologia da informação fizeram ao adotá-la para resolver seus problemas.

Além de usar essa tecnologia, gigantes como IBM, Google, Yahoo! e Oracle apostam e investem em projetos relacionados ao Hadoop e MapReduce.


Saiu na DevMedia!

  • Android Developer:
    Aprenda a programar e depurar aplicativos no Android Studio. Com os cursos desta série você saberá quais são as principais classes do Android SDK e conhecerá os componentes de aplicativo, criando os seus primeiros projetos.
  • MVC e Regras de negócio:
    Em uma arquitetura MVC, temos três camadas com diferentes responsabilidades. Em qual destas camadas deveria estar a regra de negócio da aplicação? Saiba isso e muito mais nesta série.

Saiba mais sobre Big Data ;)

  • Big Data na plataforma Java:
    Neste artigo apresentaremos uma visão conceitual sobre o que é big data, onde se originou, seus motivadores e principais usuários. Demonstraremos também modelos de programação como o MapReduce, assim como ferramentas Java para lidar com big data.
  • Analisando o Big Data na teoria e na prática:
    Este artigo irá introduzir o Big Data, apresentando um pouco da historia. Também iremos analisar algumas das principais tecnologias que foram criadas com o principal objetivo de fornecer recursos para se trabalhar com os conjuntos de dados.
  • Big Data em pequenos negócios:
    Veja neste artigo algumas definições sobre do que se trata o Big Data e alguns exemplos de como podemos usar isso a favor dos pequenos negócios.
Links:
  • Página oficial do projeto Apache Hadoop
  • Página oficial do projeto Lucene
  • Artigo que apresenta a técnica MapReduce
  • Artigo que explora os principais recursos da arquitetura do HDFS
  • Site da distribuição Hadoop oferecido pela Cloudera, em sua versão comunitária (aberta)
  • Projeto Gutenberg para livros eletrônicos grátis em língua portuguesa
Livros
  • Hadoop: The Definitive Guide - 3rd Edition. Tom White. O"Reilly. 2012. O livro aborda o tema Hadoop de forma didática e atualizada em sua atual versão (2.x), apresentando estudos de caso usados para resolver problemas no modelo mapreduce.
Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados