Hadoop的第二个核心组件:MapReduce框架第一节

Hadoop的第二个核心组件:MapReduce框架第一节

  • 一、基本概念
  • 二、MapReduce的分布式计算核心思想
  • 三、MapReduce程序在运行过程中三个核心进程
  • 四、如何编写MapReduce计算程序:(编程步骤)
    • 1、编写MapTask的计算逻辑
    • 2、编写ReduceTask的计算逻辑
    • 3、编写Driver驱动程序
  • 五、MapReduce的案例实现 —— 大数据分布式计算的经典案例WordCount(单词计数)
    • 1、案例需求
    • 2、案例分析(基于MapReduce)
    • 3、代码开发

一、基本概念

Hadoop解决了大数据面临的两个核心问题:海量数据的存储问题、海量数据的计算问题

其中MapReduce就是专门设计用来解决海量数据计算问题的,同时MapReduce和HDFS不一样的地方在于,虽然两者均为分布式组件,但是HDFS是一个完善的软件,我们只需要使用即可,不需要去进行任何的逻辑的编辑。而MapReduce进行数据计算,计算什么样的数据,使用什么样的逻辑,MR程序都不清楚,因此MR只是一个分布式的计算【框架】,所谓的框架就是MR程序把分布式计算的思想和逻辑全部封装好了,我们只需要按照框架的思维编写计算代码(就是我们自己处理数据的逻辑代码),编写完成之后,我们的程序必然是分布式的程序。

使用分布式计算框架的好处就在于我们开发人员只需要把关注点和重点放在业务的逻辑开发,而非分布式计算程序逻辑的逻辑。

二、MapReduce的分布式计算核心思想

MR框架实现分布式计算的逻辑是将MR程序分成了两部分:Map阶段、Reduce阶段

其中运行一个计算程序先执行Map阶段,map阶段又可以同时运行多个计算程序(MapTask)去计算map阶段的逻辑,Map阶段主要负责分数据,而且map阶段的多个MapTask并行运行互不干扰。

第二阶段Reduce阶段,Reduce阶段也可以同时运行多个计算程序(ReduceTask),Reduce阶段的任务主要负责合数据,同时多个ReduceTask同时运行互不干扰的。

任何一个MR程序,只能有一个Map阶段,一个Reduce阶段。

三、MapReduce程序在运行过程中三个核心进程

MRAppMaster(一个):负责整个分布式程序的监控

MapTask(多个):Map阶段的核心进程,每一个MapTask处理数据源的一部分数据

ReduceTask(多个):Reduce阶段的核心进程,每一个ReduceTask负责处理Map阶段输出的一部分数据

四、如何编写MapReduce计算程序:(编程步骤)

1、编写MapTask的计算逻辑

1、编写一个Java类继承Mapper类,继承Mapper类之后必须指定四个泛型,四个泛型分别代表了MapTask阶段的输入的数据和输出的数据类型。
MR程序要求输入的数据和输出的数据类型必须都得是key-value键值对类型的数据。

2、重写继承的Mapper类当中的map方法,map方法处理数据的时候是文件中的一行数据调用一次map方法,map方法的计算逻辑就是MapTask的核心计算逻辑。

3、同时map方法中数据计算完成,需要把数据以指定的key-value格式类型输出。

2、编写ReduceTask的计算逻辑

1、编写一个Java类继承Reducer类,继承Reducer类之后必须指定四个泛型,四个泛型分别代表了Reduce阶段的输入和输出的KV数据类型。
Reduce的输入的KV类型就是Map阶段的输出的KV类型。
Reduce的输出类型自定义的。

2、重写Reducer类当中提供的reduce方法,reduce方法处理数据的时候一组相同的key调用一次reduce方法,reduce方法的计算逻辑就是ReduceTask的核心计算逻辑。

3、调用reduce方法,reduce逻辑处理完成,需要把数据以指定的key-value格式类型输出。

3、编写Driver驱动程序

Driver驱动程序是用来组装MR程序,组装MR程序的处理的文件路径、MR程序的Map阶段的计算逻辑、MR程序的Reduce阶段的计算逻辑、MR程序运行完成之后的结果的输出路径。

Driver驱动程序本质上就是一个main函数

MapReduce底层是由Java开发的,因此MR程序我们要编写的话支持使用Java代码来进行编写

五、MapReduce的案例实现 —— 大数据分布式计算的经典案例WordCount(单词计数)

1、案例需求

现在有一个文件,文件很大,文件中存储的每一行数据都是由空格分割的多个单词组成的,现在需要通过大数据分布式计算技术去统计文件中每一个单词出现的总次数

2、案例分析(基于MapReduce)

3、代码开发

1、创建一个maven管理的Java项目

2、引入MR的编程依赖

  • hadoop-client
  • hadoop-hdfs
<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>com.kang</groupId><artifactId>mr-study</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>mr-study</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><hadoop.version>3.1.4</hadoop.version></properties><dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>${hadoop.version}</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>${hadoop.version}</version></dependency></dependencies>
</project>

3、编写Mapper阶段的计算逻辑

package com.kang.wc;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;/*** 单词计数的MapTask的计算逻辑* 1、继承Mapper类。同时需要指定四个泛型 两两一组 分别 代表输入的key value 和输出的key value的数据类型*      默认情况下,map阶段读取文件数据是以每一行的偏移量为key 整数类型 每一行的数据为value读取的 字符串类型*      map阶段输出以单词为key 字符串 以1为value输出 整数*      数据类型不能使用Java中的数据类型,数据类型必须是Hadoop的一种序列化类型*      Int —— hadoop.io.IntWritable*      Long —— hadoop.io.LongWritable*      String —— hadoop.io.Text* 2、重写map方法*/
public class WCMapper extends Mapper<LongWritable, Text, Text, LongWritable> {/*** map方法就是MapTask的核心计算逻辑方法* map方法是切片中的一行数据调用一次* @param key   这一行数据的偏移量* @param value 这一行数据* @param context 上下文对象 用于输出map阶段处理完成的key value数据* @throws IOException* @throws InterruptedException*/@Overrideprotected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, LongWritable>.Context context) throws IOException, InterruptedException {//拿到一行数据,并且将一行数据转成字符串类型String line = value.toString();//字符串以空格切割得到一个数组,数组中存放的就是一行的多个单词String[] words = line.split(" ");//遍历数组 得到每一个单词 以单词为key 以1为value输出数据即可for (String word : words) {context.write(new Text(word),new LongWritable(1L));}}
}

4、编写Reducer阶段的计算逻辑

package com.kang.wc;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;/*** Reduce的编程逻辑:* 1、继承Reducer类,指定输入和输出的kv类型*      输入KV就是Map阶段的输出KV Text LongWritable*      输出kv  Text LongWritable* 2、重写reduce方法*/
public class WCReducer extends Reducer<Text, LongWritable,Text,LongWritable> {/*** Reduce方法是Reduce阶段的核心计算逻辑* reduce方法是一组相同的key执行一次* @param key      一组相同的key  某一个单词* @param values   是一个集合,集合存放的就是这一个单词的所有的value值* @param context  上下文对象 用于reduce阶段输出数据* @throws IOException* @throws InterruptedException*/@Overrideprotected void reduce(Text key, Iterable<LongWritable> values, Reducer<Text, LongWritable, Text, LongWritable>.Context context) throws IOException, InterruptedException {//只需要将某个单词聚合起来的value数据累加起来 得到总次数long sum = 0L;for (LongWritable value : values) {sum += value.get();}//只需要以单词为key 以sum为value输出即可context.write(key,new LongWritable(sum));}
}

5、编写Driver驱动程序

package com.kang.wc;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;/*** Driver驱动程序说白了就是封装MR程序的* Driver驱动程序其实就是一个main函数*/
public class WCDriver {public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {//1、准备一个配置文件对象ConfigurationConfiguration conf = new Configuration();//指定HDFS的地址conf.set("fs.defaultFS","hdfs://192.168.31.104:9000");//2、创建封装MR程序使用一个Job对象Job job = Job.getInstance(conf);//3、封装处理的文件路径hdfs://single:9000/wc.txtFileInputFormat.setInputPaths(job,new Path("/wc.txt"));//4、封装MR程序的Mapper阶段,还要封装Mapper阶段输出的key-value类型job.setMapperClass(WCMapper.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(LongWritable.class);//5、封装MR程序的Reducer阶段,还要封装reduce的输出kv类型job.setReducerClass(WCReducer.class);job.setOutputKeyClass(Text.class);job.setMapOutputValueClass(LongWritable.class);job.setNumReduceTasks(1);//指定reduce阶段只有一个ReduceTask//6、封装MR程序的输出路径 —— 输出路径一定不能存在  如果存在会报错FileOutputFormat.setOutputPath(job,new Path("/wcoutput"));//7、提交运行MR程序boolean flag = job.waitForCompletion(true);System.exit(flag?0:1);}
}

image-20230721191141473

image-20230721191153152

image-20230721191135459

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年数维杯数学建模A题河流-地下水系统水体污染研究求解全过程文档及程序

2023年数维杯数学建模 A题 河流-地下水系统水体污染研究 原题再现&#xff1a; 河流对地下水有着直接地影响&#xff0c;当河流补给地下水时&#xff0c;河流一旦被污染&#xff0c;容易导致地下水以及紧依河流分布的傍河水源地将受到不同程度的污染&#xff0c;这将严重影响…

SQL11 高级操作符练习(1)

描述 题目&#xff1a;现在运营想要找到男性且GPA在3.5以上(不包括3.5)的用户进行调研&#xff0c;请你取出相关数据。 示例&#xff1a;user_profile iddevice_idgenderageuniversitygpa12138male21北京大学3.423214male复旦大学4.036543female20北京大学3.242315female23浙…

C#__资源访问冲突和死锁问题

/// 线程的资源访问冲突&#xff1a;多个线程同时申请一个资源&#xff0c;造成读写错乱。 /// 解决方案&#xff1a;上锁&#xff0c;lock{执行的程序段}:同一时刻&#xff0c;只允许一个线程访问该程序段。 /// 死锁问题&#xff1a; /// 程序中的锁过多&#xf…

Java笔记:GC日志

1. 启用GC日志 -verbose:gc -XX:PrintGC -XX:PrintGCDetails -XX:PrintGCDateStamps -Xloggc:/opt/logs/gc.log在JDK 8中&#xff0c; -verbose:gc是 -XX:PrintGC一个别称&#xff0c;日志格式等价与&#xff1a; -XX:PrintGC。 不过在JDK 9中 -XX:PrintGC被标记deprecated…

ACM模板二:树、图、并查集、DancingLink

目录 〇&#xff0c;全文说明、宏定义代码 一&#xff0c;二叉树 二&#xff0c;树状数组、线段树 三&#xff0c;多叉树 四&#xff0c;并查集、DancingLink、无向图、最小生成树 五&#xff0c;有向图、单源最短路径、连通分量、拓扑排序 六&#xff0c;网格图、回路链…

深入解析顺序表:揭开数据结构的奥秘,掌握顺序表的精髓

&#x1f493; 博客主页&#xff1a;江池俊的博客⏩ 收录专栏&#xff1a;数据结构探索&#x1f449;专栏推荐&#xff1a;✅C语言初阶之路 ✅C语言进阶之路&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f525;编译环境&#xff1a;Visual Studio 2022&#x1f38…

【业务功能篇99】微服务-springcloud-springboot-电商订单模块-生成订单服务-锁定库存

八、生成订单 一个是需要生成订单信息一个是需要生成订单项信息。具体的核心代码为 /*** 创建订单的方法* param vo* return*/private OrderCreateTO createOrder(OrderSubmitVO vo) {OrderCreateTO createTO new OrderCreateTO();// 创建订单OrderEntity orderEntity build…

【ESP32】带 log 记录的 malloc 动态申请内存,用于debug 调试查找报错原因

本文章以ESP32为依托&#xff0c;旨在解决在【嵌入式工程】开发过程中&#xff0c;在动态申请内存这部分&#xff0c;由于 malloc 之后&#xff0c;忘记 free 释放&#xff0c;造成内存溢出导致 MCU重启的问题 &#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好…

linux安装nacos2.2.0

1、使用docker拉取镜像&#xff1a;docker pull nacos/nacos-server:v2.2.0 2、下载官方配置文件&#xff1a;https://github.com/alibaba/nacos/releases 3、修改配置文件的数据库连接信息&#xff0c;修改完成后将配置文件移至挂载目录/home/shixp/docker/nacos/conf&#xf…

统计表和流程分析,也能同屏呈现_三叠云

表单统计&流程分析 路径 表单设计 >> 表单设置 >> 拓展设置 >> 表单统计 功能简介 新增表单统计、流程分析功能&#xff08;Beta版&#xff09;。可在当前列表&#xff0c;直接看到表单的统计表和流程分析数据统计图表。 1. 统计表&#xff1a;统计…

实时美颜的背后:视频直播美颜SDK的算法与原理

美颜技术的应用范围已经广泛扩展&#xff0c;从自拍照片到视频直播&#xff0c;都可以看到它的踪迹。然而&#xff0c;视频直播的实时性要求比静态图像高得多。要实现实时美颜&#xff0c;必须克服许多技术挑战。这就是视频直播美颜SDK的用武之地。 一、实时美颜的挑战 实时…

如何使用CMD恢复删除的分区?

分区删除后可以恢复吗&#xff1f; 磁盘分区旨在二级存储上创建一个或多个区域&#xff0c;然后你可以单独管理每个区域&#xff0c;这些区域就是分区。因此&#xff0c;对新安装的存储设备进行分区是很重要的环节&#xff0c;只有分区后才可以在这些设备上创建文件并保存数…

Spring Boot 下载文件(word/excel等)文件名中文乱码问题|构建打包不存在模版文件(templates等)

Spring Boot 下载文件(word/excel等)文件名中文乱码问题&#xff5c;构建打包不存在模版文件(templates等) 准备文件&#xff0c;这里我放在resource下的templates路径 在pom中配置构建打包的资源&#xff0c;更新maven 如果使用了assembly打包插件这样配置可能仍不生效&#…

理财是什么?怎样学习理财?

大家好&#xff0c;我是财富智星&#xff0c;今天跟大家分享一下理财是什么&#xff1f;怎样学习理财的方法。 一、理财的基本原则 1、理财应注重投资而不是投机&#xff0c;要与时间为友。 让我们先考虑以下问题&#xff1a;什么样的回报才算是真正的高回报&#xff1f;假设有…

2023年一级建造师建设工程经济真题

2023年一级建造师建设工程经济真题 1.根据《建设工程工程量清单计价规范》规定&#xff0c;代表专业工程的项目编码是 ()。 A、1&#xff0c;2 B、3&#xff0c;4 C、5&#xff0c;6 D、7&#xff0c;8&#xff0c;9 【答案】B 2.某公司希望所投资项目在第5年末回收1000万…

LoGoNet:基于局部到全局跨模态融合的精确 3D 目标检测

论文地址&#xff1a;https://arxiv.org/abs/2303.03595 论文代码&#xff1a;https://github.com/sankin97/LoGoNet 论文背景 激光雷达传感器点云通常是稀疏的&#xff0c;无法提供足够的上下文来区分远处的区域&#xff0c;从而造成性能次优。 激光雷达-摄像机融合方法在三…

[NLP] LLM---扩充词表LLama2-构建中文tokenization

使用SentencePiece的除了从0开始训练大模型的土豪和大公司外&#xff0c;大部分应该都是使用其为当前开源的大模型扩充词表&#xff0c;比如为LLama扩充通用中文词表&#xff08;通用中文词表&#xff0c;或者 垂直领域词表&#xff09;。那这部分工作有没有意义呢&#xff1f;…

实验室电磁铁EM4的技术参数

锦正茂EM4电磁铁可以通过更换电磁铁极头在一定范围内改善磁场的大小和磁场的均匀度 &#xff0c;并且可以通过调整极头间距改变磁场的大小&#xff0c;该种类型的电磁铁能够很好的与客户设计的磁场平台兼容。主要用于磁滞现象研究、磁化系数测量、霍尔效应研究、磁光实验、磁场…

WebSocket的优缺点

WebSocket的优缺点 1. WebSocket概念 1.1 WebSocket优点 低延迟全双工长期运行双向实时通信 1.2 什么是心跳机制 为了保持WebSocket稳定的长连接,在建立连接后,服务器和客户端之间需要通过心跳包来保持连接状态,以防止连接因长时间没有数据传输而被切断. 心跳包是一直特殊…