今天要讲的是MapReduce

目录

今天先总体说下MapReduce的相关知识,后续将会详细说明对应的shuffle、mr与yarn的联系、以及mr的join操作的等知识。以下内容全是个人学习后的见解,如有遗漏或不足请大家多多指教。

前言:

为什么要MAPREDUCE

(1)海量数据在单机上处理因为硬件资源限制,无法胜任

(2)而一旦将单机版程序扩展到集群来分布式运行,将极大增加程序的复杂度和开发难度

(3)引入mapreduce框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将分布式计算中的复杂性交由框架来处理。

设想一个海量数据场景下的wordcount需求:

单机版:内存受限,磁盘受限,运算能力受限分布式:

1、文件分布式存储(HDFS)

2、运算逻辑需要至少分成2个阶段(一个阶段独立并发,一个阶段汇聚)

3、运算程序如何分发

4、程序如何分配运算任务(切片)

5、两阶段的程序如何启动?如何协调?

6、整个程序运行过程中的监控?容错?重试?

可见在程序由单机版扩成分布式时,会引入大量的复杂工作。为了提高开发效率,可以将分布式程序中的公共功能封装成框架,让开发人员可以将精力集中于业务逻辑。

而mapreduce就是这样一个分布式程序的通用框架,其应对以上问题的整体结构如下:

1、MRAppMaster(mapreduce application master)

2、MapTask

3、ReduceTask

1、MapReduce原理

Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架;

Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上;

Mapreduce框架结构及核心运行机制

1.1、结构

一个完整的mapreduce程序在分布式运行时有三类实例进程 :

1、MRAppMaster:负责整个程序的过程调度及状态协调

2、mapTask:负责map阶段的整个数据处理流程

3、ReduceTask:负责reduce阶段的整个数据处理流程

1.2、mapreduce框架的设计思想

这里面有两个任务的分配过程:1、总的任务切割分配给各个mapTask,不同的mapTask再将得到的hashmap按照首字母划分,分配给各个reduceTask。

1.3、mapreduce程序运行的整体流程(wordcount运行过程的解析)

流程解析

(job.split:负责任务的切分,形成一个任务切片规划文件。

wc.jar:要运行的jar包,包含mapper、reducer、Driver等java类。

job.xml:job的其他配置信息:如指定map是哪个类,reduce是那个类,以及输入数据的路径在哪,输出数据的路径在哪等配置信息。)

前提:客户端提交任务给yarn后(提交前会进行任务的规划),yarn利用ResouceManager去找到mrAppmaster.

1、 一个mr程序启动的时候,最先启动的是MRAppMaster,MRAppMaster启动后根据本次job的描述信息,计算出需要的maptask实例数量,然后向集群申请机器启动相应数量的maptask进程

2、 maptask进程启动之后,根据给定的数据切片范围进行数据处理,主体流程为:

a) 利用客户指定的inputformat来获取RecordReader读取数据,形成输入KV对(框架干的事)

b) 将输入KV对传递给客户定义的map()方法,做逻辑运算,并将map()方法输出的KV对收集到缓存

c) 将缓存中的KV对按照K分区排序后不断溢写到磁盘文件

3、 MRAppMaster监控到所有maptask进程任务完成之后,会根据客户指定的参数启动相应数量的reducetask进程,并告知reducetask进程要处理的数据范围(数据分区)

4、 Reducetask进程启动之后,根据MRAppMaster告知的待处理数据所在位置,从若干台maptask运行所在机器上获取到若干个maptask输出结果文件,并在本地进行重新归并排序,然后按照相同key的KV为一个组,调用客户定义的reduce()方法进行逻辑运算,并收集运算输出的结果KV,然后调用客户指定的outputformat将结果数据输出到外部存储(对应的就是context.write方法)

2、mapreduce实践(WordCount实例)

编程规范:

(1)用户编写的程序分成三个部分:Mapper,Reducer,Driver(提交运行mr程序的客户端)

(2)Mapper的输入数据是KV对的形式(KV的类型可自定义)

(3)Mapper的输出数据是KV对的形式(KV的类型可自定义)

(4)Mapper中的业务逻辑写在map()方法中

(5)map()方法(maptask进程)对每一个调用一次

(6)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV

(7)Reducer的业务逻辑写在reduce()方法中

(8)Reducetask进程对每一组相同k的组调用一次reduce()方法

(9)用户自定义的Mapper和Reducer都要继承各自的父类

(10)整个程序需要一个Drvier来进行提交,提交的是一个描述了各种必要信息的job对象

WordCount程序

mapper类

package bigdata.mr.wcdemo;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;/**//map方法的生命周期: 框架每传一行数据就被调用一次 * KEYIN: 默认情况下,是mr框架所读到的一行文本的起始偏移量,Long, * 但是在hadoop中有自己的更精简的序列化接口,所以不直接用Long,而用LongWritable *  * VALUEIN:默认情况下,是mr框架所读到的一行文本的内容,String,同上,用Text *  * KEYOUT:是用户自定义逻辑处理完成之后输出数据中的key,在此处是单词,String,同上,用Text * VALUEOUT:是用户自定义逻辑处理完成之后输出数据中的value,在此处是单词次数,Integer,同上,用IntWritable */public class WordcountMapper extends Mapper{ /** * map阶段的业务逻辑就写在自定义的map()方法中 * maptask会对每一行输入数据调用一次我们自定义的map()方法 */ @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {  //将maptask传给我们的文本内容先转换成String String line = value.toString(); //根据空格将这一行切分成单词 String[] words = line.split(" ");  //将单词输出为 for(String word:words){ //将单词作为key,将次数1作为value,以便于后续的数据分发,可以根据单词分发,以便于相同单词会到相同的reduce task context.write(new Text(word), new IntWritable(1)); } }}

reducer类

package mr_test;import java.io.IOException;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Reducer;/**//生命周期:框架每传递进来一个k相同的value 组,reduce方法就被调用一次 * KEYIN, VALUEIN 对应 mapper输出的KEYOUT,VALUEOUT类型对应 * KEYOUT, VALUEOUT 是自定义reduce逻辑处理结果的输出数据类型 * KEYOUT是单词 * VLAUEOUT是总次数 */public class WordcountReducer extends Reducer {  /** *  *  *  * 入参key,是一组相同单词kv对的key */ @Override protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {  int count=0; for(IntWritable value:values){ count+=value.get();  } context.write(key, new IntWritable(count)); }}

Driver类 用来描述job并提交job

package mr_test;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;/** * 相当于一个yarn集群的客户端 * 需要在此封装我们的mr程序的相关运行参数,指定jar包 * 最后提交给yarn */public class WordcountDriver { public static void main(String[] args) throws IOException, Exception, InterruptedException { Configuration cf = new Configuration();// 把这个程序打包成一个Job来运行 Job job = Job.getInstance();  //指定本程序的jar包所在的本地路径 job.setJarByClass(WordcountDriver.class);  //指定本业务job要使用的mapper/Reducer业务类 job.setMapperClass(WorldcountMapper.class); job.setReducerClass(WordcountReducer.class);  //指定mapper输出数据的kv类型 job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class);  //指定最终输出的数据的kv类型 job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class);  //指定job的输入原始文件所在目录 FileInputFormat.setInputPaths(job, new Path(args[0]));  //指定job的输出结果所在目录 FileOutputFormat.setOutputPath(job, new Path(args[1]));  //将job中配置的相关参数,以及job所用的java类所在的jar包,提交给yarn去运行 boolean res = job.waitForCompletion(true); System.exit(res?0:1);  }}

大数据hadoop+源码精讲

最后呢,我把2019最新hadoop和源码精讲一并给我的粉丝,希望大家能够喜欢哈!

获取方式:

1.转发关注小编;

2.私信小编“学习“来拿走吧~

mapreduce编程规范_大数据之MapReduce详解相关推荐

  1. clean后class文件全部丢失_大数据专家,详解HadoopMapReduce处理海量小文件:压缩文件

    前言 在HDFS上存储文件,大量的小文件是非常消耗NameNode内存的,因为每个文件都会分配一个文件描述符,NameNode需要在启动的时候加载全部文件的描述信息,所以文件越多,对NameNode来 ...

  2. mapreduce 丢数据_大数据之MapReduce详解

    1.什么是Map/Reduce,看下面的各种解释: (1)MapReduce是hadoop的核心组件之一,hadoop要分布式包括两部分,一是分布式文件系统hdfs,一部是分布式计算框,就是mapre ...

  3. 大数据产品开发流程规范_大数据开发步骤和流程

    大数据项目开发步骤: 第一步:需求:数据的输入和数据的产出: 第二步:数据量.处理效率.可靠性.可维护性.简洁性: 第三步:数据建模: 第四步:架构设计:数据怎么进来,输出怎么展示,最最重要的是处理流 ...

  4. 大数据产品开发流程规范_大数据技术思想入门(三):分布式文件存储的流程

    如果你不喜欢阅读文字的话,可以选择滑到最后看 视频讲解 哟~~~ 进程和 RPC 在上一篇文章中,我们讲解了要解决好大数据集的存储问题,需要引入一个主从结构的集群,其中,主服务器用于存储元数据,从服务 ...

  5. 大数据产品开发流程规范_大数据开发流程规范化(最新数据流图及相关数据技术分析)...

    大数据的开发过程,如图1-1所示. 图 1-1大数据开发通用步骤图 上图只是一个简化后的步骤和流程,实际开发中,有的步骤可能不需要,有的还需要增加步骤,有的流程可能更复杂,因具体情况而定. 下面以Go ...

  6. 大数据产品开发流程规范_大数据类项目的项目管理流程是怎样的?

    1.大数据落地的难处 首先,难在大数据技术端和市场应用端的信息不对称.大数据技术端可能存储着海量的数据,可能掌握着先进的计算和分析挖掘技术,但是并不了解市场的需求痛点,或者无从发力,或者闭门造车.而市 ...

  7. 大数据学习路线详解,零基础学大数据学习路线

    在大数据蓬勃发展的现今,大家都看到了大数据未来不可限量的发展前景,跟着科技发展的潮流,不断学习新的技术知识,科多大数据相信,成为人生赢家不在话下. 大数据的三个发展方向,平台搭建/优化/运维/监控.大 ...

  8. 一文搞懂大数据开发,大数据开发体系详解

    前言 不知道大家有没有过在搜索引擎搜索过旅游的关键字,不久就可能收到机票的推销的经验.如今是大数据的时代,数据的价值越来越重要.数据即资产,想必大家都听说过.最近公司的项目中也用到了一些大数据的技术, ...

  9. 2019年大数据发展现状详解,现在学习晚不晚!

    大数据时代,大数据分析与应用大肆盛行.越来越多的大公司大企业大集团,都越来越重视大数据的影响和作用.可以说,谁想抢得大数据的一手可靠资料,谁就在未来的业务发展和拓宽中占据优势,谁就会在相关领域首先拔得 ...

最新文章

  1. 在计算机术语中 将ALU控制器和,计算机组成原理试题与答案
  2. 【Machine Learning】KNN学习算法与C语言实现
  3. python异常处理及内置模块
  4. 自定义Java annotation及解析和使用
  5. mssql 查询每个业务员_每个社区管理员应阅读的7本书
  6. Redis的几种拓展方案,你都清楚吗?
  7. ASP.NET中定制自己的委托和事件参数类
  8. ssh远程访问失败 Centos7
  9. python中的raw_input() 与 input() 比较
  10. BZOJ 1901 Zju2112 Dynamic Rankings 题解
  11. 640x360,H264 SPS头如何表示高度?
  12. 用Python全自动下载抖音视频!
  13. 如何在ps添加箭头_Photoshop怎么画箭头 三种方法教你用PS做箭头
  14. Chess.com:象棋社区网站每月访问量达 2.8 亿,年收入在 5000 万至 1 亿之间
  15. 如何用禅道写出一份让开发惊叹的测试用例?测试用例库了解一下
  16. python脱离环境运行_python 生成exe脱离python环境运行
  17. MVC3.0中直接在VS中浏览cshtml页面
  18. Power BI中带筛选条件的查询功能如何实现
  19. Spring系列(五)Spring的多线程
  20. 前端实现lottie动画

热门文章

  1. java中HashMap详解
  2. HP刀片机远程https安装RedHat 5.4
  3. EF学习杂记39:如何重置Relationships
  4. 产品规划,要考虑哪些方面?
  5. 职场社交:做职场版微信不如做职场版微博
  6. PM们,请避免对产品的过度解读!
  7. i-i.me:网址导航真的是伪需求吗?
  8. 使用Jquery插件jsonview来展示json数据
  9. 错误:Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp;的解决
  10. oracle中获取年份、月份段内的时间