Hadoop基础学习五(MapReduce,wordcount)

一、MapReduce

1.概述

mapreduce是一个分布式计算模型,由map和reduce两个阶段组成,map和reduce阶段都是一个独立的程序,由很多个节点同时运行,每个节点处理一部分数据,可以只有map,不可以只有reduce。

2.过程

1.map阶段

1)切片
从hdfs上读取数据,在读取数据时,首先要对要读取的文件进行逻辑上的划分,每个block块对应一个切片,切片大小由block的大小决定(默认为128MB,但占用空间是实际文件的大小),该切片过程通过InputFormat类的子类FileInputFormat类来实现,每个切片对应一个map任务;
2)获取记录
通过InputFormat的子类TextInputFormat处理类将切片lnputSplit解析成k-v格式,此时的k1为偏移量,v1为每一行的数据
3)调用map函数
每行数据调用一次map函数,根据自己的逻辑,生成中间数据 k2,v2
4)判断

  • 如果没有reduce,直接将结果输出到hdfs中
  • 如果有reduce阶段,框架对map输出的<k2,v2>进行分区,对每个分区中的数据按照k2进行排序分组,中间数据写入本地Linux的磁盘中

2.reduce阶段

1.拉取数据
从各个map对应的linux磁盘拉取数据,按照不同的分区copy到不同的reduce节点,将每个分区相同的key数据分为一组,一组数据调用一次reduce函数
2.reduce函数
reduce方法的形参是<k2,{v2…}>,输出是<k3,v3>。根据自己的逻辑将,k3,v3输出
3.框架把reduce的输出保存到HDFS中。

框架对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。这个过程称作shuffle。

3.实现

MapReduce框架都有默认实现,用户只需要覆盖map()和reduce()两个函数,即可实现分布式计算

二、wordcount

先将本地数据上传至Linux中,再将Linux中的数据上传至hdfs中,此次要操作的文件为wordcount.txt
在这里插入图片描述

1.编写代码并打包

代码实现

package mapreduce;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

public class MR_WC_Demo {
    //map阶段
    public static class Mymap extends Mapper<LongWritable,Text,Text,LongWritable> {

        @Override
        protected void map(LongWritable k1, Text v1, Context context) throws IOException, InterruptedException {
            String string = v1.toString();
            String[] split = string.split(",");
            for(String s:split){
                String k2=s;
                long v2=1l;
                context.write(new Text(k2),new LongWritable(v2));
            }
        }
    }
    //reduce阶段

    public static class Myreduce extends Reducer<Text,LongWritable,Text,LongWritable>{
        @Override
        protected void reduce(Text k2, Iterable<LongWritable> v2s, Context context) throws IOException, InterruptedException {
            long s=0l;
            for(LongWritable v:v2s){
                s=s+v.get();
            }
            context.write(k2,new LongWritable(s));
        }
    }
    //组装mapreduce
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        //获取配置项
        Configuration conf = new Configuration();
        //获取job任务,给任务起个名字。这里直接以类命名
        Job job = Job.getInstance(conf,MR_WC_Demo.class.getSimpleName());
        //指定打jar包的类
        job.setJarByClass(MR_WC_Demo.class);
        //指定输入的hdfs的路径
        FileInputFormat.addInputPath(job,new Path(args[0]));
        //指定map和reduce的序列化类型以及任务类
        job.setMapperClass(Mymap.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(LongWritable.class);

        job.setReducerClass(Myreduce.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);
        //指定输出到hdfs的路径
        FileOutputFormat.setOutputPath(job,new Path(args[1]));
        //提交任务,将值设为true,用于打印日志
        job.waitForCompletion(true);
    }
}

打包
在这里插入图片描述
正常打包成功会在target下
在这里插入图片描述
如果找不到jar可能是在poem中设置了打包的标签,默认为jar包,把该标签去掉就行

<packaging>pom</packaging>   --------->   父类型都为pom类型

<packaging>jar</packaging>      --------->   内部调用或者是作服务使用

<packaging>war</packaging>    --------->   需要部署的项目

在这里插入图片描述
poem.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>dashuju</groupId>
    <artifactId>Hadoop</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.6.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>2.6.0</version>
    </dependency>
    <!-- hdfs-->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>2.6.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-jdbc</artifactId>
        <version>1.2.1</version>
    </dependency>
    <!-- hive-udf -->
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-exec</artifactId>
        <version>1.2.1</version>
    </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.36</version>
        </dependency>
    </dependencies>
</project>

在这里插入图片描述

2.将包上传至Linux中

在这里插入图片描述
在这里插入图片描述

3.运行jar包

在这里插入图片描述

4.查看输出

在这里插入图片描述
在这里插入图片描述

java
java入门基础学习(一)
java入门基础学习(二)
java入门基础学习(三)
java入门基础学习(四)
java入门基础学习(五)
java入门基础学习(六)
java入门基础学习(七)
java入门基础学习(八)
java入门基础学习(九)
java入门基础学习(十)
java入门基础学习(十一)
java入门基础学习(十二)
java入门基础学习(十三)
java入门基础学习(十四)Maven Git
java总结,题目+笔记
java进阶之常见对象(一)
java进阶之常见对象(二)
java进阶之冒泡排序
java进阶之选择排序
java进阶之面向对象(封装)
java进阶之面向对象(代码块、继承)
java进阶之面向对象(多态、抽象、接口)
java进阶之匿名内部类、访问修饰符、包
java进阶之io流(字节流,字符流)
java应用一(反射的应用)
java应用二(配置文件、工具类)
java应用三(数据库索引、spring)
java应用四(连接池)
Linux
Linux基础一
Linux基础二
Mysql
mysql一
mysql二
mysql三
mysql四
java连接数据库
redis
redis一(缓存,redis简介)
redis二(单节点安装,桌面插件)
redis三(指令的使用)
redis四(java与redis的连接,基本指令在java中的操作)
redis五(练习)
redis七(持久化)
redis九(集群安装)
Hadoop
hadoop学习一
hadoop学习二
hadoop学习三
hadoop学习四

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值