Você pode usar um exemplo simples para ilustrar o que o MapReduce é:
Queremos contar o número de vezes que cada palavra aparece em um arquivo grande. Porque o arquivo é muito grande. Dividimos esse arquivo em arquivos pequenos e depois organizamos várias pessoas para contar. Este processo é "mapa". Em seguida, fundir os números contados por cada pessoa, e isso é "reduzir".
Se você fizer o exemplo acima no MapReduce, precisará criar um trabalho de tarefa, que divide o arquivo em vários blocos de dados independentes e o distribua em diferentes nós da máquina. Em seguida, processe -o de maneira completamente paralela através das tarefas do mapa espalhadas em diferentes nós. O MapReduce coletará as linhas de saída do mapa e enviará a saída do resultado para reduzir para a próxima etapa do processamento.
Para o processo de execução específico de uma tarefa, haverá um processo chamado "JobTracker" responsável por coordenar todas as tarefas no processo de execução do MapReduce. Vários processos do TaskTracker são usados para executar tarefas de mapa separadas e relatar a execução da tarefa ao JobTracker a qualquer momento. Se um TaskTracker relatar uma tarefa ou não relatar sua própria tarefa por um longo tempo, o JobTracker iniciará outro tracker para reexecionar uma tarefa de mapa separada.
(1) Crie um projeto MAVEN relacionado no Eclipse, contando com o pacote JAR da seguinte maneira (você também pode se referir à configuração do POM do projeto Hadoop-Mapreduce-Examples sob o pacote de código-fonte Hadoop)
Nota: Para configurar um plug-in maven-jar-plugin e especificar mainClass
<Dependences> <pendency> <voupid> Junit </foupiD> <TRAFACTID> JUNIT </STIFACTID> <Versão> 4.11 </versão> </dependency> <pendency> <puperid> org.apache.hadoop </groupid> <stifactId> hadoop-mapduce-client-core </ArtifactId> <PupIDID> org.apache.hadoop </frugiD> <stifactId> hadoop-common </stifactId> <versão> 2.5.2 </version> </dependency> </dependências> <fuild> </plugins> <flugin> <plupiD> org.apache.maven.plugins </groupId> <stifactId> <Rechive> <Manifest> <MainClass> com.xxx.demo.hadoop.wordcount.wordcount </rainClass> </fasting> </chive> </figuration> </plugin> </plugins> </fruct>
(2) De acordo com o mecanismo de operação do MapReduce, um trabalho deve escrever pelo menos três classes para concluir as três coisas: a lógica do mapa, reduzir a lógica e o agendamento de empregos.
O código do mapa pode herdar org.apache.hadoop.mapreduce.mapper Classe
Classe estática pública TokenizermApper estende o Mapper <Objeto, Texto, Texto, IntWritable> {private final estático IntWrity One = new IntWritable (1); palavra de texto privado = novo texto (); // Como este exemplo não usa o parâmetro de chave, o tipo da chave é simplesmente especificado como objeto public void mapa (chave do objeto, valor de texto, contexto de contexto) lança ioexception, interruptedException {stringTokenizer itr = new StringTokenizer (value.toString ()); while (iTr.HasMORETOKENS ()) {word.set (iTR.NextToken ()); context.write (word, um); }}}O código da Reduce pode herdar org.apache.hadoop.mapreduce.reducer classe
classe pública IntsumredUcer estende o redutor <text, intwitável, text, intwitável> {private intwitcy resultado = new intwritable (); public void Reduce (tecla de texto, valores iterable <intwitrity>, contexto de contexto) lança a ioException, interruptedException {int sum = 0; for (intwitrity val: valores) {sum += val.get (); } resultado.set (soma); context.write (chave, resultado); }}Escreva o método principal para agendamento de empregos
public static void main (string [] args) lança Exceção {Configuration conf = new Configuration (); Trabalho job = job.getInstance (conf, "contagem de palavras"); Job.setJarbyClass (WordCount.class); job.setMapPerClass (TokenizermApper.class); Job.SetCombinerclass (intsumredcer.class); Job.SetReduCerclass (intsumredcer.class); job.setOutputKeyClass (text.class); job.setOutputValuEclass (intwritable.class); FileInputFormat.addinputPath (Job, novo caminho (args [0])); FileOutputFormat.setOutputPath (Job, novo caminho (args [1])); Job.WaitForCompletion (true); //System.exit(job.waitforCompletion(True)? 0: 1); }Execute o MVN Instale para digitar o projeto em um arquivo jar e carregá -lo para o ambiente do cluster Linux. Use o comando hdfs dfs -mkdir para criar o comando correspondente no sistema de arquivos HDFS. Use o HDFS DFS -put para fazer upload dos arquivos de dados que precisam ser processados no sistema HDFS. Exemplo: hdfs dfs -put $ {linux_path/arquivo de dados} $ {hdfs_path}
Execute o comando em um ambiente de cluster: hadoop jar $ {linux_path} /wordcount.jar $ {hdfs_input_path} $ {hdfs_output_path}
hdfs dfs -cat $ {hdfs_output_path}/nome do arquivo de saída
O método acima é executado no modo local quando o ambiente do cluster Hadoop não é iniciado. Neste momento, nem o HDFS nem o trabalho de fios. A seguir, é apresentado o trabalho que você precisa fazer ao executar o MapReduce Job no modo pseudo-distribuído. Primeiro, trecho das etapas listadas no site oficial:
Configure o nome do host
# vi /etc/sysconfig/network
Por exemplo:
Networking = yeshostName = mastervi /etc /hosts
Preencha o seguinte conteúdo
127.0.0.1 localhost
Configurar ssh sem intercomunicação de senha
ssh-keygen -t rsa
# cat?~/.ssh/id_rsa.pub?>>?~/.ssh/authorized_keys
Configure o arquivo Core-site.xml (localizado em $ {hadoop_home}/etc/hadoop/
<FIFIGURATION> <PROPTY> <name> fs.defaultfs </name> <value> hdfs: // localhost: 9000 </value> </propriedade> </figuration>
Configurar o arquivo hdfs-site.xml
<figuration> <erpoy> <name> dfs.replication </name> <Value> 1 </value> </propriedade> </figuration>
O comando a seguir pode executar o trabalho MapReduce no modo de pseudo-distribuição independente
1.Format the FileSystem:
$ bin/hdfs namenode -format
2.Start Daemon e DataNode Daemon:
$ sbin/start-dfs.sh
3.A saída de log dooim do Hadoop é gravada no diretório $ hadoop_log_dir (padrão para $ hadoop_home/logs).4.Compre a interface da Web para o Namenode; Por padrão, ele está disponível em:
Namenode - http: // localhost: 50070/
Faça os diretórios HDFS necessários para executar trabalhos MapReduce:
$ bin /hdfs dfs -mkdir /usuário
$ bin/hdfs dfs -mkdir/user/<username>
5.Copy Os arquivos de entrada no sistema de arquivos distribuídos:
$ bin/hdfs dfs -put etc/hadoop entrada
6. Faça alguns dos exemplos fornecidos:
$ bin/hadoop jar share/hadoop/mapReduce/hadoop-mapreduce-examples-2.5.2.Jar Grep saída de entrada 'dfs [az.]+'
7.examine os arquivos de saída:
Copie os arquivos de saída do sistema de arquivos distribuído para o sistema de arquivos local e examine -os:$ bin/hdfs dfs -et saída de saída
$ CAT Output/*
ouVeja os arquivos de saída no sistema de arquivos distribuído:
$ bin/hdfs dfs -cat saída/*
8. Quando estiver pronto, pare os daemons com:
$ sbin/stop-dfs.sh
O exposto acima é o conteúdo inteiro do código da instância do WordCount neste artigo, espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!