1 MR的原理

MapeReduce(简称MR)的是大数据计算引擎,相对于Linux awk等工具而已,最大的优势是可以分布式执行,充分利用计算机的多核性能。
一个MR作业(job)是客户端需要执行的一个工作单元,包括输入数据、MR程序和配置信息。作业又可以分成若干个任务(task)来执行,包括map任务和reduce任务。原始数据被MR按照HDFS的快大小(默认128M)分片(split),每一个片是启动一个map任务,计算完的中间结果暂时存在本地。reduce拉取中间结果后进行计算输出最终结果,如下图所示:

2 切片大小原理

切片是为了使程序能够并行处理。如果切片过大,并行度低,处理速度变慢;如果切片过小,会增加管理分片得总时间和构建map任务得总时间。

对于大部分Job,一个切片大小跟HDFS的块(block)大小一样是最优的。因为数据是存储在HDFS,如果一个分片对应多个块,就可能产生网络IO,因为不同分片的数据需要传输到map所在设备。

3 动手写一个MR程序

3.1 使用maven新建一个java工程

依赖的pom.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>com.dhhy</groupId><artifactId>hadoopapp</artifactId><version>1.0-SNAPSHOT</version><properties><encoding>UTF-8</encoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>RELEASE</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.8.2</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.7.2</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.7.2</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>2.7.2</version></dependency></dependencies><build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><artifactId>maven-assembly-plugin </artifactId><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><manifest><mainClass>com.dhhy.mr.wordcount.WordcountDriver</mainClass></manifest></archive></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build><repositories><repository><id>aliyunmaven</id><url>http://maven.aliyun.com/nexus/content/groups/public/</url></repository></repositories></project>

3.2 编写mapper端得代码

package com.dhhy.mr.wordcount;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;/**
字符串统计*
map阶段入参:
Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
KEYIN mr框架读到的一行文本的起始偏移量
VALUEIN mr框架读到的一行文本的内容
KEYOUT 用户业务逻辑处理后输出的key
VALUEOUT 用户业务逻辑处理后输出的value*
Created by JayLai on 2020-02-17 22:33:42*/public class WordcountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {`Text k = new Text();IntWritable v = new IntWritable(1);@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {// 1 获取一行String line = value.toString();// 2 切割单词String[] words = line.split(" ");//3 循环写出for (String word : words) {k.set(word);context.write(k, v);}}}

3.3 编写reducer端得代码

package com.dhhy.mr.wordcount;import java.io.IOException;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;/*** Created by JayLai on 2020-02-18 18:20:07*/
public class WordcountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{IntWritable v = new IntWritable();@Overrideprotected void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {int sum = 0;// 1 累加求和for (IntWritable value : values) {sum += value.get();}v.set(sum);// 2 写出context.write(key, v);}
}

3.4 编写driver端代码

package com.dhhy.mr.wordcount;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;import java.io.IOException;/*** Created by JayLai on 2020-02-18 18:29:04*/
public class WordcountDriver {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {// 1 获取配置信息以及封装任务Configuration configuration = new Configuration();Job job = Job.getInstance(configuration);// 2 设置jar加载路径job.setJarByClass(WordcountDriver.class);// 3 设置map和reduce类job.setMapperClass(WordcountMapper.class);job.setReducerClass(WordcountReducer.class);// 4 设置map输出job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);// 5 设置最终输出kv类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);// 6 设置输入和输出路径FileInputFormat.setInputPaths(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));// 7 提交boolean result = job.waitForCompletion(true);System.exit(result ? 0 : 1);}}

3.5准备数据集

在/opt/bigdata/data/mr/hello.txt中 添加以下内容:

hello worldhello bigdata

3.6 本地调试

1)向启动程序传参

右键点击在WordcountDriver类,在program arguments填写参数:
/opt/bigdata/data/mr/hello.txt /opt/bigdata/data/mr/output

2) 运行WordcountDriver类

可以看到在输出目录output生成结果文件:

root@ubuntu18:/opt/bigdata/data/mr/output# ls
part-r-00000  _SUCCESS

用编辑器查看part-r-00000可以看到统计结果:

bigdata 1
hello   2
world   1

3.7 集群运行

1) 将数据集提交到HDFS上

hadoop fs -put hello.txt /tmp

2)将jar包提交到YARN上

使用maven编译项目,在target目录下面会生成hadoopapp-

1.0-SNAPSHOT.jarhadoop@ubuntu18:/opt/bigdata/project/mr$ hadoop jar  hadoopapp-1.0-SNAPSHOT.jar com.dhhy.mr.wordcount.WordcountDriver /tmp/hello.txt /tmp/output

3)查看运行结果

在浏览器访问http://{IP}}:8088/cluster

可以看到任务执行成功,再使用命令行查看统计结果:

hadoop@ubuntu18:/opt/bigdata/project/mr$ hadoop fs -cat /tmp/output/part-r-00000
bigdata 1
hello   2
world   1

4 参考文献

1)TomWhite,Hadoop权威指南 第4版. 2017, 清华大学出版
2)社尚硅谷频 http://www.atguigu.com/bigdata_video.shtml

《Hadoop权威指南》读书笔记——MapeReduce入门相关推荐

  1. MapReduce总结 + 相关Hadoop权威指南读书笔记(未完......欢迎补充,互相学习)

    文章目录 MapReduce概述 MapReduce优缺点 MapReduce核心思想 MapReduce进程 MapReduce编程规范 WordCount 案例实操 本地测试 集群测试 Hadoo ...

  2. mysql数据库权威指南_MySQL_MySQL权威指南读书笔记(三),第二章:MYSQL数据库里面的数 - phpStudy...

    MySQL权威指南读书笔记(三) 第二章:MYSQL数据库里面的数据 用想用好MYSQL,就必须透彻理解MYSQL是如何看待和处理数据的.本章主要讨论了两个问题:一是SQL所能处理的数据值的类型:二是 ...

  3. MongoDB权威指南读书笔记——CRUD

    插入并保存文档 插入是向MongoDB中添加数据的基本方法.可以使用Insert方法向目标集合插入一个文档:db.foo.insert({"bar" : "baz&quo ...

  4. HTTP权威指南读书笔记

    <<HTTP权威指南>>读书笔记 第一部分:Web的基础 第1章:HTTP概述 主要内容 1.什么是HTTP 2.HTTP的基本组件 HTTP HTTP:HTTP(Hypert ...

  5. HTML5权威指南----读书笔记

    <!DOCTYPE html> <html> <head><meta name = 'keywords' content="HTML5权威指南--- ...

  6. Hadoop权威指南学习笔记三

    HDFS简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考.有什么不到之处还望指出,一起学习一起进步. 转载请注明:http://blog.csdn.net/my ...

  7. Hadoop权威指南学习笔记一

    Hadoop简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考,有什么不到之处还望指出.一起学习一起进步. 转载请注明:http://blog.csdn.net/ ...

  8. 计算机网络和http权威指南 读书笔记

    计算机网络笔记 网络层 网络层向上提供无连接的,尽最大努力交付的数据报服务 网络层不提供数据质量承诺 物理层使用的中间设备叫转发器repeater 数据链路层叫网桥bridge 网络层叫路由器rout ...

  9. Hadoop权威指南阅读笔记

    2019独角兽企业重金招聘Python工程师标准>>> 1.MR和关系型数据 MR和传统的关系型数据库处理的数据是不同,传统关系型数据库处理的是较结构化数据,对于半结构化和非机构话数 ...

最新文章

  1. 有符号整型的数据范围为什么负数比正数多一个?
  2. SpringCloud 介绍
  3. 【风控体系】携程基于大数据分析的实时风控体系
  4. 天天生鲜的用户登录机制和redis的作用
  5. MAC--PPTP教程
  6. Sublime Text 2删除行尾空格
  7. 实体首部字段-四大首部字段之一
  8. 软件测试---------兼容性 / 安装卸载 / 易用性测试点(超详细)
  9. mysql 主从ppt_MYSQL主从复制和读写分离.ppt
  10. 小程序drawImage接口canvas生成产品海报失败
  11. [STL]priority_queue多种方式自定义排序
  12. 读《断舍离》山下英子
  13. 【Python】大数据挖掘课程作业3——使用朴素贝叶斯分类对B站评论进行分析
  14. QT 扁平化界面风格,自定义TabWidget控件
  15. 【Java实现学生管理系统】
  16. Server returns invalid timezone. Go to ‘Advanced‘ tab and set ‘serverTimezon‘
  17. 【牛客网-前端笔试题】——Javascript专项练习
  18. C# MVC 设置起始页
  19. win7记事本如何转换html,WIN7文件隐藏了怎么显示出来?
  20. Latex在表格中添加图片

热门文章

  1. 计算机技术专业学位硕士研究生胜任力模型
  2. 年薪百万的好苗头!不俗套的情人节,爱之丘比特走心了
  3. 不想写日报、周报,这个报表自动化软件太牛了,仅需三分钟
  4. R语言:作业六(逆变换法生成随机变量;线性同余发生器LCG的编写)
  5. HSSFWorkbook下载xls表格模板及导入excel数据
  6. L2-4 哲哲打游戏 (25 分)_模拟
  7. RK3326[Android 8.1],获取BT、WIFI地址
  8. 一键安装JDK和JRE并自动配置Java环境变量
  9. 顶级免费空间hostinger搭建个人网…
  10. AutoRunner 功能自动化测试项目实训之权重的修改(十五)