四、MapReduce

4.1 概述

MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)“和"Reduce(归约)”,是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。

MapReduce是Hadoop框架的一个并行计算框架,将一个计算任务拆分成两个阶段:Map和Reduce

MapReduce计算框架充分利用了 存储节点(DataNode)所在物理主机的计算资源进行并行计算

默认情况下NodeManager会将本进程运行 的节点的计算资源抽像成8个计算单元,每个单元称之为一个Contioner,所有的NodeManager都由ResourceManager调度,ResourceManager负责计算资源的统筹分配。

一是软件框架 二是并行处理 三 可靠容错 四 大规模计算 五 处理海量数据

MapReduce擅长做大数据处理,MapReduce的思想就是分而治之

  • Map负责**”分“**,即把庞大且复杂的任务分解成若干个”简单的任务“来处理,简单的任务包含三层

    • 是对数据或者计算模型相对于原任务要大大缩小
    • 就近计算原则,就是任务会被分配到存放所需数据的节点上进行计算
    • 这些小任务不止一个且并行计算,而且彼此间没有依赖关系
  • Reducer负责对Map的计算结果进行汇总

4.2 为什么使用MR?

package com.baizhi.hdfs;import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;public class CleanApp {public static void main(String[] args) throws Exception {File file = new File("G:\\Note\\Day02-Hadoop\\数据文件\\access.tmp2019-05-19-10-28.log");BufferedReader bufferedReader = new BufferedReader(new FileReader(file));FileWriter fileWriter = new FileWriter("G:\\Note\\Day02-Hadoop\\数据文件\\clean.log");while (true) {String line = bufferedReader.readLine();if (line == null) {bufferedReader.close();fileWriter.close();return;}boolean contains = line.contains("thisisshortvideoproject'slog");if (contains) {String s = line.split("thisisshortvideoproject'slog")[0];fileWriter.write(s.trim() + "\n");fileWriter.flush();}}}
}

上述代码是对日志进行简单的清晰,在数据量少的时候一点问题都没有,但是数据量一旦增加,就可能无法胜任需求,因为无法在合理的时间内完成计算,此时单机性能已经成为计算的瓶颈,但是手写分布式应用程序难度太大,有现成的框架可以使用,那就是MR!

4.3 YARN 环境搭建

(1)什么是 YARN ?

Yarn作为一个资源调度平台,有一个全局的管理者叫做ResourceManager,ResourceManager负责对集群的整体计算及资源做统筹规划,有各个节点的管理者叫做NodeManager,负责向ResourceManager报告其计算资源的使用情况,在NodeManger中有一个MRAppMaster管理这里当前运行的MRApp,其任务是协调来自ResourceManager的资源,并与NodeManager一起执行和监视任务。

ResourceManager:负责对集群的整体计算及资源做统筹规划

NodeManager:管理主机上的计算组员,负责向RM 汇报自身的状态信息

MRAppMaster:计算任务的Master,负责申请计算资源,协调计算任务

YARN Child:负责做实际计算任务

Container:计算资源的抽象单元

(2)配置YARN

etc/hadoop/yarn-site.xml

 <property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><property><description>The hostname of the RM.</description><name>yarn.resourcemanager.hostname</name><value>HadoopNode00</value></property>

etc/hadoop/mapred-site.xml

etc/hadoop/ 下其实是没有这个文件 的但是有yitmp结尾的文件,将其改名即可

<property><name>mapreduce.framework.name</name><value>yarn</value>
</property>

(3)启动YARN

[root@HadoopNode00 ~]# start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /home/hadoop/hadoop-2.6.0/logs/yarn-root-resourcemanager-HadoopNode00.out
localhost: starting nodemanager, logging to /home/hadoop/hadoop-2.6.0/logs/yarn-root-nodemanager-HadoopNode00.out
[root@HadoopNode00 ~]# jps
60192 Jps
60046 ResourceManager
60142 NodeManager

web 界面: hostname:8088

4.4 MR 入门程序

需求:
wangkai gjf zkf suns gzy
wangkai zkf suns gzy
zkf suns gzy hxz leijunwangkai 2
gjf 1
zkf 3
suns 3
gzy 3
hxz 1
leijun 1

(1)依赖

  <dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-mapreduce-client-jobclient</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-mapreduce-client-core</artifactId><version>2.6.0</version></dependency>

(2)Mapper 逻辑

package com.baizhi.mr.test01;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;/*
* keyIn  LongWritable (Long) 输入文本字节偏移量
* valueIn Text (String)      输入文本行
*  keyOut Text(String)
*  valueOut IntWritable(Int)
* */public class WCMapper  extends Mapper<LongWritable, Text,Text, IntWritable> {@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String[] names = value.toString().split(" ");for (String name : names) {context.write(new Text(name),new IntWritable(1));}}
}

(3)Reduce 逻辑

package com.baizhi.mr.test01;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;/**keyIn Text 与mapper的keyOut的数据类型相对应*valeuIn IntWritable   与mapper的ValueOut的数据类型相对应* KeyOut* valueOut* */
public class WCReducer extends Reducer<Text, IntWritable, Text, IntWritable> {@Overrideprotected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int sum = 0;for (IntWritable value : values) {sum += value.get();}context.write(key, new IntWritable(sum));}
}

(4)Job封装

package com.baizhi.mr.test01;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.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;public class JobRunner {public static void main(String[] args) throws Exception {/** 获取配置对象* */Configuration conf = new Configuration();/** 获取Job对象* */Job job = Job.getInstance(conf);/** 设置数据输入输出组件* */job.setInputFormatClass(TextInputFormat.class);job.setOutputFormatClass(TextOutputFormat.class);/**设置数据输入输出路径* */TextInputFormat.setInputPaths(job, new Path("/wordcount.txt"));/** 注意: 此输出路径不能存在* */TextOutputFormat.setOutputPath(job, new Path("/baizhi/out1"));/** 设置MAP 和 REDUCE 处理逻辑* */job.setMapperClass(WCMapper.class);job.setReducerClass(WCReducer.class);/** 设置 map任务和reduce任务的输出泛型* */job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);//  提交//job.submit();job.waitForCompletion(true);}
}

4.5 部署运行

(1)远程Jar 包部署

 // 设置jar 类加载器 否则MapReduce框架找不到Map和Reucejob.setJarByClass(JobRunner.class);
  • 打包
  • 运行 hadoop jar 包的名字 主类名
[root@HadoopNode00 ~]# hadoop jar Hadoop_Test-1.0-SNAPSHOT.jar com.baizhi.mr.test01.JobRunner

(2)本地仿真

填坑


 <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>

log4j.properties

### 配置根 ###
log4j.rootLogger = info,console### 配置输出到控制台 ###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern =  %p %d{yyyy-MM-dd HH:mm:ss} %c %m%n

(3)跨平台提交

  • 需要拷贝相关配置文件到resource目录

    • core-site.xml
    • hdfs-site.xml
    • yarn-site.xml
    • mapred-site.xml

代码

      System.setProperty("HADOOP_USER_NAME", "root");conf.addResource("conf2/core-site.xml");conf.addResource("conf2/hdfs-site.xml");conf.addResource("conf2/mapred-site.xml");conf.addResource("conf2/yarn-site.xml");conf.set(MRJobConfig.JAR, "G:\\IDEA_WorkSpace\\BigData\\Hadoop_Test\\target\\Hadoop_Test-1.0-SNAPSHOT.jar");

配置跨平台提交

  • 配置mapred-site.xml
 <property><name>mapreduce.app-submission.cross-platform</name><value>true</value></property>
  • 代码的方式
  conf.set("mapreduce.app-submission.cross-platform", "true");

MapReduce入门程序相关推荐

  1. 04 分布式文件系统以及MapReduce入门程序

    文章目录 04 分布式文件系统以及MapReduce入门程序 分布式文件系统HDFS 1.分布式文件系统hdfs详细介绍 2.HDFS分布式文件系统设计目标 3.HDFS的来源 4.hdfs的架构图 ...

  2. Hadoop MapReduce入门程序wordcount代码示例及打包部署运行结果演示

  3. MapReduce入门(一)—— MapReduce概述 + WordCount案例实操

    MapReduce入门(一)-- MapReduce概述 文章目录 MapReduce入门(一)-- MapReduce概述 1.1 MapReduce 定义 1.2 MapReduce 优缺点 1. ...

  4. Mahout学习之Mahout简介、安装、配置、入门程序测试

    一.Mahout简介 查了Mahout的中文意思--驭象的人,再看看Mahout的logo,好吧,想和小黄象happy地玩耍,得顺便陪陪这位驭象人耍耍了... 附logo: (就是他,骑在象头上的那个 ...

  5. rabbitMQ入门程序

    1.生产者 /*** rabbitMQ入门程序消费者** @author xiaoss* @date 2020年10月27日 22:02*/ public class Producer01 {//队列 ...

  6. SpringMVC学习(一)———— springmvc框架原理分析和简单入门程序

    一.什么是springmvc? 我们知道三层架构的思想,并且如果你知道ssh的话,就会更加透彻的理解这个思想,struts2在web层,spring在中间控制,hibernate在dao层与数据库打交 ...

  7. java slfj教程_SLF4J入门程序

    本篇文章帮大家学习SLF4J入门程序,包含了SLF4J入门程序使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以用来参考. 在本章中,我们将学习如何编写使用SLF4J的简单基本记录器程 ...

  8. java mvc框架代码_JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码)

    原标题:JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码) JavaEE体系结构包括四层,从上到下分别是应用层.Web层.业务层.持久层.Struts和SpringMVC是Web层的 ...

  9. IDEA下——Spring入门程序

    创建一个Maven的项目,我的项目结构如下: 在pom文件里写下需要导入的依赖: <?xml version="1.0" encoding="UTF-8" ...

最新文章

  1. 成都Uber优步司机奖励政策(2月1日)
  2. 关于html和CSS的几个基本知识点
  3. 开源数据库该怎么玩?
  4. Oracle数字函数:数字四舍五入,取整以及格式化
  5. confluence 5 mysql_Centos 6.5 安装 Atlassiana Crowd+JIRA+Confluence(Wiki)之一 数据库篇(MySQL5.1)...
  6. 伪元素::before与::after的用法
  7. LiveVideoStack Meet | 苏州站全记录
  8. php mysql 导出到excel,php mysql数据导出到excel文件
  9. 为什么站点使用https加密之后还能看到相关数据
  10. 数据库关系代数表达式
  11. java毕业设计老师评语_java毕业设计_springboot框架的教师评价评教系统
  12. 我们已经开发好了Magento的Ctopay(收汇宝)非3D网关
  13. 彻底搞懂MySQL的索引
  14. excel每页都显示标题的方法
  15. 解决公司无法访问自建的网站问题
  16. 高并发 WEB 服务器 nginx 源码通读中文分析注释,带详细函数注释及函数调用注释,附 github 地址,后期持续维护更新...
  17. DAB-Deformable-DETR源码学习记录之模型构建(二)
  18. Codeforces 200A Cinema 并查集 + 思维 (看题解)
  19. FPGA零基础学习:半导体存储器和可编程逻辑器件简介
  20. 监控与性能分析系列:2)netstat、ss对比使用

热门文章

  1. quickpcb添加pcb库_quickpcb2005详细步骤教程
  2. 机器学习笔记之玻尔兹曼机(一)基本介绍
  3. 基于TM8211的DAC芯片的学习
  4. ES8156双通道数字转模拟音频DAC芯片
  5. [Windows驱动]INF文件
  6. 看雪学院-OllyDBG入门系列(三)笔记
  7. 偶然发现的关于编程的网站——简明现代魔法和看雪学院
  8. Python、R和SAS哪个适合你?
  9. Java基础代码语法讲解下
  10. spdlog日志库说明文档(超详细)