概述
5.1 MapReduce概述
5.1.1 MapReduce的来源
MapReduce(最早由谷歌提出)是面向大数据并行处理的计算模型、框架和平台,它隐含了以下三层含义:
1. MapReduce是一个并行程序的计算模型与方法。
2. MapReduce是一个并行计算与运行的软件框架。
3. MapReduce是一个基于集群的高性能并行计算平台。
5.1.2 MapReduce设计思想
1. 分而治之
MapReduce 采用“分而治之”的设计思想,即采用一定的数据划分方法将大规模数据集切分成许多独立的分片,然后将这些分片交由多个节点去并行处理,最后汇总处理结果。
2. 抽象成模型
MapReduce 借鉴了函数式编程的设计思想以及矢量编程语言的特性,将数据处理过程高度抽象为Map 函数和Reduce 函数。
3. 上升到架构
MapReduce 以统一计算架构为程序员隐藏系统底层细节。使用MapReduce 时,程序员只需要集中于应用问题和算法本身,不需要关注其他系统层的处理细节,这大大减轻了程序员开发程序的负担。
5.1.3 MapReduce的优缺点
1. MapReduce的优点:
l 易于编程
l 良好的扩展性:当计算机资源不能得到满足的时候,可以通过简单地增加机器来扩展它的计算能力。
l 高容错性:MapReduce集群中有一台机器宕机了,它可以把上面的计算任务转移到集群的另一台机器上运行,不至于让这个任务运行失败。
2. MapReduce的缺点
l 不适合实时计算:MapReduce的启动时间长,且涉及多次磁盘读写和网格传输,因此它不适合数据的实时在线处理。
l 不适合流式计算:流式计算的输入数据是动态的,而MapReduce自身的设计特点决定了其输入数据集必须是静态的。
l 不适合DAG(有向无环图)计算:MapReduce 作业的输出结果都必须写入磁盘,DAG中的依赖关系会造成大量的磁盘I/O 消耗,从而大大降低整体性能。
5.1.4 MapReduce模型介绍
5.2 MapReduce工作流程
5.2.1 MapReduce基本架构
????分片与数据块
对于HDFS而言,其存储数据的基本单位是数据块(Block),而对于MapReduce而言,其处理数据的基本单位是分片(Split)。
分片是一个逻辑概念,分片信息包括起始偏移量、分片大小、分片数据所在的数据块信息、数据块所在的主机列表等元数据。它的划分方法完全由用户自己决定。大多数情况下,理想的分片大小是一个数据块。分片的多少决定了Map任务的数目,因为每个分片包含的数据只会交给一个Map任务处理。
????基本结构
MapReduce采用主从架构(Master/Slave),主要包含四个组成部分,分别为客户端(Client)、作业管理器(JobTracker)、任务管理器(TaskTracker)和任务(Task)。
????客户端(client)
• 客户端将用户编写的MapReduce程序即作业提交到作业管理器,
• 用户也可以通过客户端提供的一些接口去实时查看作业的运行状态。
????作业管理器(JobTracker)
• 负责资源监控和作业调度,
• 负责监控所有任务管理器与作业的健康状况,一旦发现失败,就将相应的任务转移到其节点。
• 跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器。而调度器会在资源出现空闲时,选择合适的任务去使用这些资源
????任务管理器(TaskTracker)
• 周期性地通过心跳信号将本节点上的资源使用情况和任务的运行进度汇报给作业管理器
• 接收作业管理器发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)。
????任务(Task)
任务分为Map任务和Reduce任务两种,均由任务管理器启动。
5.2.2 MapReduce运行机制
①在客户端启动一个作业。
②向作业管理器请求一个作业ID(Job ID)。
③将运行作业所需要的资源文件复制到HDFS上,包括MapReduce程序打包的JAR文件、配置文件和客户端计算所得的输入分片信息。
④作业管理器接收到作业后,将其放在一个作业队列里,等待工作在作业管理器上的任务调度器对其进行调度。
⑤任务管理器每隔一段时间会给作业管理器发送一个心跳,告诉作业管理器它依然在运行。当作业管理器收到作业的最后一个任务完成信息时,便把该作业设置成“成功”。当客户端查询状态时,它将得知任务已完成,便显示一条消息给用户。
5.2.3 MapReduce内部逻辑
MapReduce工作原理流程图中,一个应用程序被划分成Map和Reduce两个计算阶段,它们分别由一个或者多个Map任务和Reduce任务组成。其中,每个Map任务处理输入数据集合中的一个分片,并将产生的若干个数据片段写到本地磁盘上,而Reduce任务则从每个Map任务所在节点上远程复制(pull)相应的数据片段,经分组聚集和归并后,将计算结果写到HDFS上作为最终结果。
Map端的Shuffle过程:
1. 输入数据
• 一个Map任务处理一个分片,每个输入分片会让一个Map 任务来处理
• Map输出的结果会暂时放在一个默认大小为100 M的环形内存缓冲区中。
• 当达到缓冲区大小的80%时,进行溢写,会在本地文件系统中创建一个溢出文件,将该缓冲区中的数据写入这个文件。
2. 溢写(分区、排序、合并)
• 根据Reduce 任务的数目将数据划分为相同数目的分区,一个Reduce任务对应一个分区的数据
• 对每个分区中的数据进行排序
• 如果此时设置了Combiner 函数定义的合并操作,则会将排序后的结果进行合并(合并不能改变最终结果,只是减少的数据写入磁盘)
3. 归并
• 当Map任务输出最后一个记录时,可能会有很多的溢出文件,这时需要将这些文件归并(Merge)。
• 归并的过程中会不断地进行排序和合并操作,最后归并成了一个已分区且已排序的文件。
4. 结束
• 作业管理器一直监测Map任务的执行,当Map任务执行完成之后就会通知Reduce任务来领取数据。
Reduce端的Shuffle过程:
1. Reduce任务向作业管理器询问Map任务是否已经完成。
• 若完成,则接收不同Map任务传来的数据。
• 如果Reduce任务接收的数据量相当小,则直接存储在缓存中,
• 如果数据量超过了该缓冲区大小的一定比例,则对数据合并后溢写到磁盘中。
2. 随着溢写文件的增多,后台线程会将它们归并成一个大文件。
• 归并的时候还会对键值对进行排序。
3. 磁盘中经过多轮归并后得到若干大文件,直接输入给Reduce任务。
• 这些大文件不会继续归并,而是直接输入给Reduce 任务,这样可以减少磁盘的读写开销。至此,整个Shuffle 过程结束。
5.3 MapReduce实例分析
5.3.1 WordCount设计思路
编程案例
//•Map输入类型为<key,value> //•期望的Map输出类型为<单词,出现次数> //•Map输入类型最终确定为<Object,Text> //•Map输出类型最终确定为<Text,IntWritable> public static class MyMapper extends Mapper<Object,Text,Text,IntWritable>{ private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(Object key, Text value, Context context) throws IOException,InterruptedException{ StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word,one); } } }
public static class MyReducer extends Reducer<Text,IntWritable,Text,IntWritable>{ private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException,InterruptedException{ int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key,result); } }
public static void main(String[]args)throws Exception{ Configuration conf=new Configuration(); //程序运行时参数 String[]otherArgs=new GenericOptionsParser(conf,args).getRemainingArgs(); if(otherArgs.length!=2){ System.err.println("Usage: wordcount <in> <out>"); System.exit(2); } Job job=new Job(conf,"word count"); //设置环境参数 job.setJarByClass(WordCount.class); //设置整个程序的类名 job.setMapperClass(MyMapper.class); //添加MyMapper类 job.setReducerClass(MyReducer.class); //添加MyReducer类 job.setOutputKeyClass(Text.class); //设置输出类型 job.setOutputValueClass(IntWritable.class); //设置输出类型 FileInputFormat.addInputPath(job,new Path(otherArgs[0])); //设置输入文件 FileOutputFormat.setOutputPath(job,new Path(otherArgs[1])); //设置输出文件 System.exit(job.waitForCompletion(true)?0:1); }
5.4 Spark概述
5.4.1 Spark简介
????Spark最初由美国加州伯克利大学(UCBerkeley)的AMP实验室于2009年开发,是基于内存计算的大数据并行计算框架,可用于构建大型的、低延迟的数据分析应用程序。
特点:
高效性:Spark采用内存存储中间计算结果,这减少了迭代运算的磁盘I/O开销。此外,Spark通过并行计算DAG图的优化,减少了不同任务之间的依赖,降低了延迟等待时间。
易用性:支持使用Scala、Java、Python和R语言进行编程,可以通过Spark Shell进行交互式编程。
通用性:Spark提供了完整而强大的技术栈,包括SQL查询、流式计算、机器学习和图算法
组件。
兼容性:可运行于独立的集群模式中,可运行于Hadoop中,也可运行于Amazon EC2等云环境中,并且可以访问HDFS、Cassandra、HBase、Hive等多种数据源
5.4.2 Spark生态圈
5.5 Spark工作流程
5.5.1 基本概念
5.5.2 架构设计
5.5.3 运行流程
(1)首先为应用构建起基本的运行环境,即由控制节点(Driver)创建一个SparkContext,进行资源的申请、任务的分配和监控。
(2)集群资源管理器为Executor分配资源,并启动Executor进程。
(3)SparkContext根据RDD的依赖关系构建DAG图,DAG图提交给DAG调度器解析成阶段
(Stage),然后把一个个任务集(TaskSet)提交给底层任务调度器处理;Executor向SparkContext申请任务,任务调度器将任务发放给Executor运行,并提供应用程序代码。
(4)任务在Executor上运行,把执行结果反馈给任务调度器,然后反馈给DAG调度器,运行完毕后写入数据并释放所有资源。
5.5.4 RDD算子
Spark的核心是建立在统一的抽象RDD之上,基于RDD的转换和行动操作使得Spark的各个组件可以无缝进行集成,从而在同一个应用程序中完成大数据计算任务。
RDD是Spark提供的核心抽象, Spark将常用的大数据操作都转化成为RDD的子类(RDD是一个抽象类,具体由各子类实现,如MappedRDD、ShuffledRDD等子类)。可以将RDD的名称拆分成三个方面来理解。
最后
以上就是优美大碗为你收集整理的大数据计算(hdu)第五章笔记5.1 MapReduce概述5.2 MapReduce工作流程5.3 MapReduce实例分析 5.4 Spark概述 5.5 Spark工作流程的全部内容,希望文章能够帮你解决大数据计算(hdu)第五章笔记5.1 MapReduce概述5.2 MapReduce工作流程5.3 MapReduce实例分析 5.4 Spark概述 5.5 Spark工作流程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复