当前位置: 首页 > news >正文

MapReduce基础入门1

Hadoop系列

注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kafka Hbase Hive Flume等等~写的都是纯干货,各种顶会的论文解读,一起进步。
今天继续和大家分享一下MapReduce基础入门1
#博学谷IT学习技术支持


文章目录

  • Hadoop系列
  • 前言
  • 一、Map阶段
  • 二、Reduce阶段
  • 三、Driver运行入口
  • 总结


前言

在这里插入图片描述

1、MapReduce会将一个大的计算任务进行拆分,拆分成小任务,让这些小任务在不同的计算机中进行处理,最后再将这些小任务的结果记性整体汇总

2、MapReduce分为两个阶段,一个Map阶段负责任务的拆分,一个是Reduce阶段,负责任务的汇总

3、整个MapReduce工作流程可以分为3个阶段:map、shuffle、reduce。

作者这里用一个简单的单词计数案例来作为入门案例

一、Map阶段

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

public class WordCountMapper extends Mapper<LongWritable, Text,Text,LongWritable> {
    @Override
    protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, LongWritable>.Context context) throws IOException, InterruptedException {
        //1:想办法得到k2
        String[] wordArray = value.toString().split(" "); //["hadoop","allen"]

        //2:想办法得到v2
        //3:将k2 v2写入下一个环节
        for (String k2 : wordArray) {
            context.write(new Text(k2),new LongWritable(1));
        }

    }
}

二、Reduce阶段

这里入门案例先跳过shuffle阶段,直接来写Reduce阶段

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

import java.io.IOException;

public class WordCountReducer extends Reducer<Text, LongWritable,Text,LongWritable> {
    @Override
    protected void reduce(Text key, Iterable<LongWritable> values, Reducer<Text, LongWritable, Text, LongWritable>.Context context) throws IOException, InterruptedException {
        //1.想办法得到K3
        //2.想办法得到V3 遍历这个v2集合,将集合的内容进行相加
        long count = 0;
        for (LongWritable value : values) {
            count += value.get();
        }
        //3.将K3 V3写入上下文
        context.write(key,new LongWritable(count));
    }
}

三、Driver运行入口

运行MapReduce,需要一个Driver运行入口

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class WorderCountDriver {
    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException, URISyntaxException {
        //1.创建一个JOB对象
        Configuration configuration = new Configuration();

        Job job = Job.getInstance(configuration, "WordCountBase");

        //2.对JOB进行设置
        //2.1设置当前主类的名字
        job.setJarByClass(WorderCountDriver.class);

        //2.2设置数据路径
        FileInputFormat.addInputPath(job,new Path("hdfs://node1:8020/input"));

        //2.3指定mapper
        job.setMapperClass(WordCountMapper.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(LongWritable.class);

        //2.4指定reducer
        job.setReducerClass(WordCountReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);

        //2.5指定输出路径
        Path outPath = new Path("hdfs://node1:8020/output/wordcount");
        FileOutputFormat.setOutputPath(job,outPath);

        FileSystem fileSystem = FileSystem.get(new URI("hdfs://node1:8020"), new Configuration());
        boolean exists = fileSystem.exists(outPath);
        if (exists){
            fileSystem.delete(outPath,true);
        }

        //3.提交yarn执行
        boolean bl = job.waitForCompletion(true);

        //退出
        System.exit(bl ? 0 : 1);

    }
}


总结

一般所有MapReduce基础入门都是单词计数。因为这个比较简单。作为第一个入门案例最合适。

相关文章:

  • 嵌入式系统开发笔记88:认识51微控制器系统架构
  • monorepo
  • ReentrantLock源码解析
  • 矩阵的运算规则
  • 公众号查题方法-授权即可使用
  • ElasticSearch(二)【Kibana】
  • Shell-基础(一):Shell解释器、Shell脚本
  • 项目后端环境和前端环境的搭建
  • 8.Docker MySQL 主从复制
  • 深度学习环境配置10——Ubuntu下的torch==1.7.1环境配置
  • 【C++】初窥C++
  • 12、Java——对象和类案例代码详解
  • 26、Java 简单实现单例设计模式(饿汉式和懒汉式)
  • 创建对象在堆区如何分配内存
  • UI自动化测试还可以这样做?后悔没早点知道。
  • 5、React组件事件详解
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • conda常用的命令
  • JavaScript 奇技淫巧
  • Java方法详解
  • Java面向对象及其三大特征
  • leetcode388. Longest Absolute File Path
  • Material Design
  • mysql innodb 索引使用指南
  • Mysql优化
  • Vue 2.3、2.4 知识点小结
  • VUE es6技巧写法(持续更新中~~~)
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 从setTimeout-setInterval看JS线程
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 关于字符编码你应该知道的事情
  • 计算机在识别图像时“看到”了什么?
  • 检测对象或数组
  • 将回调地狱按在地上摩擦的Promise
  • HanLP分词命名实体提取详解
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (02)vite环境变量配置
  • (52)只出现一次的数字III
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C语言)二分查找 超详细
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (循环依赖问题)学习spring的第九天
  • (原)本想说脏话,奈何已放下
  • (转)fock函数详解
  • (转)jQuery 基础
  • (转)程序员技术练级攻略
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • (轉貼) UML中文FAQ (OO) (UML)
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?