《Hadoop权威指南》读书笔记——MapeReduce入门
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入门相关推荐
- MapReduce总结 + 相关Hadoop权威指南读书笔记(未完......欢迎补充,互相学习)
文章目录 MapReduce概述 MapReduce优缺点 MapReduce核心思想 MapReduce进程 MapReduce编程规范 WordCount 案例实操 本地测试 集群测试 Hadoo ...
- mysql数据库权威指南_MySQL_MySQL权威指南读书笔记(三),第二章:MYSQL数据库里面的数 - phpStudy...
MySQL权威指南读书笔记(三) 第二章:MYSQL数据库里面的数据 用想用好MYSQL,就必须透彻理解MYSQL是如何看待和处理数据的.本章主要讨论了两个问题:一是SQL所能处理的数据值的类型:二是 ...
- MongoDB权威指南读书笔记——CRUD
插入并保存文档 插入是向MongoDB中添加数据的基本方法.可以使用Insert方法向目标集合插入一个文档:db.foo.insert({"bar" : "baz&quo ...
- HTTP权威指南读书笔记
<<HTTP权威指南>>读书笔记 第一部分:Web的基础 第1章:HTTP概述 主要内容 1.什么是HTTP 2.HTTP的基本组件 HTTP HTTP:HTTP(Hypert ...
- HTML5权威指南----读书笔记
<!DOCTYPE html> <html> <head><meta name = 'keywords' content="HTML5权威指南--- ...
- Hadoop权威指南学习笔记三
HDFS简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考.有什么不到之处还望指出,一起学习一起进步. 转载请注明:http://blog.csdn.net/my ...
- Hadoop权威指南学习笔记一
Hadoop简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考,有什么不到之处还望指出.一起学习一起进步. 转载请注明:http://blog.csdn.net/ ...
- 计算机网络和http权威指南 读书笔记
计算机网络笔记 网络层 网络层向上提供无连接的,尽最大努力交付的数据报服务 网络层不提供数据质量承诺 物理层使用的中间设备叫转发器repeater 数据链路层叫网桥bridge 网络层叫路由器rout ...
- Hadoop权威指南阅读笔记
2019独角兽企业重金招聘Python工程师标准>>> 1.MR和关系型数据 MR和传统的关系型数据库处理的数据是不同,传统关系型数据库处理的是较结构化数据,对于半结构化和非机构话数 ...
最新文章
- 有符号整型的数据范围为什么负数比正数多一个?
- SpringCloud 介绍
- 【风控体系】携程基于大数据分析的实时风控体系
- 天天生鲜的用户登录机制和redis的作用
- MAC--PPTP教程
- Sublime Text 2删除行尾空格
- 实体首部字段-四大首部字段之一
- 软件测试---------兼容性 / 安装卸载 / 易用性测试点(超详细)
- mysql 主从ppt_MYSQL主从复制和读写分离.ppt
- 小程序drawImage接口canvas生成产品海报失败
- [STL]priority_queue多种方式自定义排序
- 读《断舍离》山下英子
- 【Python】大数据挖掘课程作业3——使用朴素贝叶斯分类对B站评论进行分析
- QT 扁平化界面风格,自定义TabWidget控件
- 【Java实现学生管理系统】
- Server returns invalid timezone. Go to ‘Advanced‘ tab and set ‘serverTimezon‘
- 【牛客网-前端笔试题】——Javascript专项练习
- C# MVC 设置起始页
- win7记事本如何转换html,WIN7文件隐藏了怎么显示出来?
- Latex在表格中添加图片
热门文章
- 计算机技术专业学位硕士研究生胜任力模型
- 年薪百万的好苗头!不俗套的情人节,爱之丘比特走心了
- 不想写日报、周报,这个报表自动化软件太牛了,仅需三分钟
- R语言:作业六(逆变换法生成随机变量;线性同余发生器LCG的编写)
- HSSFWorkbook下载xls表格模板及导入excel数据
- L2-4 哲哲打游戏 (25 分)_模拟
- RK3326[Android 8.1],获取BT、WIFI地址
- 一键安装JDK和JRE并自动配置Java环境变量
- 顶级免费空间hostinger搭建个人网…
- AutoRunner 功能自动化测试项目实训之权重的修改(十五)