tecnologias grande de dados Hadoop MapReduce (1) - MapReduce Visão Geral

Capítulo 1 MapReduce Overview

1,1 MapReduce definida

MapReduce é uma computação distribuída programa-quadro de programação "as aplicações de análise de dados baseados em Hadoop" o núcleo do framework é desenvolvido pelo usuário.
MapReduce é uma função essencial da lógica de negócios e código escrito pelo usuário que vem com os componentes padrão integrados em um programa de computação distribuída completa, executadas simultaneamente em um cluster Hadoop.

1,2 vantagens e desvantagens MapReduce

1.2.1 vantagem
  1. MapReduce fácil de programar
    simplesmente implementar algumas interfaces, você pode completar um programa distribuído, este programa pode ser distribuído a um grande número de máquinas de baixo custo PC distribuídos em execução. Que você escrever um programa distribuído, escrito com um programa de série simples é exatamente o mesmo. Devido a esta característica torna a programação MapReduce tornou-se muito popular.
  2. Boa escalabilidade
    quando seus recursos de computação não podem ser cumpridas, você pode estender o seu poder de computação, simplesmente adicionando máquina.
1.2.2 deficiências
  1. Não é bom em tempo real de computação
    MapReduce não como MySQL, retorna resultados dentro de milissegundos ou segundos.
  2. Não é bom fluxo de computação
    do fluxo de dados de entrada é calculado de forma dinâmica, e os dados de entrada definir MapReduce é estático, não mudanças dinâmicas. Isso ocorre porque os MapReduce suas próprias características de design determinar a fonte de dados deve ser estático.
  3. Não é bom no DAG (grafo orientado) é calculado
    dependências pluralidade de programas de aplicações, a aplicação de uma entrada para uma saída de uma frente. Neste caso, MapReduce não é não pode fazer, mas após o uso, a saída de cada trabalho de MapReduce é gravado no disco, ele irá causar um monte de IO de disco, resultando em um desempenho muito pobre.

1.3 MapReduce idéia central

O MapReduce núcleo ideias como a programação:
Aqui Insert Picture Descrição

  1. procedimentos de computação distribuída requerem frequentemente em pelo menos duas fases.
  2. A primeira fase de MapTask ocorrências simultâneas, completamente executado em paralelo, independente um do outro.
  3. ReduceTask segundo estágio instâncias simultâneas não relacionado, mas todos eles dependem dos dados de saída de uma fase MapTask ocorrências simultâneas.
  4. modelo de programação MapReduce pode conter apenas um palco e um Map Reduce fase, se a lógica de negócios do usuário é muito complexo, ele só pode vários programas MapReduce, operação serial.
    Resumo: WordCount análise de fluxo de dados para a compreensão em profundidade da idéia central de MapReduce.

1.4 processo MapReduce

Aqui Insert Picture Descrição

1,5 WordCount oficial fonte

Usando decompiler decompiling código-fonte, casos WordCount são encontrados classe Map, Reduzir classes e aulas de condução. E o tipo de dados é uma seqüência de tipo de pacote Hadoop em si.

1.6 Os tipos comuns de sequência de dados

Tabela correspondente ao tipo de tipos de dados vulgarmente utilizados sequência de dados Hadoop

tipo de Java Tipo Hadoop gravável
boleano BooleanWritable
Byte ByteWritable
int IntWritable
Flutuador FloatWritable
Grandes FloatWritable
Duplo DoubleWritable
Corda Texto
Mapa MapWritable
ordem ArrayWritable

1.7 especificação programação MapReduce

programa escrito dividido em três partes: Mapper, Redutor and Driver.
Aqui Insert Picture Descrição
Aqui Insert Picture Descrição

1,8 WordCount caso funcionamento prático

1. demanda

Estatísticas em uma determinada saída de arquivo de texto um número total de vezes que cada palavra aparece
(1) dados de entrada
escrever date.txt texto:

zhangsan  lisi  wanger  maizi
xiangming zhangsan  wanger  lisi
xiaoha mazi zhangsan

(2) os dados de saída desejados

lisi	2
maizi	1
mazi	1
wanger	2
xiangming	1
xiaoha	1
zhangsan	3
2. Análise de requisitos

De acordo com as especificações de programação MapReduce foram escritos Mapper, redutor, Motorista

3. Preparando o Ambiente

(1) criar um projeto Maven com IDEA
(2) adicionar o seguinte dependência no arquivo pom.xml

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>3.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>3.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>3.1.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-yarn-common</artifactId>
            <version>3.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-yarn-client</artifactId>
            <version>3.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-yarn-server-resourcemanager</artifactId>
            <version>3.1.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-mapreduce-client-core</artifactId>
            <version>3.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-mapreduce-client-jobclient</artifactId>
            <version>3.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-mapreduce-client-common</artifactId>
            <version>3.1.2</version>
        </dependency>
        <dependency>
            <groupId>net.minidev</groupId>
            <artifactId>json-smart</artifactId>
            <version>2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.anarres.lzo</groupId>
            <artifactId>lzo-hadoop</artifactId>
            <version>1.0.6</version>
        </dependency>
    </dependencies>

(3) projeto sob diretório de recursos / src / main, crie um arquivo chamado "log4j.properties", preencha o formulário.

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
4. programação

classe Mapper (1) write

package com.zhangyong.mapreduce;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;

/**
 * @Author zhangyong
 * @Date 2020/3/4 16:35
 * @Version 1.0
 * Mapper类 计算量
 * 泛型一:程序读取数据的偏移量
 * 泛型二:读到的内容
 * 泛型三:输出结果的类型
 * 泛型四:输出结果的内容
 */
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

    @Override
    /**
     * key:偏移量
     * value:读取到的内容
     * context:上下文
     */
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        System.out.println (key.get () + " " + value.toString ());
        String line = value.toString ();
        String[] split = line.split ("\\W+");
        for (String s : split) {
            context.write (new Text (s), new IntWritable (1));
        }
    }
}

classe redutor (2) write

package com.zhangyong.mapreduce;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

/**
 * @Author zhangyong
 * @Date 2020/3/4 16:35
 * @Version 1.0
 * Reducer类 统计量
 * 泛型一:Map传递过来的结果的类型
 * 泛型二: Map传递过来的结果的内容
 * 泛型三:输出结果的类型
 * 泛型四:输出结果的内容
 */
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        System.out.println (key + " : " + values);
        int sum = 0;
        for (IntWritable value : values) {
            sum += value.get ();
        }
        context.write (key, new IntWritable (sum));
    }
}

Motorista classe driver (3) write

package com.zhangyong.mapreduce;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

import java.io.IOException;


/**
 * @Author zhangyong
 * @Date 2020/3/4 16:35
 * @Version 1.0
 * Driver类 Hadoop入口程序
 */
public class WordCountDriver {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        Configuration cfg = new Configuration ();
        //设置本地模式运行(即使项目类路径下core-site.xml文件,依然采用本地模式)
        cfg.set ("mapreduce.framework.name", "local");
        cfg.set ("fs.defaultFS", "file:///");

        Job job = Job.getInstance (cfg);

        job.setJarByClass (WordCountDriver.class);

        //下面两行是默认值,可以省略
        job.setInputFormatClass (TextInputFormat.class);
        job.setOutputFormatClass (TextOutputFormat.class);

        //设置Mapper和Reducer
        job.setMapperClass (WordCountMapper.class);
        job.setReducerClass (WordCountReducer.class);

        //设置Mapper输出的类型
        job.setMapOutputKeyClass (Text.class);
        job.setMapOutputValueClass (IntWritable.class);

        //设置Reducer输出的类型
        job.setOutputKeyClass (Text.class);
        job.setOutputValueClass (IntWritable.class);

        //判断输出的路径是否存在,存在就删除
        Path out = new Path ("src/resources/output");
        FileSystem fs = FileSystem.get (cfg);
        if (fs.exists (out)) {
            fs.delete (out, true);
        }
        //设置待分析的文件夹路径
        FileInputFormat.addInputPath (job, new Path ("src/resources/input"));
        FileOutputFormat.setOutputPath (job, new Path ("src/resources/output"));

        boolean b = job.waitForCompletion (true);
    }
}
5. estrutura de diretório do projeto

Aqui Insert Picture Descrição

6. teste local

(1) a necessidade de configurar o ambiente local e ambiente java1.8 Hadoop3.1.2
(2) Idea executando o programa em
Aqui Insert Picture Descrição
conclusão irá gerar o arquivo de saída na corrida
Aqui Insert Picture Descrição

7. Teste Cluster

Aqui Insert Picture Descrição

Publicado 37 artigos originais · ganhou elogios 7 · vista 1177

Acho que você gosta

Origin blog.csdn.net/zy13765287861/article/details/104670538
Recomendado
Clasificación