【Big Data】Hadoop--MapReduce经典题型实战(单词统计+成绩排序+文档倒插序列+每月Top3温度)

news2024/11/25 18:37:31

🍊本文使用了4个经典案例进行MapReduce实战

🍊参考官方源码,代码风格较为优雅

🍊解析详细

一、Introduction

MapReduce是一个分布式运算程序的编程框架,核心功能是将用户写的业务逻辑代码和自身默认代码整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群

其整体架构逻辑如下

Map读取数据,进行简单数据整理
Shuffle整合Map的数据
Reduce计算处理Shuffle中的数据

二、WordCount

2.1 题目

统计文件中每个单词出现的个数。左侧为原始数据,右侧为输出数据。

2.2 解析

WordCount统计单词个数是最基础的题目,我们除了要完成题目要求之外,代码尽量更加的优雅,因此我们主要参考的是Hadoop官方提供的WordCount案例

数据的走下如下 

2.3 Mapper

Mapper中需要注意的是 Mapper<LongWritable, Text, Text, IntWritable>

<LongWritable,Text>为输入,<Text,IntWritable>为输出,或许很难理解为什么输出是<LongWritable,Text>,其实Text表示每一行的数据,LongWritable为每一行数据第一个数据在整个文件的偏移量,我们打印一下每次的Text和LongWritable

package com.bcn.mapreduce.wordcount;

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

/**
 * 输入数据为<单词偏移量,单词>
 * 输出数据为<单词,出现次数>
 */
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    // Just craete one Text and IntWritable object to reduce waste of resources
    Text outK = new Text();
    IntWritable outV = new IntWritable(1);

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

        // Get one line
        String line = value.toString();
        System.out.println(line);
        System.out.println(key);

        // split the word by space
        String[] words = line.split(" ");

        // output
        for (String word : words) {
            outK.set(word);
            context.write(outK, outV);
        }
    }
}

2.4 Reducer

我们关注的还是数据的走向  Reducer <Text, IntWritable,Text,IntWritable> ,<ext,IntWritable>为数据输入,与Mapper的输出是一致的

这里可能很多人为疑惑为什么输入的是<Text, IntWritable>,但是我们重写reduce时却使用了<Text key,Iterable<IntWritable> values>,这是因为中间省略掉了我们看不见的Shuffle阶段

package com.bcn.mapreduce.wordcount;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class WordCountReducer extends Reducer <Text, IntWritable,Text,IntWritable> {
    int sum;
    IntWritable outV=new IntWritable();
    @Override
    protected void reduce(Text key,Iterable<IntWritable> values, Context context)throws IOException, InterruptedException {
        // Sum up
        sum =0;
        // The data for example apple,(1,1,1)
        for (IntWritable count:values){
            sum += count.get();
        }
        //Output
        outV.set(sum);
        context.write(key,outV);
    }
}

2.4 Dreiver 

最后我们设置启动类,也就是Main函数,在其中会配置7套件,这样就可以运行整个MapReduce程序了

package com.bcn.mapreduce.wordcount;
import java.io.IOException;
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;

public class WordCountDriver {
    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
        // 1.Get the config and job
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf);

        // 2.Connect Driver with jar
        job.setJarByClass(WordCountDriver.class);

        // 3.Connect with Mapper、Reducer
        job.setMapperClass(WordCountMapper.class);
        job.setReducerClass(WordCountReducer.class);

        // 4.Set the class of Mapper output
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        // 5.Set the class of final output
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        // 6.Set the input and output path
        FileInputFormat.setInputPaths(job, new Path("E:\\Hadoop and Spark\\data\\word.txt"));
        FileOutputFormat.setOutputPath(job, new Path("E:\\Hadoop and Spark\\output\\wordCount"));

        // 7.Submit the job
        boolean result = job.waitForCompletion(true);
        System.exit(result ? 0 : 1);

    }

}

三、Grade Sort

3.1 题目

3.2 解析

3.3 Entity

3.4 Mapper

3.5 Reducer

3.6 Driver

四、Document Revere

4.1 题目

4.2 解析

4.3 Entity

4.4 Mapper

4.5 Reducer

4.6 Driver

五、Weather Top3

5.1 题目

5.2 解析

5.3 Entity

5.4 Mapper

5.5 Reducer

5.6 Driver

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48485.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue+videojs视频播放、视频切换、视频断点分段上传

“本次需求是做一个视频列表&#xff0c;点击视频列表播放对应视频&#xff1b;同时要求实现断点分段上传大文件&#xff08;视频&#xff09;的功能 。 videojs文档&#xff1a;Getting Started with Video.js - Video.js: The Player Framework | Video.js 断点续传组件地址…

WebRTC学习笔记六 兼容性 adapter.js

一、adapter.js发展背景 adapter.js自2012年底或者2013年初WebRTC早期的时候就已经出现了。它最初是Google的apprtc demo的一部分。原始版本仍可在Chrome tree中找到。它是一个非常小的项目&#xff0c;还没有150行。主要功能是隐藏像webkitRTCPeerConnection和mozRTCPeerConne…

Spring Boot+Mybatis:实现数据库登录注册与两种properties配置参数读取

〇、参考资料 1、hutool介绍 https://blog.csdn.net/abst122/article/details/124091375 2、Spring BootMybatis实现登录注册 https://www.cnblogs.com/wiki918/p/16221758.html 3、Spring Boot读取自定义配置文件 https://www.yisu.com/zixun/366877.html 4、Spring Boot读取p…

医院用故障电弧探测器AAFD 安科瑞 时丽花

摘 要&#xff1a; 医院运行中对于用电方面的要求越来越高&#xff0c;为了更好地体现用电价值&#xff0c;首先应该确保用电的安全性&#xff0c;尤其是对 于越来越繁杂的医院用电系统。基于此&#xff0c;在未来医院用电过程中应该加大关注力度&#xff0c;切实做好相关管理工…

Compose学习-> Text()

设置文本&#xff1a;text xxx 直接设置 Text(text "我是一个Text")引用资源文件&#xff1a;stringResource Text(text stringResource(id R.string.string_text))设置字体颜色&#xff1a;color xxx 引用系统自带的颜色 Text(text "我是一个Text"…

【技术分享】NB860+Lierda云平台=上电即上云——云管端协作让万物互联更简单(二)

随着物联网行业的快速发展&#xff0c;越来越多的物联网云服务平台涌现。如何快速实现应用开发&#xff0c;如何管理&#xff0c;如何让设备快速上云&#xff0c;成为关注的焦点。 第一期中我们介绍了基于MQTT协议快速接入利尔达物联网全连接云平台&#xff0c;本期我们将介绍如…

ManageEngine 第六次入选 Gartner® 安全信息和事件管理魔力象限™!

今天&#xff0c;我们很高兴地宣布&#xff0c;ManageEngine 已在2022年 Gartner 安全信息和事件管理 (SIEM) 魔力象限中获得认可&#xff0c;今年已经是其连续第六次出现在Gartner中。ManageEngine非常高兴再次获得这一认可。 在过去两年中&#xff0c;互联网向云计算的转变不…

svn的常规使用

svn的常规使用svn的常规使用1 客户端2 svn server3 qt使用svn4 svn项目迁移svn的常规使用 1 客户端 下载地址&#xff1a;官网&#xff0c;中文简体语言包在其下方 分别安装客户端可语言包&#xff0c;在安装语言包的时候勾选应用&#xff0c;svn便可变成中文了&#xff0c;或…

改革后IB数学该如何选?

IB数学&#xff0c;作为一个IB课程里必选科目&#xff0c;让无数IB学霸为之自豪&#xff0c;他们能解出外教都不会做的题。另一方面&#xff0c;也让很多同学&#xff08;自称“学渣”&#xff09;避之不及。 从2019年起&#xff0c;IB数学教学大纲发生重大改革。▲图源&#x…

Android -- 每日一问:如何理解 Android 中的 Context,它有什么用?

经典回答 官方文档对于 Context 的解释&#xff1a; Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and cla…

[附源码]SSM计算机毕业设计学生宿舍设备报修JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

光格科技将于12月6日上会:拟募资6亿元,姜明武为实控人

近日&#xff0c;苏州光格科技股份有限公司&#xff08;下称“光格科技”&#xff09;在上海证券交易所科创板递交招股书&#xff08;上会稿&#xff09;。据贝多财经了解&#xff0c;光格科技将于2022年12月6日接受科创板上市委的现场审议。 公开信息显示&#xff0c;光格科技…

微信小程序开发笔记

微信小程序开发笔记html条件渲染列表渲染按钮组件 buttoncss单位 rpx、px、vw、vh、rem定位方法设置图片为页面的背景自定义按钮的图标js全局变量底部导航栏 tabBar其他配置config.js带参数跳转页面云数据库的使用初始化查找地图组件 map从云数据库中调用经纬度&#xff0c;并且…

【附源码】计算机毕业设计JAVA资源循环利用

【附源码】计算机毕业设计JAVA资源循环利用 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA mybati…

数字化门店| 美业/医美门店管理系统 | 医美小程序

近些年来&#xff0c;随着人们消费升级和颜值经济的不断驱动&#xff0c;美业发展非常迅速&#xff0c;而医美行业也顺势规模增长。 当今互联网时代&#xff0c;各行业都在开展门店数字化转型&#xff0c;而这也让不少医美医院愿意构建基于门店会员管理的O2O闭环&#xff0c;并…

Vscode同时开发前后端

VSCode统一前后端文档 一、软件下载 软件地址下载 Documentation for Visual Studio Code 二、软件汉化 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B0uCKmDL-1669770108463)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALA…

React+Electron快速创建并打包成桌面应用

一、创建react项目 首先使用creat-react-app脚手架来创建一个react项目 # 安装 create-react-app 命令,如果已将安装请忽略 npm install -g create-react-app # 创建 react项目 create-react-app react-electron # 启动项目( create-react-app 真的超级方便啊) cd react-elec…

数仓之hive自定义UDTF函数详解

学习目录一、自定义UDTF函数一、自定义UDTF函数 1.说明文档 A custom UDTF can be created by extending the GenericUDTF abstract class and then implementing the initialize, process, and possibly close methods. The initialize method is called by Hive to notify t…

全局JSON序列化导致prometheus数据格式错乱

现象 现场配置完prometheus端点后&#xff0c;返回数据格式乱了&#xff0c;如下图所示 正常结果数据如下图所示 分析 在单个微服务上访问prometheus端点数据返回格式正常。在小型化化格式返回就错乱了。数据返回格式是由消息转化统一处理的。在小型化工程中&#xff0c;…

有限责任公司股东出资的方式有哪几种

一、有限责任公司股东出资的方式有哪几种 有限责任公司股东出资的方式有以下两种&#xff1a; 1.货币出资方式。股东以货币出资的&#xff0c;应当将货币出资足额存入公司在银行开设的账户&#xff1b; 2.非货币财产作价出资方式。以非货币财产出资的&#xff0c;应当依法办…