Hadoop - Guia rápido
“90% dos dados mundiais foram gerados nos últimos anos.”
Devido ao advento de novas tecnologias, dispositivos e meios de comunicação, como sites de redes sociais, a quantidade de dados produzidos pela humanidade está crescendo rapidamente a cada ano. A quantidade de dados produzidos por nós desde o início dos tempos até 2003 foi de 5 bilhões de gigabytes. Se você empilhar os dados na forma de discos, eles podem preencher um campo de futebol inteiro. A mesma quantidade foi criada a cada dois dias em2011, e a cada dez minutos em 2013. Essa taxa ainda está crescendo enormemente. Embora todas essas informações produzidas sejam significativas e possam ser úteis quando processadas, elas estão sendo negligenciadas.
O que é Big Data?
Big dataé uma coleção de grandes conjuntos de dados que não podem ser processados usando técnicas de computação tradicionais. Não é uma única técnica ou ferramenta, ao contrário, tornou-se um assunto completo, que envolve várias ferramentas, técnicas e frameworks.
O que vem no Big Data?
Big data envolve os dados produzidos por diferentes dispositivos e aplicativos. A seguir estão alguns dos campos que estão sob a égide de Big Data.
Black Box Data - É um componente de helicópteros, aviões e jatos, etc. Capta vozes da tripulação de voo, gravações de microfones e fones de ouvido e as informações de desempenho da aeronave.
Social Media Data - As redes sociais, como Facebook e Twitter, contêm informações e visualizações postadas por milhões de pessoas em todo o mundo.
Stock Exchange Data - Os dados da bolsa de valores contêm informações sobre as decisões de 'compra' e 'venda' feitas sobre uma ação de diferentes empresas feitas pelos clientes.
Power Grid Data - Os dados da rede elétrica contêm informações consumidas por um nó específico em relação a uma estação base.
Transport Data - Os dados de transporte incluem modelo, capacidade, distância e disponibilidade de um veículo.
Search Engine Data - Os motores de busca recuperam muitos dados de bancos de dados diferentes.
Portanto, Big Data inclui grande volume, alta velocidade e variedade extensível de dados. Os dados serão de três tipos.
Structured data - Dados relacionais.
Semi Structured data - Dados XML.
Unstructured data - Word, PDF, texto, registros de mídia.
Benefícios do Big Data
Usando as informações mantidas em redes sociais como o Facebook, as agências de marketing estão aprendendo sobre a resposta de suas campanhas, promoções e outros meios de publicidade.
Usando as informações das mídias sociais, como preferências e percepção do produto de seus consumidores, empresas de produtos e organizações de varejo estão planejando sua produção.
Com base nos dados do histórico médico prévio dos pacientes, os hospitais estão prestando um atendimento melhor e mais rápido.
Tecnologias de Big Data
As tecnologias de big data são importantes para fornecer análises mais precisas, o que pode levar a tomadas de decisões mais concretas, resultando em maior eficiência operacional, redução de custos e riscos reduzidos para os negócios.
Para aproveitar o poder do big data, você precisaria de uma infraestrutura que pode gerenciar e processar grandes volumes de dados estruturados e não estruturados em tempo real e pode proteger a privacidade e segurança dos dados.
Existem várias tecnologias no mercado de diferentes fornecedores, incluindo Amazon, IBM, Microsoft, etc., para lidar com big data. Enquanto olhamos para as tecnologias que lidam com big data, examinamos as seguintes duas classes de tecnologia -
Big Data Operacional
Isso inclui sistemas como o MongoDB que fornecem recursos operacionais para cargas de trabalho interativas em tempo real, onde os dados são principalmente capturados e armazenados.
Os sistemas NoSQL Big Data são projetados para aproveitar as vantagens das novas arquiteturas de computação em nuvem que surgiram na última década para permitir que cálculos massivos sejam executados de forma econômica e eficiente. Isso torna as cargas de trabalho operacionais de big data muito mais fáceis de gerenciar, mais baratas e mais rápidas de implementar.
Alguns sistemas NoSQL podem fornecer insights sobre padrões e tendências com base em dados em tempo real com codificação mínima e sem a necessidade de cientistas de dados e infraestrutura adicional.
Big Data Analítico
Isso inclui sistemas como sistemas de banco de dados Massively Parallel Processing (MPP) e MapReduce, que fornecem recursos analíticos para análises retrospectivas e complexas que podem afetar a maioria ou todos os dados.
MapReduce fornece um novo método de análise de dados que é complementar aos recursos fornecidos pelo SQL e um sistema baseado em MapReduce que pode ser escalado de servidores únicos para milhares de máquinas de ponta e baixa.
Essas duas classes de tecnologia são complementares e frequentemente implantadas juntas.
Sistemas Operacionais vs. Analíticos
Operacional | Analítico | |
---|---|---|
Latência | 1 ms - 100 ms | 1 min - 100 min |
Simultaneidade | 1000 - 100.000 | 1 - 10 |
Padrão de Acesso | Escreve e lê | Lê |
Consultas | Seletivo | Não seletivo |
Escopo de Dados | Operacional | Retrospectivo |
Usuário final | Cliente | Cientista de Dados |
Tecnologia | NoSQL | MapReduce, banco de dados MPP |
Desafios de Big Data
Os principais desafios associados ao big data são os seguintes -
- Captura de dados
- Curation
- Storage
- Searching
- Sharing
- Transfer
- Analysis
- Presentation
Para atender aos desafios acima, as organizações normalmente usam a ajuda de servidores corporativos.
Abordagem tradicional
Nessa abordagem, uma empresa terá um computador para armazenar e processar big data. Para fins de armazenamento, os programadores terão a ajuda de sua escolha de fornecedores de banco de dados, como Oracle, IBM, etc. Nesta abordagem, o usuário interage com o aplicativo, que por sua vez lida com a parte de armazenamento e análise de dados.
Limitação
Essa abordagem funciona bem com os aplicativos que processam dados menos volumosos que podem ser acomodados por servidores de banco de dados padrão ou até o limite do processador que está processando os dados. Mas, quando se trata de lidar com grandes quantidades de dados escaláveis, é uma tarefa agitada processar esses dados por meio de um único gargalo de banco de dados.
Solução do Google
O Google resolveu esse problema usando um algoritmo chamado MapReduce. Este algoritmo divide a tarefa em pequenas partes e as atribui a vários computadores, e coleta os resultados deles que, quando integrados, formam o conjunto de dados de resultados.
Hadoop
Usando a solução fornecida pelo Google, Doug Cutting e sua equipe desenvolveu um projeto de código aberto chamado HADOOP.
O Hadoop executa aplicativos usando o algoritmo MapReduce, onde os dados são processados em paralelo com outros. Resumindo, o Hadoop é usado para desenvolver aplicativos que podem realizar análises estatísticas completas em grandes quantidades de dados.
Hadoop é uma estrutura de código aberto Apache escrita em java que permite o processamento distribuído de grandes conjuntos de dados em clusters de computadores usando modelos de programação simples. O aplicativo da estrutura Hadoop funciona em um ambiente que fornece armazenamento e computação distribuída em clusters de computadores. O Hadoop foi projetado para expandir de um único servidor a milhares de máquinas, cada uma oferecendo computação e armazenamento local.
Arquitetura Hadoop
Em sua essência, o Hadoop tem duas camadas principais, a saber -
- Camada de processamento / computação (MapReduce), e
- Camada de armazenamento (Hadoop Distributed File System).
MapReduce
MapReduce é um modelo de programação paralelo para escrever aplicativos distribuídos desenvolvido no Google para processamento eficiente de grandes quantidades de dados (conjuntos de dados de vários terabytes), em grandes clusters (milhares de nós) de hardware comum de maneira confiável e tolerante a falhas. O programa MapReduce é executado no Hadoop, que é uma estrutura de código aberto Apache.
Sistema de arquivos distribuídos Hadoop
O Hadoop Distributed File System (HDFS) é baseado no Google File System (GFS) e fornece um sistema de arquivos distribuído projetado para funcionar em hardware comum. Ele tem muitas semelhanças com os sistemas de arquivos distribuídos existentes. No entanto, as diferenças de outros sistemas de arquivos distribuídos são significativas. É altamente tolerante a falhas e foi projetado para ser implantado em hardware de baixo custo. Ele fornece acesso de alto rendimento aos dados do aplicativo e é adequado para aplicativos com grandes conjuntos de dados.
Além dos dois componentes principais mencionados acima, a estrutura do Hadoop também inclui os dois módulos a seguir -
Hadoop Common - Essas são bibliotecas e utilitários Java exigidos por outros módulos do Hadoop.
Hadoop YARN - Esta é uma estrutura para agendamento de trabalho e gerenciamento de recursos de cluster.
Como o Hadoop funciona?
É muito caro construir servidores maiores com configurações pesadas que lidam com processamento em grande escala, mas como alternativa, você pode unir muitos computadores comuns com uma única CPU, como um único sistema distribuído funcional e, praticamente, as máquinas em cluster podem ler o conjunto de dados em paralelo e fornecem uma taxa de transferência muito maior. Além disso, é mais barato do que um servidor high-end. Portanto, este é o primeiro fator motivacional por trás do uso do Hadoop, executado em máquinas em cluster e de baixo custo.
O Hadoop executa código em um cluster de computadores. Este processo inclui as seguintes tarefas principais que o Hadoop executa -
Os dados são inicialmente divididos em diretórios e arquivos. Os arquivos são divididos em blocos de tamanho uniforme de 128M e 64M (de preferência 128M).
Esses arquivos são então distribuídos em vários nós do cluster para processamento adicional.
O HDFS, estando no topo do sistema de arquivos local, supervisiona o processamento.
Os blocos são replicados para lidar com falhas de hardware.
Verificar se o código foi executado com sucesso.
Executar a classificação que ocorre entre os estágios map e reduzir.
Enviando os dados classificados para um determinado computador.
Gravando os logs de depuração para cada trabalho.
Vantagens do Hadoop
A estrutura do Hadoop permite ao usuário escrever e testar sistemas distribuídos rapidamente. É eficiente e distribui automaticamente os dados e o trabalho entre as máquinas e, por sua vez, utiliza o paralelismo subjacente dos núcleos da CPU.
O Hadoop não depende do hardware para fornecer tolerância a falhas e alta disponibilidade (FTHA); em vez disso, a própria biblioteca do Hadoop foi projetada para detectar e tratar falhas na camada do aplicativo.
Os servidores podem ser adicionados ou removidos do cluster dinamicamente e o Hadoop continua a operar sem interrupção.
Outra grande vantagem do Hadoop é que além de ser open source, é compatível em todas as plataformas por ser baseado em Java.
O Hadoop é compatível com a plataforma GNU / Linux e seus sabores. Portanto, temos que instalar um sistema operacional Linux para configurar o ambiente Hadoop. Caso você tenha um SO diferente do Linux, você pode instalar um software Virtualbox nele e ter o Linux dentro do Virtualbox.
Configuração de pré-instalação
Antes de instalar o Hadoop no ambiente Linux, precisamos configurar o Linux usando ssh(Capsula segura). Siga as etapas fornecidas abaixo para configurar o ambiente Linux.
Criação de um usuário
No início, é recomendado criar um usuário separado para o Hadoop para isolar o sistema de arquivos Hadoop do sistema de arquivos Unix. Siga as etapas abaixo para criar um usuário -
Abra a raiz usando o comando “su”.
Crie um usuário a partir da conta root usando o comando “useradd username”.
Agora você pode abrir uma conta de usuário existente usando o comando “su username”.
Abra o terminal Linux e digite os seguintes comandos para criar um usuário.
$ su
password:
# useradd hadoop
# passwd hadoop
New passwd:
Retype new passwd
Configuração e geração de chave SSH
A configuração do SSH é necessária para realizar diferentes operações em um cluster, como iniciar, parar e operações de shell daemon distribuído. Para autenticar diferentes usuários do Hadoop, é necessário fornecer um par de chaves pública / privada para um usuário do Hadoop e compartilhá-lo com diferentes usuários.
Os comandos a seguir são usados para gerar um par de valores-chave usando SSH. Copie o formulário de chaves públicas id_rsa.pub para authorized_keys e forneça ao proprietário as permissões de leitura e gravação para o arquivo authorized_keys respectivamente.
$ ssh-keygen -t rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys $ chmod 0600 ~/.ssh/authorized_keys
Instalando Java
Java é o principal pré-requisito para o Hadoop. Em primeiro lugar, você deve verificar a existência de java em seu sistema usando o comando “java -version”. A sintaxe do comando da versão java é fornecida abaixo.
$ java -version
Se tudo estiver em ordem, você receberá a seguinte saída.
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b13)
Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode)
Se o java não estiver instalado em seu sistema, siga as etapas abaixo para instalar o java.
Passo 1
Baixe o java (JDK <versão mais recente> - X64.tar.gz) visitando o seguinte link www.oracle.com
Então jdk-7u71-linux-x64.tar.gz será baixado em seu sistema.
Passo 2
Geralmente, você encontrará o arquivo java baixado na pasta Downloads. Verifique e extraia ojdk-7u71-linux-x64.gz arquivo usando os seguintes comandos.
$ cd Downloads/
$ ls jdk-7u71-linux-x64.gz $ tar zxf jdk-7u71-linux-x64.gz
$ ls
jdk1.7.0_71 jdk-7u71-linux-x64.gz
etapa 3
Para disponibilizar o java a todos os usuários, você deve movê-lo para o local “/ usr / local /”. Abra o root e digite os seguintes comandos.
$ su
password:
# mv jdk1.7.0_71 /usr/local/
# exit
Passo 4
Para configurar PATH e JAVA_HOME variáveis, adicione os seguintes comandos para ~/.bashrc Arquivo.
export JAVA_HOME=/usr/local/jdk1.7.0_71
export PATH=$PATH:$JAVA_HOME/bin
Agora aplique todas as alterações no sistema em execução atual.
$ source ~/.bashrc
Etapa 5
Use os seguintes comandos para configurar alternativas java -
# alternatives --install /usr/bin/java java usr/local/java/bin/java 2
# alternatives --install /usr/bin/javac javac usr/local/java/bin/javac 2
# alternatives --install /usr/bin/jar jar usr/local/java/bin/jar 2
# alternatives --set java usr/local/java/bin/java
# alternatives --set javac usr/local/java/bin/javac
# alternatives --set jar usr/local/java/bin/jar
Agora verifique o comando java -version do terminal conforme explicado acima.
Baixando Hadoop
Baixe e extraia o Hadoop 2.4.1 da base de software Apache usando os comandos a seguir.
$ su
password:
# cd /usr/local
# wget http://apache.claz.org/hadoop/common/hadoop-2.4.1/
hadoop-2.4.1.tar.gz
# tar xzf hadoop-2.4.1.tar.gz
# mv hadoop-2.4.1/* to hadoop/
# exit
Modos de operação Hadoop
Depois de fazer download do Hadoop, você pode operar o cluster do Hadoop em um dos três modos suportados -
Local/Standalone Mode - Depois de baixar o Hadoop em seu sistema, por padrão, ele é configurado em um modo autônomo e pode ser executado como um único processo java.
Pseudo Distributed Mode- É uma simulação distribuída em uma única máquina. Cada daemon Hadoop, como hdfs, yarn, MapReduce etc., será executado como um processo java separado. Este modo é útil para desenvolvimento.
Fully Distributed Mode- Este modo é totalmente distribuído com no mínimo duas ou mais máquinas como um cluster. Veremos esse modo em detalhes nos próximos capítulos.
Instalando o Hadoop no modo autônomo
Aqui iremos discutir a instalação de Hadoop 2.4.1 no modo autônomo.
Não há daemons em execução e tudo é executado em uma única JVM. O modo autônomo é adequado para executar programas MapReduce durante o desenvolvimento, pois é fácil testá-los e depurá-los.
Configurando o Hadoop
Você pode definir variáveis de ambiente Hadoop anexando os seguintes comandos a ~/.bashrc Arquivo.
export HADOOP_HOME=/usr/local/hadoop
Antes de prosseguir, você precisa se certificar de que o Hadoop está funcionando bem. Basta emitir o seguinte comando -
$ hadoop version
Se tudo estiver bem com sua configuração, você deverá ver o seguinte resultado -
Hadoop 2.4.1
Subversion https://svn.apache.org/repos/asf/hadoop/common -r 1529768
Compiled by hortonmu on 2013-10-07T06:28Z
Compiled with protoc 2.5.0
From source with checksum 79e53ce7994d1628b240f09af91e1af4
Isso significa que a configuração do modo autônomo do Hadoop está funcionando bem. Por padrão, o Hadoop é configurado para ser executado em um modo não distribuído em uma única máquina.
Exemplo
Vamos verificar um exemplo simples de Hadoop. A instalação do Hadoop oferece o seguinte exemplo de arquivo jar MapReduce, que fornece funcionalidade básica de MapReduce e pode ser usado para calcular, como valor de Pi, contagens de palavras em uma determinada lista de arquivos, etc.
$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar
Vamos ter um diretório de entrada onde enviaremos alguns arquivos e nosso requisito é contar o número total de palavras nesses arquivos. Para calcular o número total de palavras, não precisamos escrever nosso MapReduce, desde que o arquivo .jar contenha a implementação para contagem de palavras. Você pode tentar outros exemplos usando o mesmo arquivo .jar; apenas emita os seguintes comandos para verificar os programas funcionais MapReduce suportados pelo arquivo hadoop-mapreduce-examples-2.2.0.jar.
$ hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduceexamples-2.2.0.jar
Passo 1
Crie arquivos de conteúdo temporários no diretório de entrada. Você pode criar esse diretório de entrada em qualquer lugar onde gostaria de trabalhar.
$ mkdir input $ cp $HADOOP_HOME/*.txt input $ ls -l input
Ele fornecerá os seguintes arquivos em seu diretório de entrada -
total 24
-rw-r--r-- 1 root root 15164 Feb 21 10:14 LICENSE.txt
-rw-r--r-- 1 root root 101 Feb 21 10:14 NOTICE.txt
-rw-r--r-- 1 root root 1366 Feb 21 10:14 README.txt
Esses arquivos foram copiados do diretório inicial de instalação do Hadoop. Para seu experimento, você pode ter conjuntos de arquivos diferentes e grandes.
Passo 2
Vamos iniciar o processo do Hadoop para contar o número total de palavras em todos os arquivos disponíveis no diretório de entrada, da seguinte maneira -
$ hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduceexamples-2.2.0.jar wordcount input output
etapa 3
A etapa 2 fará o processamento necessário e salvará a saída no arquivo output / part-r00000, que você pode verificar usando -
$cat output/*
Ele listará todas as palavras junto com suas contagens totais disponíveis em todos os arquivos disponíveis no diretório de entrada.
"AS 4
"Contribution" 1
"Contributor" 1
"Derivative 1
"Legal 1
"License" 1
"License"); 1
"Licensor" 1
"NOTICE” 1
"Not 1
"Object" 1
"Source” 1
"Work” 1
"You" 1
"Your") 1
"[]" 1
"control" 1
"printed 1
"submitted" 1
(50%) 1
(BIS), 1
(C) 1
(Don't) 1
(ECCN) 1
(INCLUDING 2
(INCLUDING, 2
.............
Instalando o Hadoop no modo pseudo-distribuído
Siga as etapas fornecidas abaixo para instalar o Hadoop 2.4.1 no modo pseudo distribuído.
Etapa 1 - Configurando o Hadoop
Você pode definir variáveis de ambiente Hadoop anexando os seguintes comandos a ~/.bashrc Arquivo.
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin export HADOOP_INSTALL=$HADOOP_HOME
Agora aplique todas as alterações no sistema em execução atual.
$ source ~/.bashrc
Etapa 2 - Configuração do Hadoop
Você pode encontrar todos os arquivos de configuração do Hadoop no local “$ HADOOP_HOME / etc / hadoop”. É necessário fazer alterações nesses arquivos de configuração de acordo com sua infraestrutura Hadoop.
$ cd $HADOOP_HOME/etc/hadoop
Para desenvolver programas Hadoop em java, você deve redefinir as variáveis de ambiente java em hadoop-env.sh arquivo substituindo JAVA_HOME valor com a localização de java em seu sistema.
export JAVA_HOME=/usr/local/jdk1.7.0_71
A seguir está a lista de arquivos que você deve editar para configurar o Hadoop.
core-site.xml
o core-site.xml arquivo contém informações como o número da porta usado para a instância do Hadoop, memória alocada para o sistema de arquivos, limite de memória para armazenar os dados e tamanho dos buffers de leitura / gravação.
Abra o core-site.xml e adicione as seguintes propriedades entre as tags <configuration>, </configuration>.
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
hdfs-site.xml
o hdfs-site.xmlarquivo contém informações como o valor dos dados de replicação, caminho do namenode e caminhos do datanode de seus sistemas de arquivos locais. Significa o local onde você deseja armazenar a infraestrutura do Hadoop.
Vamos supor os seguintes dados.
dfs.replication (data replication value) = 1
(In the below given path /hadoop/ is the user name.
hadoopinfra/hdfs/namenode is the directory created by hdfs file system.)
namenode path = //home/hadoop/hadoopinfra/hdfs/namenode
(hadoopinfra/hdfs/datanode is the directory created by hdfs file system.)
datanode path = //home/hadoop/hadoopinfra/hdfs/datanode
Abra este arquivo e adicione as seguintes propriedades entre as marcas <configuration> </configuration> neste arquivo.
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>file:///home/hadoop/hadoopinfra/hdfs/namenode </value>
</property>
<property>
<name>dfs.data.dir</name>
<value>file:///home/hadoop/hadoopinfra/hdfs/datanode </value>
</property>
</configuration>
Note - No arquivo acima, todos os valores de propriedade são definidos pelo usuário e você pode fazer alterações de acordo com sua infraestrutura Hadoop.
yarn-site.xml
Este arquivo é usado para configurar o yarn no Hadoop. Abra o arquivo yarn-site.xml e adicione as seguintes propriedades entre as marcas <configuration>, </configuration> neste arquivo.
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
mapred-site.xml
Este arquivo é usado para especificar qual estrutura MapReduce estamos usando. Por padrão, o Hadoop contém um modelo de yarn-site.xml. Em primeiro lugar, é necessário copiar o arquivo demapred-site.xml.template para mapred-site.xml arquivo usando o seguinte comando.
$ cp mapred-site.xml.template mapred-site.xml
Abrir mapred-site.xml arquivo e adicione as seguintes propriedades entre as marcas <configuration>, </configuration> neste arquivo.
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
Verificando a instalação do Hadoop
As etapas a seguir são usadas para verificar a instalação do Hadoop.
Etapa 1 - Configuração do Nó de Nome
Configure o namenode usando o comando “hdfs namenode -format” como segue.
$ cd ~
$ hdfs namenode -format
O resultado esperado é o seguinte.
10/24/14 21:30:55 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = localhost/192.168.1.11
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 2.4.1
...
...
10/24/14 21:30:56 INFO common.Storage: Storage directory
/home/hadoop/hadoopinfra/hdfs/namenode has been successfully formatted.
10/24/14 21:30:56 INFO namenode.NNStorageRetentionManager: Going to
retain 1 images with txid >= 0
10/24/14 21:30:56 INFO util.ExitUtil: Exiting with status 0
10/24/14 21:30:56 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost/192.168.1.11
************************************************************/
Etapa 2 - Verificar Hadoop dfs
O seguinte comando é usado para iniciar o dfs. Executar este comando iniciará seu sistema de arquivos Hadoop.
$ start-dfs.sh
A saída esperada é a seguinte -
10/24/14 21:37:56
Starting namenodes on [localhost]
localhost: starting namenode, logging to /home/hadoop/hadoop
2.4.1/logs/hadoop-hadoop-namenode-localhost.out
localhost: starting datanode, logging to /home/hadoop/hadoop
2.4.1/logs/hadoop-hadoop-datanode-localhost.out
Starting secondary namenodes [0.0.0.0]
Etapa 3 - Verificação do script do Yarn
O seguinte comando é usado para iniciar o script yarn. Executar este comando iniciará seus daemons de yarn.
$ start-yarn.sh
A saída esperada da seguinte forma -
starting yarn daemons
starting resourcemanager, logging to /home/hadoop/hadoop
2.4.1/logs/yarn-hadoop-resourcemanager-localhost.out
localhost: starting nodemanager, logging to /home/hadoop/hadoop
2.4.1/logs/yarn-hadoop-nodemanager-localhost.out
Etapa 4 - Acessando o Hadoop no navegador
O número da porta padrão para acessar o Hadoop é 50070. Use o seguinte url para obter os serviços do Hadoop no navegador.
http://localhost:50070/
Etapa 5 - Verificar todos os aplicativos do cluster
O número da porta padrão para acessar todos os aplicativos do cluster é 8088. Use o seguinte url para visitar este serviço.
http://localhost:8088/
O Hadoop File System foi desenvolvido usando design de sistema de arquivos distribuído. É executado em hardware comum. Ao contrário de outros sistemas distribuídos, o HDFS é altamente tolerante a falhas e projetado com hardware de baixo custo.
O HDFS mantém uma grande quantidade de dados e fornece acesso mais fácil. Para armazenar dados tão grandes, os arquivos são armazenados em várias máquinas. Esses arquivos são armazenados de forma redundante para resgatar o sistema de possíveis perdas de dados em caso de falha. O HDFS também disponibiliza aplicativos para processamento paralelo.
Recursos do HDFS
- É adequado para armazenamento e processamento distribuído.
- O Hadoop fornece uma interface de comando para interagir com o HDFS.
- Os servidores integrados de namenode e datanode ajudam os usuários a verificar facilmente o status do cluster.
- Acesso de streaming aos dados do sistema de arquivos.
- O HDFS fornece permissões e autenticação de arquivos.
Arquitetura HDFS
A seguir está a arquitetura de um sistema de arquivos Hadoop.
O HDFS segue a arquitetura mestre-escravo e possui os seguintes elementos.
Namenode
O namenode é o hardware comum que contém o sistema operacional GNU / Linux e o software namenode. É um software que pode ser executado em hardware comum. O sistema com o namenode atua como o servidor mestre e executa as seguintes tarefas -
Gerencia o namespace do sistema de arquivos.
Regula o acesso do cliente aos arquivos.
Ele também executa operações do sistema de arquivos, como renomear, fechar e abrir arquivos e diretórios.
Datanode
O datanode é um hardware comum que possui o sistema operacional GNU / Linux e o software datanode. Para cada nó (hardware / sistema de commodities) em um cluster, haverá um datanode. Esses nós gerenciam o armazenamento de dados de seu sistema.
Os Datanodes executam operações de leitura e gravação nos sistemas de arquivos, conforme a solicitação do cliente.
Eles também realizam operações como criação, exclusão e replicação de blocos de acordo com as instruções do namenode.
Quadra
Geralmente os dados do usuário são armazenados nos arquivos do HDFS. O arquivo em um sistema de arquivos será dividido em um ou mais segmentos e / ou armazenado em nós de dados individuais. Esses segmentos de arquivo são chamados de blocos. Em outras palavras, a quantidade mínima de dados que o HDFS pode ler ou gravar é chamada de Bloco. O tamanho do bloco padrão é 64 MB, mas pode ser aumentado conforme a necessidade de alteração na configuração do HDFS.
Objetivos do HDFS
Fault detection and recovery- Como o HDFS inclui um grande número de hardware comum, a falha de componentes é frequente. Portanto, o HDFS deve ter mecanismos para detecção e recuperação rápida e automática de falhas.
Huge datasets - O HDFS deve ter centenas de nós por cluster para gerenciar os aplicativos com grandes conjuntos de dados.
Hardware at data- Uma tarefa solicitada pode ser realizada de forma eficiente, quando o cálculo ocorre próximo aos dados. Especialmente onde grandes conjuntos de dados estão envolvidos, ele reduz o tráfego de rede e aumenta o rendimento.
Iniciando HDFS
Inicialmente, você deve formatar o sistema de arquivos HDFS configurado, abrir o namenode (servidor HDFS) e executar o seguinte comando.
$ hadoop namenode -format
Depois de formatar o HDFS, inicie o sistema de arquivos distribuído. O comando a seguir iniciará o namenode, bem como os nós de dados como cluster.
$ start-dfs.sh
Listando arquivos em HDFS
Depois de carregar as informações no servidor, podemos encontrar a lista de arquivos em um diretório, status de um arquivo, usando ‘ls’. Dada a seguir é a sintaxe dels que você pode passar para um diretório ou nome de arquivo como um argumento.
$ $HADOOP_HOME/bin/hadoop fs -ls <args>
Inserindo Dados no HDFS
Suponha que temos dados no arquivo denominado file.txt no sistema local que deve ser salvo no sistema de arquivos hdfs. Siga as etapas fornecidas a seguir para inserir o arquivo necessário no sistema de arquivos Hadoop.
Passo 1
Você deve criar um diretório de entrada.
$ $HADOOP_HOME/bin/hadoop fs -mkdir /user/input
Passo 2
Transfira e armazene um arquivo de dados de sistemas locais para o sistema de arquivos Hadoop usando o comando put.
$ $HADOOP_HOME/bin/hadoop fs -put /home/file.txt /user/input
etapa 3
Você pode verificar o arquivo usando o comando ls.
$ $HADOOP_HOME/bin/hadoop fs -ls /user/input
Recuperando dados do HDFS
Suponha que temos um arquivo no HDFS chamado outfile. A seguir, é fornecida uma demonstração simples para recuperar o arquivo necessário do sistema de arquivos Hadoop.
Passo 1
Inicialmente, visualize os dados do HDFS usando cat comando.
$ $HADOOP_HOME/bin/hadoop fs -cat /user/output/outfile
Passo 2
Obtenha o arquivo do HDFS para o sistema de arquivos local usando get comando.
$ $HADOOP_HOME/bin/hadoop fs -get /user/output/ /home/hadoop_tp/
Desligando o HDFS
Você pode desligar o HDFS usando o seguinte comando.
$ stop-dfs.sh
Existem muitos mais comandos em "$HADOOP_HOME/bin/hadoop fs"do que são demonstrados aqui, embora essas operações básicas ajudem você a começar. Executar ./bin/hadoop dfs sem argumentos adicionais listará todos os comandos que podem ser executados com o sistema FsShell. Além disso,$HADOOP_HOME/bin/hadoop fs -help commandName exibirá um breve resumo de uso para a operação em questão, se você estiver travado.
Uma tabela de todas as operações é mostrada abaixo. As seguintes convenções são usadas para parâmetros -
"<path>" means any file or directory name.
"<path>..." means one or more file or directory names.
"<file>" means any filename.
"<src>" and "<dest>" are path names in a directed operation.
"<localSrc>" and "<localDest>" are paths as above, but on the local file system.
Todos os outros arquivos e nomes de caminho se referem aos objetos dentro do HDFS.
Sr. Não | Comando e Descrição |
---|---|
1 | -ls <path> Lista o conteúdo do diretório especificado por caminho, mostrando os nomes, permissões, proprietário, tamanho e data de modificação para cada entrada. |
2 | -lsr <path> Se comporta como -ls, mas exibe recursivamente as entradas em todos os subdiretórios de path. |
3 | -du <path> Mostra o uso do disco, em bytes, para todos os arquivos que correspondem ao caminho; nomes de arquivos são relatados com o prefixo de protocolo HDFS completo. |
4 | -dus <path> Como -du, mas imprime um resumo do uso do disco de todos os arquivos / diretórios no caminho. |
5 | -mv <src><dest> Move o arquivo ou diretório indicado por src para dest, dentro do HDFS. |
6 | -cp <src> <dest> Copia o arquivo ou diretório identificado por src para dest, dentro do HDFS. |
7 | -rm <path> Remove o arquivo ou diretório vazio identificado por caminho. |
8 | -rmr <path> Remove o arquivo ou diretório identificado pelo caminho. Exclui recursivamente quaisquer entradas filho (ou seja, arquivos ou subdiretórios de caminho). |
9 | -put <localSrc> <dest> Copia o arquivo ou diretório do sistema de arquivos local identificado por localSrc para dest no DFS. |
10 | -copyFromLocal <localSrc> <dest> Entrada idêntica |
11 | -moveFromLocal <localSrc> <dest> Copia o arquivo ou diretório do sistema de arquivos local identificado por localSrc para dest no HDFS e exclui a cópia local com êxito. |
12 | -get [-crc] <src> <localDest> Copia o arquivo ou diretório em HDFS identificado por src para o caminho do sistema de arquivos local identificado por localDest. |
13 | -getmerge <src> <localDest> Recupera todos os arquivos que correspondem ao caminho src no HDFS e os copia em um único arquivo mesclado no sistema de arquivos local identificado por localDest. |
14 | -cat <filen-ame> Exibe o conteúdo do nome do arquivo em stdout. |
15 | -copyToLocal <src> <localDest> Idêntico para -get |
16 | -moveToLocal <src> <localDest> Funciona como -get, mas exclui a cópia HDFS em caso de sucesso. |
17 | -mkdir <path> Cria um diretório denominado path em HDFS. Cria qualquer diretório pai no caminho que está faltando (por exemplo, mkdir -p no Linux). |
18 | -setrep [-R] [-w] rep <path> Define o fator de replicação de destino para arquivos identificados por caminho para rep. (O fator de replicação real se moverá em direção ao destino ao longo do tempo) |
19 | -touchz <path> Cria um arquivo no caminho contendo a hora atual como um carimbo de data / hora. Falha se um arquivo já existe no caminho, a menos que o tamanho do arquivo já seja 0. |
20 | -test -[ezd] <path> Retorna 1 se o caminho existir; tem comprimento zero; ou é um diretório ou 0 caso contrário. |
21 | -stat [format] <path> Imprime informações sobre o caminho. O formato é uma string que aceita o tamanho do arquivo em blocos (% b), nome do arquivo (% n), tamanho do bloco (% o), replicação (% r) e data de modificação (% y,% Y). |
22 | -tail [-f] <file2name> Mostra o último 1 KB de arquivo em stdout. |
23 | -chmod [-R] mode,mode,... <path>... Altera as permissões de arquivo associadas a um ou mais objetos identificados por caminho .... Executa alterações recursivamente com o modo R. é um modo octal de 3 dígitos, ou {augo} +/- {rwxX}. Assume se nenhum escopo for especificado e não aplica uma umask. |
24 | -chown [-R] [owner][:[group]] <path>... Define o usuário e / ou grupo proprietário para arquivos ou diretórios identificados por caminho .... Define o proprietário recursivamente se -R for especificado. |
25 | -chgrp [-R] group <path>... Define o grupo proprietário para arquivos ou diretórios identificados por caminho .... Define o grupo recursivamente se -R for especificado. |
26 | -help <cmd-name> Retorna informações de uso para um dos comandos listados acima. Você deve omitir o caractere '-' inicial em cmd. |
MapReduce é uma estrutura com a qual podemos escrever aplicativos para processar grandes quantidades de dados, em paralelo, em grandes clusters de hardware comum de maneira confiável.
O que é MapReduce?
MapReduce é uma técnica de processamento e um modelo de programa para computação distribuída baseado em java. O algoritmo MapReduce contém duas tarefas importantes, ou seja, Mapear e Reduzir. O mapa pega um conjunto de dados e o converte em outro conjunto de dados, onde os elementos individuais são divididos em tuplas (pares de chave / valor). Em segundo lugar, reduza a tarefa, que pega a saída de um mapa como uma entrada e combina essas tuplas de dados em um conjunto menor de tuplas. Como a sequência do nome MapReduce indica, a tarefa de redução é sempre executada após o trabalho de mapa.
A principal vantagem do MapReduce é que é fácil dimensionar o processamento de dados em vários nós de computação. No modelo MapReduce, os primitivos de processamento de dados são chamados de mapeadores e redutores. Decompor um aplicativo de processamento de dados em mapeadores e redutores às vezes não é trivial. Mas, uma vez que escrevemos um aplicativo no formato MapReduce, escalar o aplicativo para rodar em centenas, milhares ou mesmo dezenas de milhares de máquinas em um cluster é meramente uma mudança de configuração. Essa escalabilidade simples é o que atraiu muitos programadores a usar o modelo MapReduce.
O Algoritmo
Geralmente o paradigma MapReduce é baseado no envio do computador para onde os dados residem!
O programa MapReduce é executado em três estágios, ou seja, estágio de mapa, estágio de embaralhamento e estágio de redução.
Map stage- O trabalho do mapa ou mapeador é processar os dados de entrada. Geralmente, os dados de entrada estão na forma de arquivo ou diretório e são armazenados no sistema de arquivos Hadoop (HDFS). O arquivo de entrada é passado para a função do mapeador linha por linha. O mapeador processa os dados e cria vários pequenos blocos de dados.
Reduce stage - Este estágio é a combinação do Shuffle palco e o Reducepalco. O trabalho do Redutor é processar os dados que vêm do mapeador. Após o processamento, ele produz um novo conjunto de saída, que será armazenado no HDFS.
Durante um trabalho MapReduce, o Hadoop envia as tarefas Map e Reduce para os servidores apropriados no cluster.
A estrutura gerencia todos os detalhes da passagem de dados, como tarefas de emissão, verificação da conclusão da tarefa e cópia de dados em todo o cluster entre os nós.
A maior parte da computação ocorre em nós com dados em discos locais que reduzem o tráfego de rede.
Após a conclusão das tarefas fornecidas, o cluster coleta e reduz os dados para formar um resultado apropriado e os envia de volta ao servidor Hadoop.
Entradas e saídas (perspectiva Java)
A estrutura MapReduce opera em pares <chave, valor>, ou seja, a estrutura visualiza a entrada para a tarefa como um conjunto de pares <chave, valor> e produz um conjunto de pares <chave, valor> como a saída da tarefa , possivelmente de tipos diferentes.
A chave e as classes de valor devem ser serializadas pela estrutura e, portanto, precisam implementar a interface gravável. Além disso, as classes-chave precisam implementar a interface gravável-comparável para facilitar a classificação pela estrutura. Tipos de entrada e saída de umMapReduce job - (Entrada) <k1, v1> → mapa → <k2, v2> → reduzir → <k3, v3> (Saída).
Entrada | Resultado | |
---|---|---|
Mapa | <k1, v1> | lista (<k2, v2>) |
Reduzir | <k2, lista (v2)> | lista (<k3, v3>) |
Terminologia
PayLoad - Os aplicativos implementam as funções Map e Reduce e formam o núcleo do trabalho.
Mapper - Mapeador mapeia os pares de chave / valor de entrada para um conjunto de par de chave / valor intermediário.
NamedNode - Nó que gerencia o Hadoop Distributed File System (HDFS).
DataNode - Nó onde os dados são apresentados com antecedência antes que qualquer processamento ocorra.
MasterNode - Nó onde o JobTracker é executado e que aceita solicitações de trabalho de clientes.
SlaveNode - Nó onde o programa Map e Reduce é executado.
JobTracker - Agenda tarefas e rastreia as tarefas atribuídas ao rastreador de tarefas.
Task Tracker - Rastreia a tarefa e relata o status ao JobTracker.
Job - Um programa é uma execução de um Mapeador e Redutor em um conjunto de dados.
Task - Uma execução de um mapeador ou redutor em uma fatia de dados.
Task Attempt - Uma instância particular de uma tentativa de executar uma tarefa em um SlaveNode.
Cenário de Exemplo
A seguir estão os dados relativos ao consumo elétrico de uma organização. Contém o consumo elétrico mensal e a média anual de vários anos.
Jan | Fev | Mar | Abr | Maio | Junho | Jul | Agosto | Set | Out | Nov | Dez | Média | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1979 | 23 | 23 | 2 | 43 | 24 | 25 | 26 | 26 | 26 | 26 | 25 | 26 | 25 |
1980 | 26 | 27 | 28 | 28 | 28 | 30 | 31 | 31 | 31 | 30 | 30 | 30 | 29 |
1981 | 31 | 32 | 32 | 32 | 33 | 34 | 35 | 36 | 36 | 34 | 34 | 34 | 34 |
1984 | 39 | 38 | 39 | 39 | 39 | 41 | 42 | 43 | 40 | 39 | 38 | 38 | 40 |
1985 | 38 | 39 | 39 | 39 | 39 | 41 | 41 | 41 | 00 | 40 | 39 | 39 | 45 |
Se os dados acima forem fornecidos como entrada, temos que escrever aplicativos para processá-los e produzir resultados como encontrar o ano de uso máximo, ano de uso mínimo e assim por diante. Esta é uma vitória fácil para os programadores com um número finito de registros. Eles simplesmente escreverão a lógica para produzir a saída necessária e passarão os dados para o aplicativo escrito.
Mas, pense nos dados que representam o consumo elétrico de todas as indústrias de grande porte de um determinado estado, desde sua formação.
Quando escrevemos aplicativos para processar esses dados em massa,
Eles levarão muito tempo para serem executados.
Haverá um tráfego de rede pesado quando movermos os dados da origem para o servidor de rede e assim por diante.
Para resolver esses problemas, temos a estrutura MapReduce.
Dados de entrada
Os dados acima são salvos como sample.txte fornecido como entrada. O arquivo de entrada se parece com o mostrado abaixo.
1979 23 23 2 43 24 25 26 26 26 26 25 26 25
1980 26 27 28 28 28 30 31 31 31 30 30 30 29
1981 31 32 32 32 33 34 35 36 36 34 34 34 34
1984 39 38 39 39 39 41 42 43 40 39 38 38 40
1985 38 39 39 39 39 41 41 41 00 40 39 39 45
Programa Exemplo
A seguir está o programa para os dados de amostra usando a estrutura MapReduce.
package hadoop;
import java.util.*;
import java.io.IOException;
import java.io.IOException;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;
import org.apache.hadoop.util.*;
public class ProcessUnits {
//Mapper class
public static class E_EMapper extends MapReduceBase implements
Mapper<LongWritable ,/*Input key Type */
Text, /*Input value Type*/
Text, /*Output key Type*/
IntWritable> /*Output value Type*/
{
//Map function
public void map(LongWritable key, Text value,
OutputCollector<Text, IntWritable> output,
Reporter reporter) throws IOException {
String line = value.toString();
String lasttoken = null;
StringTokenizer s = new StringTokenizer(line,"\t");
String year = s.nextToken();
while(s.hasMoreTokens()) {
lasttoken = s.nextToken();
}
int avgprice = Integer.parseInt(lasttoken);
output.collect(new Text(year), new IntWritable(avgprice));
}
}
//Reducer class
public static class E_EReduce extends MapReduceBase implements Reducer< Text, IntWritable, Text, IntWritable > {
//Reduce function
public void reduce( Text key, Iterator <IntWritable> values,
OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
int maxavg = 30;
int val = Integer.MIN_VALUE;
while (values.hasNext()) {
if((val = values.next().get())>maxavg) {
output.collect(key, new IntWritable(val));
}
}
}
}
//Main function
public static void main(String args[])throws Exception {
JobConf conf = new JobConf(ProcessUnits.class);
conf.setJobName("max_eletricityunits");
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
conf.setMapperClass(E_EMapper.class);
conf.setCombinerClass(E_EReduce.class);
conf.setReducerClass(E_EReduce.class);
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
JobClient.runJob(conf);
}
}
Salve o programa acima como ProcessUnits.java. A compilação e execução do programa são explicadas a seguir.
Programa de Compilação e Execução de Unidades de Processo
Vamos supor que estamos no diretório inicial de um usuário Hadoop (por exemplo, / home / hadoop).
Siga as etapas fornecidas a seguir para compilar e executar o programa acima.
Passo 1
O seguinte comando é para criar um diretório para armazenar as classes java compiladas.
$ mkdir units
Passo 2
Baixar Hadoop-core-1.2.1.jar,que é usado para compilar e executar o programa MapReduce. Visite o seguinte link mvnrepository.com para baixar o jar. Vamos supor que a pasta baixada seja/home/hadoop/.
etapa 3
Os seguintes comandos são usados para compilar o ProcessUnits.java programa e criando um jar para o programa.
$ javac -classpath hadoop-core-1.2.1.jar -d units ProcessUnits.java
$ jar -cvf units.jar -C units/ .
Passo 4
O comando a seguir é usado para criar um diretório de entrada no HDFS.
$HADOOP_HOME/bin/hadoop fs -mkdir input_dir
Etapa 5
O seguinte comando é usado para copiar o arquivo de entrada chamado sample.txtno diretório de entrada do HDFS.
$HADOOP_HOME/bin/hadoop fs -put /home/hadoop/sample.txt input_dir
Etapa 6
O comando a seguir é usado para verificar os arquivos no diretório de entrada.
$HADOOP_HOME/bin/hadoop fs -ls input_dir/
Etapa 7
O comando a seguir é usado para executar o aplicativo Eleunit_max, obtendo os arquivos de entrada do diretório de entrada.
$HADOOP_HOME/bin/hadoop jar units.jar hadoop.ProcessUnits input_dir output_dir
Espere um pouco até que o arquivo seja executado. Após a execução, conforme mostrado abaixo, a saída conterá o número de divisões de entrada, o número de tarefas de mapa, o número de tarefas de redutor, etc.
INFO mapreduce.Job: Job job_1414748220717_0002
completed successfully
14/10/31 06:02:52
INFO mapreduce.Job: Counters: 49
File System Counters
FILE: Number of bytes read = 61
FILE: Number of bytes written = 279400
FILE: Number of read operations = 0
FILE: Number of large read operations = 0
FILE: Number of write operations = 0
HDFS: Number of bytes read = 546
HDFS: Number of bytes written = 40
HDFS: Number of read operations = 9
HDFS: Number of large read operations = 0
HDFS: Number of write operations = 2 Job Counters
Launched map tasks = 2
Launched reduce tasks = 1
Data-local map tasks = 2
Total time spent by all maps in occupied slots (ms) = 146137
Total time spent by all reduces in occupied slots (ms) = 441
Total time spent by all map tasks (ms) = 14613
Total time spent by all reduce tasks (ms) = 44120
Total vcore-seconds taken by all map tasks = 146137
Total vcore-seconds taken by all reduce tasks = 44120
Total megabyte-seconds taken by all map tasks = 149644288
Total megabyte-seconds taken by all reduce tasks = 45178880
Map-Reduce Framework
Map input records = 5
Map output records = 5
Map output bytes = 45
Map output materialized bytes = 67
Input split bytes = 208
Combine input records = 5
Combine output records = 5
Reduce input groups = 5
Reduce shuffle bytes = 6
Reduce input records = 5
Reduce output records = 5
Spilled Records = 10
Shuffled Maps = 2
Failed Shuffles = 0
Merged Map outputs = 2
GC time elapsed (ms) = 948
CPU time spent (ms) = 5160
Physical memory (bytes) snapshot = 47749120
Virtual memory (bytes) snapshot = 2899349504
Total committed heap usage (bytes) = 277684224
File Output Format Counters
Bytes Written = 40
Etapa 8
O comando a seguir é usado para verificar os arquivos resultantes na pasta de saída.
$HADOOP_HOME/bin/hadoop fs -ls output_dir/
Etapa 9
O seguinte comando é usado para ver a saída em Part-00000 Arquivo. Este arquivo é gerado pelo HDFS.
$HADOOP_HOME/bin/hadoop fs -cat output_dir/part-00000
Abaixo está a saída gerada pelo programa MapReduce.
1981 34
1984 40
1985 45
Etapa 10
O comando a seguir é usado para copiar a pasta de saída do HDFS para o sistema de arquivos local para análise.
$HADOOP_HOME/bin/hadoop fs -cat output_dir/part-00000/bin/hadoop dfs get output_dir /home/hadoop
Comandos Importantes
Todos os comandos do Hadoop são invocados pelo $HADOOP_HOME/bin/hadoopcomando. Executar o script do Hadoop sem nenhum argumento imprime a descrição de todos os comandos.
Usage - hadoop [--config confdir] COMANDO
A tabela a seguir lista as opções disponíveis e suas descrições.
Sr. Não. | Opção e descrição |
---|---|
1 | namenode -format Formata o sistema de arquivos DFS. |
2 | secondarynamenode Executa o namenode secundário DFS. |
3 | namenode Executa o namenode DFS. |
4 | datanode Executa um datanode DFS. |
5 | dfsadmin Executa um cliente de administração DFS. |
6 | mradmin Executa um cliente administrativo Map-Reduce. |
7 | fsck Executa um utilitário de verificação do sistema de arquivos DFS. |
8 | fs Executa um cliente de usuário de sistema de arquivos genérico. |
9 | balancer Executa um utilitário de balanceamento de cluster. |
10 | oiv Aplica o visualizador fsimage offline a uma fsimage. |
11 | fetchdt Busca um token de delegação do NameNode. |
12 | jobtracker Executa o nó do rastreador de trabalhos MapReduce. |
13 | pipes Executa um trabalho de Pipes. |
14 | tasktracker Executa um nó do rastreador de tarefas MapReduce. |
15 | historyserver Executa servidores de histórico de tarefas como um daemon independente. |
16 | job Manipula os trabalhos MapReduce. |
17 | queue Obtém informações sobre JobQueues. |
18 | version Imprime a versão. |
19 | jar <jar> Executa um arquivo jar. |
20 | distcp <srcurl> <desturl> Copia arquivos ou diretórios recursivamente. |
21 | distcp2 <srcurl> <desturl> DistCp versão 2. |
22 | archive -archiveName NAME -p <parent path> <src>* <dest> Cria um arquivo hadoop. |
23 | classpath Imprime o caminho da classe necessário para obter o jar do Hadoop e as bibliotecas necessárias. |
24 | daemonlog Obter / definir o nível de log para cada daemon |
Como interagir com trabalhos MapReduce
Uso - trabalho hadoop [GENERIC_OPTIONS]
A seguir estão as opções genéricas disponíveis em uma tarefa do Hadoop.
Sr. Não. | GENERIC_OPTION e descrição |
---|---|
1 | -submit <job-file> Envia o trabalho. |
2 | -status <job-id> Imprime o mapa e reduz a porcentagem de conclusão e todos os contadores de trabalho. |
3 | -counter <job-id> <group-name> <countername> Imprime o valor do contador. |
4 | -kill <job-id> Mata o trabalho. |
5 | -events <job-id> <fromevent-#> <#-of-events> Imprime os detalhes dos eventos recebidos pelo jobtracker para o intervalo fornecido. |
6 | -history [all] <jobOutputDir> - history < jobOutputDir> Imprime detalhes do trabalho, detalhes de dicas falhadas e eliminadas. Mais detalhes sobre o trabalho, como tarefas bem-sucedidas e tentativas de tarefa feitas para cada tarefa, podem ser exibidos especificando a opção [todos]. |
7 | -list[all] Exibe todos os trabalhos. -list exibe apenas os trabalhos que ainda não foram concluídos. |
8 | -kill-task <task-id> Mata a tarefa. Tarefas eliminadas NÃO são contabilizadas nas tentativas malsucedidas. |
9 | -fail-task <task-id> Falha na tarefa. As tarefas com falha são contadas em relação às tentativas com falha. |
10 | -set-priority <job-id> <priority> Altera a prioridade do trabalho. Os valores de prioridade permitidos são VERY_HIGH, HIGH, NORMAL, LOW, VERY_LOW |
Para ver o status do trabalho
$ $HADOOP_HOME/bin/hadoop job -status <JOB-ID> e.g. $ $HADOOP_HOME/bin/hadoop job -status job_201310191043_0004
Para ver o histórico do job output-dir
$ $HADOOP_HOME/bin/hadoop job -history <DIR-NAME> e.g. $ $HADOOP_HOME/bin/hadoop job -history /user/expert/output
Para matar o trabalho
$ $HADOOP_HOME/bin/hadoop job -kill <JOB-ID> e.g. $ $HADOOP_HOME/bin/hadoop job -kill job_201310191043_0004
O streaming do Hadoop é um utilitário que vem com a distribuição do Hadoop. Este utilitário permite criar e executar trabalhos de Mapear / Reduzir com qualquer executável ou script como mapeador e / ou redutor.
Exemplo de uso de Python
Para streaming do Hadoop, estamos considerando o problema da contagem de palavras. Qualquer trabalho no Hadoop deve ter duas fases: mapeador e redutor. Escrevemos códigos para o mapeador e o redutor em script python para executá-lo no Hadoop. Também se pode escrever o mesmo em Perl e Ruby.
Código de fase do mapeador
!/usr/bin/python
import sys
# Input takes from standard input for myline in sys.stdin:
# Remove whitespace either side
myline = myline.strip()
# Break the line into words
words = myline.split()
# Iterate the words list
for myword in words:
# Write the results to standard output
print '%s\t%s' % (myword, 1)
Certifique-se de que este arquivo tenha permissão de execução (chmod + x / home / expert / hadoop-1.2.1 / mapper.py).
Código de fase do redutor
#!/usr/bin/python
from operator import itemgetter
import sys
current_word = ""
current_count = 0
word = ""
# Input takes from standard input for myline in sys.stdin:
# Remove whitespace either side
myline = myline.strip()
# Split the input we got from mapper.py word,
count = myline.split('\t', 1)
# Convert count variable to integer
try:
count = int(count)
except ValueError:
# Count was not a number, so silently ignore this line continue
if current_word == word:
current_count += count
else:
if current_word:
# Write result to standard output print '%s\t%s' % (current_word, current_count)
current_count = count
current_word = word
# Do not forget to output the last word if needed!
if current_word == word:
print '%s\t%s' % (current_word, current_count)
Salve os códigos do mapeador e do redutor em mapper.py e reducer.py no diretório inicial do Hadoop. Certifique-se de que esses arquivos tenham permissão de execução (chmod + x mapper.py e chmod + x reducer.py). Como o python é sensível à indentação, o mesmo código pode ser baixado no link abaixo.
Execução do Programa WordCount
$ $HADOOP_HOME/bin/hadoop jar contrib/streaming/hadoop-streaming-1.
2.1.jar \
-input input_dirs \
-output output_dir \
-mapper <path/mapper.py \
-reducer <path/reducer.py
Onde "\" é usado para continuação de linha para legibilidade clara.
Por exemplo,
./bin/hadoop jar contrib/streaming/hadoop-streaming-1.2.1.jar -input myinput -output myoutput -mapper /home/expert/hadoop-1.2.1/mapper.py -reducer /home/expert/hadoop-1.2.1/reducer.py
Como funciona o streaming
No exemplo acima, tanto o mapeador quanto o redutor são scripts Python que lêem a entrada da entrada padrão e emitem a saída para a saída padrão. O utilitário criará um trabalho Mapear / Reduzir, enviará o trabalho a um cluster apropriado e monitorará o progresso do trabalho até que seja concluído.
Quando um script é especificado para mapeadores, cada tarefa do mapeador iniciará o script como um processo separado quando o mapeador for inicializado. Conforme a tarefa do mapeador é executada, ela converte suas entradas em linhas e as alimenta com a entrada padrão (STDIN) do processo. Enquanto isso, o mapeador coleta as saídas orientadas por linha da saída padrão (STDOUT) do processo e converte cada linha em um par chave / valor, que é coletado como saída do mapeador. Por padrão, o prefixo de uma linha até o primeiro caractere de tabulação é a chave e o resto da linha (excluindo o caractere de tabulação) será o valor. Se não houver nenhum caractere de tabulação na linha, a linha inteira será considerada a chave e o valor será nulo. No entanto, isso pode ser personalizado, conforme a necessidade.
Quando um script é especificado para redutores, cada tarefa do redutor iniciará o script como um processo separado e, em seguida, o redutor será inicializado. Conforme a tarefa do redutor é executada, ela converte seus pares de chave / valor de entrada em linhas e as alimenta com a entrada padrão (STDIN) do processo. Nesse ínterim, o redutor coleta as saídas orientadas por linha da saída padrão (STDOUT) do processo, converte cada linha em um par chave / valor, que é coletado como a saída do redutor. Por padrão, o prefixo de uma linha até o primeiro caractere de tabulação é a chave e o resto da linha (excluindo o caractere de tabulação) é o valor. No entanto, isso pode ser personalizado de acordo com requisitos específicos.
Comandos Importantes
Parâmetros | Opções | Descrição |
---|---|---|
-input diretório / nome do arquivo | Requeridos | Local de entrada para mapeador. |
- nome do diretório de saída | Requeridos | Local de saída do redutor. |
-mapper executável ou script ou JavaClassName | Requeridos | Executável do mapeador. |
-redutor executável ou script ou JavaClassName | Requeridos | Executável do redutor. |
-file file-name | Opcional | Torna o executável mapeador, redutor ou combinador disponível localmente nos nós de computação. |
-inputformat JavaClassName | Opcional | A classe fornecida deve retornar pares de chave / valor da classe Text. Se não for especificado, TextInputFormat será usado como o padrão. |
-outputformat JavaClassName | Opcional | A classe fornecida deve ter pares de chave / valor da classe Text. Se não for especificado, TextOutputformat é usado como o padrão. |
-partitioner JavaClassName | Opcional | Classe que determina para qual redução uma chave é enviada. |
-combiner streamingCommand ou JavaClassName | Opcional | Executável combinador para saída de mapa. |
-cmdenv name = value | Opcional | Passa a variável de ambiente para comandos de streaming. |
-inputreader | Opcional | Para compatibilidade com versões anteriores: especifica uma classe de leitor de registro (em vez de uma classe de formato de entrada). |
-verbose | Opcional | Saída detalhada. |
-lazyOutput | Opcional | Cria a saída lentamente. Por exemplo, se o formato de saída for baseado em FileOutputFormat, o arquivo de saída será criado apenas na primeira chamada para output.collect (ou Context.write). |
-numReduceTasks | Opcional | Especifica o número de redutores. |
-mapdebug | Opcional | Script a ser chamado quando a tarefa do mapa falhar. |
-reducedebug | Opcional | Script a ser chamado quando a tarefa de redução falhar. |
Este capítulo explica a configuração do cluster Hadoop Multi-Node em um ambiente distribuído.
Como o cluster inteiro não pode ser demonstrado, estamos explicando o ambiente do cluster Hadoop usando três sistemas (um mestre e dois escravos); abaixo estão seus endereços IP.
- Hadoop Master: 192.168.1.15 (hadoop-master)
- Hadoop Slave: 192.168.1.16 (hadoop-slave-1)
- Hadoop Slave: 192.168.1.17 (hadoop-slave-2)
Siga as etapas fornecidas abaixo para configurar o cluster Hadoop Multi-Node.
Instalando Java
Java é o principal pré-requisito para o Hadoop. Em primeiro lugar, você deve verificar a existência de java em seu sistema usando “java -version”. A sintaxe do comando da versão java é fornecida abaixo.
$ java -version
Se tudo funcionar bem, você receberá a seguinte saída.
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b13)
Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode)
Se o java não estiver instalado em seu sistema, siga as etapas fornecidas para instalar o java.
Passo 1
Baixe o java (JDK <versão mais recente> - X64.tar.gz) visitando o seguinte link www.oracle.com
Então jdk-7u71-linux-x64.tar.gz será baixado em seu sistema.
Passo 2
Geralmente, você encontrará o arquivo java baixado na pasta Downloads. Verifique e extraia ojdk-7u71-linux-x64.gz arquivo usando os seguintes comandos.
$ cd Downloads/ $ ls
jdk-7u71-Linux-x64.gz
$ tar zxf jdk-7u71-Linux-x64.gz $ ls
jdk1.7.0_71 jdk-7u71-Linux-x64.gz
etapa 3
Para disponibilizar o java a todos os usuários, você deve movê-lo para o local “/ usr / local /”. Abra a raiz e digite os seguintes comandos.
$ su
password:
# mv jdk1.7.0_71 /usr/local/
# exit
Passo 4
Para configurar PATH e JAVA_HOME variáveis, adicione os seguintes comandos para ~/.bashrc Arquivo.
export JAVA_HOME=/usr/local/jdk1.7.0_71
export PATH=PATH:$JAVA_HOME/bin
Agora verifique o java -versioncomando do terminal como explicado acima. Siga o processo acima e instale o java em todos os nós do cluster.
Criação de conta de usuário
Crie uma conta de usuário do sistema nos sistemas mestre e escravo para usar a instalação do Hadoop.
# useradd hadoop
# passwd hadoop
Mapeando os nós
Você tem que editar hosts arquivo em /etc/ pasta em todos os nós, especifique o endereço IP de cada sistema seguido por seus nomes de host.
# vi /etc/hosts
enter the following lines in the /etc/hosts file.
192.168.1.109 hadoop-master
192.168.1.145 hadoop-slave-1
192.168.56.1 hadoop-slave-2
Configurando o Login com Base em Chave
Configure o ssh em cada nó de forma que eles possam se comunicar sem qualquer solicitação de senha.
# su hadoop
$ ssh-keygen -t rsa $ ssh-copy-id -i ~/.ssh/id_rsa.pub tutorialspoint@hadoop-master
$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop_tp1@hadoop-slave-1 $ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop_tp2@hadoop-slave-2
$ chmod 0600 ~/.ssh/authorized_keys $ exit
Instalando Hadoop
No servidor mestre, baixe e instale o Hadoop usando os comandos a seguir.
# mkdir /opt/hadoop
# cd /opt/hadoop/
# wget http://apache.mesi.com.ar/hadoop/common/hadoop-1.2.1/hadoop-1.2.0.tar.gz
# tar -xzf hadoop-1.2.0.tar.gz
# mv hadoop-1.2.0 hadoop
# chown -R hadoop /opt/hadoop
# cd /opt/hadoop/hadoop/
Configurando Hadoop
Você deve configurar o servidor Hadoop fazendo as seguintes alterações conforme fornecido abaixo.
core-site.xml
Abra o core-site.xml arquivo e edite-o conforme mostrado abaixo.
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://hadoop-master:9000/</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
hdfs-site.xml
Abra o hdfs-site.xml arquivo e edite-o conforme mostrado abaixo.
<configuration>
<property>
<name>dfs.data.dir</name>
<value>/opt/hadoop/hadoop/dfs/name/data</value>
<final>true</final>
</property>
<property>
<name>dfs.name.dir</name>
<value>/opt/hadoop/hadoop/dfs/name</value>
<final>true</final>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
mapred-site.xml
Abra o mapred-site.xml arquivo e edite-o conforme mostrado abaixo.
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>hadoop-master:9001</value>
</property>
</configuration>
hadoop-env.sh
Abra o hadoop-env.sh arquivo e edite JAVA_HOME, HADOOP_CONF_DIR e HADOOP_OPTS como mostrado abaixo.
Note - Defina o JAVA_HOME de acordo com a configuração do sistema.
export JAVA_HOME=/opt/jdk1.7.0_17
export HADOOP_OPTS=-Djava.net.preferIPv4Stack=true
export HADOOP_CONF_DIR=/opt/hadoop/hadoop/conf
Installing Hadoop on Slave Servers
Install Hadoop on all the slave servers by following the given commands.
# su hadoop
$ cd /opt/hadoop $ scp -r hadoop hadoop-slave-1:/opt/hadoop
$ scp -r hadoop hadoop-slave-2:/opt/hadoop
Configuring Hadoop on Master Server
Open the master server and configure it by following the given commands.
# su hadoop
$ cd /opt/hadoop/hadoop
Configuring Master Node
$ vi etc/hadoop/masters
hadoop-master
Configuring Slave Node
$ vi etc/hadoop/slaves
hadoop-slave-1
hadoop-slave-2
Format Name Node on Hadoop Master
# su hadoop
$ cd /opt/hadoop/hadoop $ bin/hadoop namenode –format
11/10/14 10:58:07 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = hadoop-master/192.168.1.109
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 1.2.0
STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.2 -r 1479473;
compiled by 'hortonfo' on Mon May 6 06:59:37 UTC 2013
STARTUP_MSG: java = 1.7.0_71
************************************************************/
11/10/14 10:58:08 INFO util.GSet: Computing capacity for map BlocksMap
editlog=/opt/hadoop/hadoop/dfs/name/current/edits
………………………………………………….
………………………………………………….
………………………………………………….
11/10/14 10:58:08 INFO common.Storage: Storage directory
/opt/hadoop/hadoop/dfs/name has been successfully formatted.
11/10/14 10:58:08 INFO namenode.NameNode:
SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at hadoop-master/192.168.1.15
************************************************************/
Starting Hadoop Services
The following command is to start all the Hadoop services on the Hadoop-Master.
$ cd $HADOOP_HOME/sbin
$ start-all.sh
Adding a New DataNode in the Hadoop Cluster
Given below are the steps to be followed for adding new nodes to a Hadoop cluster.
Networking
Add new nodes to an existing Hadoop cluster with some appropriate network configuration. Assume the following network configuration.
For New node Configuration −
IP address : 192.168.1.103
netmask : 255.255.255.0
hostname : slave3.in
Adding User and SSH Access
Add a User
On a new node, add "hadoop" user and set password of Hadoop user to "hadoop123" or anything you want by using the following commands.
useradd hadoop
passwd hadoop
Setup Password less connectivity from master to new slave.
Execute the following on the master
mkdir -p $HOME/.ssh
chmod 700 $HOME/.ssh ssh-keygen -t rsa -P '' -f $HOME/.ssh/id_rsa
cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
chmod 644 $HOME/.ssh/authorized_keys Copy the public key to new slave node in hadoop user $HOME directory
scp $HOME/.ssh/id_rsa.pub [email protected]:/home/hadoop/
Execute the following on the slaves
Login to hadoop. If not, login to hadoop user.
su hadoop ssh -X [email protected]
Copy the content of public key into file "$HOME/.ssh/authorized_keys" and then change the permission for the same by executing the following commands.
cd $HOME mkdir -p $HOME/.ssh
chmod 700 $HOME/.ssh cat id_rsa.pub >>$HOME/.ssh/authorized_keys
chmod 644 $HOME/.ssh/authorized_keys
Check ssh login from the master machine. Now check if you can ssh to the new node without a password from the master.
ssh [email protected] or hadoop@slave3
Set Hostname of New Node
You can set hostname in file /etc/sysconfig/network
On new slave3 machine
NETWORKING = yes
HOSTNAME = slave3.in
To make the changes effective, either restart the machine or run hostname command to a new machine with the respective hostname (restart is a good option).
On slave3 node machine −
hostname slave3.in
Update /etc/hosts on all machines of the cluster with the following lines −
192.168.1.102 slave3.in slave3
Now try to ping the machine with hostnames to check whether it is resolving to IP or not.
On new node machine −
ping master.in
Start the DataNode on New Node
Start the datanode daemon manually using $HADOOP_HOME/bin/hadoop-daemon.sh script. It will automatically contact the master (NameNode) and join the cluster. We should also add the new node to the conf/slaves file in the master server. The script-based commands will recognize the new node.
Login to new node
su hadoop or ssh -X [email protected]
Start HDFS on a newly added slave node by using the following command
./bin/hadoop-daemon.sh start datanode
Check the output of jps command on a new node. It looks as follows.
$ jps
7141 DataNode
10312 Jps
Removing a DataNode from the Hadoop Cluster
We can remove a node from a cluster on the fly, while it is running, without any data loss. HDFS provides a decommissioning feature, which ensures that removing a node is performed safely. To use it, follow the steps as given below −
Step 1 − Login to master
Login to master machine user where Hadoop is installed.
$ su hadoop
Step 2 − Change cluster configuration
An exclude file must be configured before starting the cluster. Add a key named dfs.hosts.exclude to our $HADOOP_HOME/etc/hadoop/hdfs-site.xml file. The value associated with this key provides the full path to a file on the NameNode's local file system which contains a list of machines which are not permitted to connect to HDFS.
For example, add these lines to etc/hadoop/hdfs-site.xml file.
<property>
<name>dfs.hosts.exclude</name>
<value>/home/hadoop/hadoop-1.2.1/hdfs_exclude.txt</value>
<description>DFS exclude</description>
</property>
Step 3 − Determine hosts to decommission
Each machine to be decommissioned should be added to the file identified by the hdfs_exclude.txt, one domain name per line. This will prevent them from connecting to the NameNode. Content of the "/home/hadoop/hadoop-1.2.1/hdfs_exclude.txt" file is shown below, if you want to remove DataNode2.
slave2.in
Step 4 − Force configuration reload
Run the command "$HADOOP_HOME/bin/hadoop dfsadmin -refreshNodes" without the quotes.
$ $HADOOP_HOME/bin/hadoop dfsadmin -refreshNodes
This will force the NameNode to re-read its configuration, including the newly updated ‘excludes’ file. It will decommission the nodes over a period of time, allowing time for each node's blocks to be replicated onto machines which are scheduled to remain active.
On slave2.in, check the jps command output. After some time, you will see the DataNode process is shutdown automatically.
Step 5 − Shutdown nodes
After the decommission process has been completed, the decommissioned hardware can be safely shut down for maintenance. Run the report command to dfsadmin to check the status of decommission. The following command will describe the status of the decommission node and the connected nodes to the cluster.
$ $HADOOP_HOME/bin/hadoop dfsadmin -report
Step 6 − Edit excludes file again
Once the machines have been decommissioned, they can be removed from the ‘excludes’ file. Running "$HADOOP_HOME/bin/hadoop dfsadmin -refreshNodes" again will read the excludes file back into the NameNode; allowing the DataNodes to rejoin the cluster after the maintenance has been completed, or additional capacity is needed in the cluster again, etc.
Special Note − If the above process is followed and the tasktracker process is still running on the node, it needs to be shut down. One way is to disconnect the machine as we did in the above steps. The Master will recognize the process automatically and will declare as dead. There is no need to follow the same process for removing the tasktracker because it is NOT much crucial as compared to the DataNode. DataNode contains the data that you want to remove safely without any loss of data.
The tasktracker can be run/shutdown on the fly by the following command at any point of time.
$ $HADOOP_HOME/bin/hadoop-daemon.sh stop tasktracker $HADOOP_HOME/bin/hadoop-daemon.sh start tasktracker