mapreduce

mapreduce

1、概念:

它是一个分布式并行计算的应用框架
它提供相应简单的api模型,我们只需按照这些模型规则编写程序,
即可实现"分布式并行计算"的功能。

2、MAPREDUCE编程规范

编程有三个部分组成:
1、编写MapTask(负责map阶段的整个数据处理流程)
2、编写ReduceTask(负责reduce阶段的整个数据处理流程)
3、Driver:提供运行MapReduce环境的(负责整个程序的过程调度及状态协调)

3、wordcount实例

在这里插入图片描述

Shuffling是MapReduce内部自动执行,即是分组(分区过程),不需要用户编写程序
即是先按key进行排序,然后进行分区。

运行模式

1、集群运行模式

WcMapTask.java

package com.gec.wordcount;

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;

/**
 * 作用:体现MapReduce的map阶段的实现
 * KEYIN:输入参数key的数据类型
 *VALUEIN:输入参数value的数据类型
 * KEYOUT,输出key的数据类型
 * VALUEOUT:输出value的数据类型
 * 输入:
 *      map(key,value)=偏移量,行内容
 *
 * 输出:
 *      map(key,value)=单词,1
 *
 * 数据类型:
 * java数据类型:
 * int-------------->IntWritable
 * long------------->LongWritable
 * String----------->Text
 * 它都实现序列化处理
 */

public class WcMapTask extends Mapper<LongWritable, Text,Text, IntWritable> {
    /*
    *根据拆分输入数据的键值对,调用此方法,有多少个键,就触发多少次map方法
    * 参数一:输入数据的键值:行的偏移量
    * 参数二:输入数据的键对应的value值:偏移量对应行内容
    * */

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String line = value.toString();

        String words[] = line.split(" ");

        for (String word:words
             ) {
            context.write(new Text(word),new IntWritable(1));

        }
    }
}

WcReduceTask.java

package com.gec.wordcount;

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

import java.io.IOException;
/*
 * 此类:处理reducer阶段
 *   汇总单词次数
 * KEYIN:输入数据key的数据类型
 * VALUEIN:输入数据value的数据类型
 * KEYOUT:输出数据key的数据类型
 * VALUEOUT:输出数据value的数据类型
 *
 *
 * */
public class WcReduceTask extends Reducer<Text, IntWritable,Text,IntWritable> {
    /*
     * 第一个参数:单词数据
     * 第二个参数:集合数据类型汇总:单词的次数
     *
     * */
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int count = 0;
        for (IntWritable value : values) {
            count+=value.get();
        }
        context.write(key,new IntWritable(count));
    }
}

WcMrJob.java

package com.gec.wordcount;


import org.apache.hadoop.conf.Configuration;
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.output.FileOutputFormat;

import java.io.IOException;

/*
0、指明Driver的类
1、指明运行map task的类
2、指明运行reducer task的类
3、指明输入文件的io流类型
4、指明输出文件的io流类型
 */
public class WcMrJob {
    public static void main(String[]args) throws IOException, ClassNotFoundException, InterruptedException {
        Configuration configuration = new Configuration();
        Job job = Job.getInstance(configuration);

        //设置Driver类
        job.setJarByClass(WcMrJob.class);
        //设置运行那个map task
        job.setMapperClass(WcMapTask.class);
        //设置运行那个reducer task
        job.setReducerClass(WcReduceTask.class);

        //设置map task的输出key数据类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        //设置reduce的输出key的数据类型和输出value的类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        //指明要处理的数据 所在的位置
        FileInputFormat.setInputPaths(job,"hdfs://hadoop0:9000/wordcount/input/big.txt");

    //指定处理完成之后结果所保存的位置
        FileOutputFormat.setOutputPath(job,new Path("hdfs://hadoop0:9000/wordcount/output/"));
        //向yarn集群提交这个job
        boolean res = job.waitForCompletion(true);
        System.exit(res?0:1);
    }
}

运行方式:

  • 在idea上新建一个maven模板mapreducewordcount

    步骤:File->new->model->maven

    然后如图,点击下一步,完成
    在这里插入图片描述

  • 编辑上述java文件

  • 在idea上使用package打包WcMrJob.java成jar包
    在这里插入图片描述

  • 复制打包后的 文件(在工程视图的targe找到生成的tar文件,然后复制到hadoop中)

  • 启动hdfs和yarn

  • 然后在集群的任意一个节点上用hadoop命令启动:$
    hadoop
    jar jar包名称 (main方法所在job类的全路径com.gec.bigdata.mrsimple.WordCountDriver inputpath outputpath

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值