`
brandNewUser
  • 浏览: 457085 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hadoop MapReduce 初步学习总结

阅读更多

 

在Hadoop中一个作业被提交后,其后具体的执行流程要经历Map任务的提交中间结果处理,Reduce任务的分配和执行直至完成这些过程,下面就是MapReduce中作业详细的执行流程图(摘自《Hadoop实战》)。

 



 

 

在整个过程中,客户端中,编写MapReduce代码,配置并提交作业;JobTracker中负责初始化作业,分配作业,与TaskTracker进行通信,协调整个作业的运行;TaskTracker要保持与JobTracker的通信,在分配的数据分片上执行Map或Reduce任务;而在整个过程中,HDFS保存作业的数据,配置信息等,以及作业的执行结果。

  

MapReduce确保每个reducer的输入都是按键排序的,系统执行排序的过程。将map输出作为输入传给reduce,这个过程称为shuffle。shuffle过程属于不断被优化和改进的部分。

 

Hadoop的版本为2.2.0,不同版本的参数名称会稍有差异。

 

Map端

 

map函数开始产生输出时并不是简单第写出到磁盘,它利用缓冲的方式写到内存,并处于效率的考虑进行预排序。

 

每个map任务都有一个环形缓冲区用于存储任务的输出,缓冲区的大小为mapreduce.task.io.sort.mb属性的值,一旦缓冲区达到阈值,就会启动一个后台线程开始将内容写到磁盘中,这部分内存是占用map端的JVM堆的。阈值是一个百分比(mapreduce.map.sort.spill.percent),表示当环形缓冲区中的数据达到这个百分比之后,就开始写磁盘了。在写磁盘的过程中,map输出继续被写到缓冲区中,但是如果写磁盘的速度非常慢,就会导致map被阻塞。

 

在写磁盘之前,线程首先根据数据最终要传送到的reducer将数据进行分区(partition),比如如果手动设置reducer的数量为64,那么spill文件中就会有64个分区,每个分区中的数据都是排序好的。

 

只要内存缓冲达到mapreduce.map.sort.spill.percent中设置的值,就会spill一个文件。这意味着在map任务执行完成后,也许有多个溢出文件,这些文件需要最终被合并成一个已分区且已排序的输出文件。这个合并过程是一个多路归并排序的过程,至于一次最多能够合并多少个文件,可以使用属性mapreduce.task.io.sort.factor配置,这个属性使用的范围比较广,以后reduce端数据的合并仍然是这个属性控制。当spill文件归并完成后,Map就会删除所有的临时spill文件,并告诉TaskTracker任务已经完成。

 

 

Reduce端

map的输出文件位于运行map任务的tasktracker上的本地磁盘(注意,非HDFS上,这部分数据也没有必要存储到HDFS上)。而对于reduce任务,需要集群上的多个map任务(我认为合理的话,应该是每个map输出)的map输出作为其特殊的分区文件。每个map任务的完成时间可能会有所不同,因此只要有一个任务完成,reduce任务就开始复制其输出。

 

map执行的每个tasktracker是负责提供map中间结果的服务器,使得reducer可以通过HTTP的方式,与map端进行通信。用于提供map端数据复制服务的工作线程数量是由mapreduce.tasktracker.http.threads来指定的,这是一个针对每个tasktracker而不是单个job的参数。

 

reduce任务的复制阶段,reduce端会有少量复制线程,能够并行获得map输出,这可以通过mapreduce.reduce.shuffle.parallelcopies参数进行设置。

 

复制过来的map数据首先会被缓存到Reduce端的内存缓冲区中,缓冲区的大小由mapreduce.reduce.shuffle.input.buffer.percent控制,这是一个百分比,指示占有reduce端JVM堆内存的百分比。随着数据的增大,同样也会进行输出磁盘的工作,后台线程会将它们合并为更大的排序后文件。

 

最后阶段,Reduce端的内存缓冲区数据将会被释放,最终合并成一个文件,但Reduce端仍然会在内存中保留部分map输出结果,保留的百分比是由属性mapreduce.reduce.input.buffer.percent,这也是一个百分比,表示占用Reduce端JVM堆内存的百分比,默认为0.0,意味着不会进行缓存。

 

进行Reduce阶段,直接将整理过后的数据输入reduce函数。

 

 

关于Combiner

当map操作输出其键值对时,都已经在内存中存在了。为了性能的考虑,有时候提供一个拥有reduce功能的Combiner是非常有效的。如果由combiner,map的键值对不会马上被写出到磁盘中,而是先被收集到list中,一个key值一个list(类似MapList的数据结构)。

 

Combiner函数可能会在map的merge操作完成之前,也可能在merge之后执行,这个时机由配置参数min.num.spill.for.combine指定(该值默认为3),也就是说在map端产生的spill文件最少有min.num.spill.for.combine的时候,Combiner函数会在merge操作合并最终的本机结果文件之前执行,否则在merge之后执行。通过这种方式,就可以在spill文件很多并且需要做conbine的时候,减少写入本地磁盘的数据量,同样也减少了对磁盘的读写频率,可以起到优化作业的目的。

 

hadoop文档中也有说明Combiner可能被执行也可能不被执行,如果当前集群在很繁忙的情况下job就是设置了也不会执行Combiner。

 

需要注意的是,虽然combiner使用合适可以提高Job执行作业的吞吐量,但不合适的应用场景可能导致输出结果不正确。Combiner的输出是Reducer的输入,绝不能改变最终的计算结果。

 

运行时参数调整

 

修改job配置

  1. 在执行hadoop jar时,可以通过-D参数的方式配置虚拟机参数,
    • mapreduce.map.java.opts指示配置map端的参数
    • mapreduce.reduce.java.opts指示配置reduce端的参数
  2. 注意:这两个参数必须要配置在Main函数的其他参数之前,并加上-D, 否则不起作用。
hadoop jar **1-SNAPSHOT.jar com.xxx.Main -Dmapreduce.map.java.opts=-Xmx2048M -Dmapreduce.reduce.java.opts=-Xmx2048M /xxx.parameter.json

 



在oozie中修改配置

在oozie中通过java action方式执行时,也可以通过-D参数的方式配置虚拟机参数

注意:通过测试发现<java-opts>参数未起作用。

 

<action name="test" retry-max="3" retry-interval="1">  
        <java>  
            <job-tracker>${jobTracker}</job-tracker>  
            <name-node>${namenode}</name-node>  
            <main-class>com.miaozhen.yo.tcpreporter.Main</main-class>  
            <java-opts>-Xmx4096M</java-opts>  
            <arg>-Dmapreduce.map.java.opts=-Xms1024M -Xmx2048M</arg>  
            <arg>-Dmapreduce.reduce.java.opts=-Xms1024M -Xmx2048M</arg>  
            <arg>${conf}</arg>  
            <arg>test</arg>  
        </java>  
        <ok to="end"/>  
        <error to="end"/>  
    </action>  

 

 

 

总体优化

对于整个过程总的原则是要给Shuffle过程尽可能多提供空间,同时需要确保map函数和reduce函数能得到足够的内存使用。map和reduce函数都需要尽量少地使用内存。

 

map和reduce任务设置的java执行参数为:mapreduce.map.java.opts和mapreduce.reduce.java.opts,可以在上面设置对应的Java堆,永久代等大小和其他Java参数。

 

在map端,应该避免多次溢出写磁盘,如果能够估算出map输出,可以合理地设置io.sort.mb的值。

 

在reduce端,中间数据全部驻留在内存中时能够获得最佳性能。默认情况下,所有内存都预留给reduce函数了(mapreduce.reduce.input.buffer.percent被设置成0.0),但如果reduce函数的内存需求不太大,就可以相应地将数据缓存。

 

  • 大小: 346.4 KB
分享到:
评论

相关推荐

    (源码)基于Hadoop MapReduce的分布式数据处理系统.zip

    # 基于Hadoop MapReduce的分布式数据处理系统 ## 项目简介 ... 数据处理MapReduce模型将数据处理任务分为Map和Reduce两个阶段,Map阶段负责数据的初步处理,Reduce阶段负责数据的汇总和最终输出。

    Hadoop MapReduce作业卡死问题的解决方法.docx

    ### Hadoop MapReduce作业卡死问题的解决方法 #### 一、问题背景 在使用Hadoop MapReduce进行大规模数据处理的过程中,遇到了一个棘手的问题——部分MapReduce作业长时间卡死,严重影响了系统的运行效率和资源利用...

    基于Hadoop MapReduce的短视频主播数据分析项目代码+数据集.rar

    总结起来,这个项目涵盖了Hadoop MapReduce的关键技术和实践应用,通过处理短视频主播的数据,可以深入了解用户行为、主播表现,为平台优化推荐算法、提升用户体验、制定营销策略等提供依据。对于学习和掌握大数据...

    006_hadoop中MapReduce详解_3

    在Hadoop生态系统中,MapReduce是一种分布式计算框架,主要用于处理和生成大数据集。"006_hadoop中MapReduce详解_3"可能是指一个系列教程的第三部分,着重讲解MapReduce的核心概念、工作原理以及实际应用。在这个...

    hadoop-mapreduce

    这个项目是一个学习Hadoop MapReduce的实践项目,利用Maven构建,无需单独安装Hadoop环境,只需在IDE中打开即可运行,方便初学者进行快速上手和实践。 MapReduce的工作原理分为两个主要阶段:Map阶段和Reduce阶段。...

    基于Hadoop MapReduce的分布式数据流聚类算法研究.pdf

    总结来说,该研究为如何在Hadoop MapReduce环境下有效进行大规模数据流聚类提供了新的方法和思路。研究不仅展示了PGDC-Stream算法在实际应用中的优势,而且对数据挖掘、聚类分析以及分布式计算领域的研究和实践者...

    基于Hadoop MapReduce的Java实现简单数据分析项目源码

    该开源项目利用Hadoop MapReduce技术,以Java为主要开发语言,融合了HTML和JavaScript,整体包含176个文件,其中Java源文件63个,XML配置文件16个,JSON文件17个,CRC文件24个,HTML文件5个,文本文件4个,属性文件3...

    Hadoop学习总结.doc

    ### Hadoop 学习总结 #### 一、HDFS简介 **1.1 数据块(Block)** HDFS(Hadoop Distributed File System)是Hadoop的核心组件之一,它主要用于存储大规模的数据集。HDFS默认的基本存储单位是64MB的数据块。与...

    Hadoop学习总结和源码分析

    本文将基于“Hadoop学习总结和源码分析”这一主题,结合提供的文档资源,深入探讨Hadoop的核心组件HDFS(Hadoop Distributed File System)和MapReduce。 首先,我们从“Hadoop学习总结之一:HDFS简介.doc”开始,...

    Hadoop技术内幕 深入解析mapreduce架构设计与实现原理

    ### Hadoop技术内幕:深入解析MapReduce架构设计与实现原理 #### 一、Hadoop概述 Hadoop是一种能够处理大规模数据集的开源软件框架。它最初由Apache开发,旨在为海量数据提供分布式存储和计算能力。Hadoop的核心...

    MapReduce 编程模型

    ### MapReduce 编程模型详解 ...尽管随着Hadoop、Spark等更先进的框架的出现,MapReduce在某些场景下可能不再是最佳选择,但它在分布式计算领域的历史地位是不可替代的,对后续的大数据处理技术产生了深远的影响。

    大数据课程设计-Hadoop-MapReduce实现sql的统计、groupby和join-全部源码

    在MapReduce中,Map阶段负责对原始数据进行切分和初步处理,如计算每个键值对的COUNT,或者计算SUM、AVG等。Reduce阶段则将Map阶段的结果进行归约,得到最终的统计结果。例如,对用户点击次数的统计,Map阶段可以...

    Hadoop学习总结之四:Map-Reduce过程解析

    ### Hadoop MapReduce任务提交与执行流程解析 #### 一、客户端提交任务 在Hadoop MapReduce框架中,客户端的任务提交是整个MapReduce作业启动的关键步骤。这一过程主要由`JobClient`类中的`runJob(JobConf job)`...

    完整版大数据云计算课程 Hadoop数据分析平台系列课程 Hadoop 04 MapReduce 共31页.pptx

    标题提及的"完整版大数据云计算课程 Hadoop数据分析平台系列课程 Hadoop 04 MapReduce"是一门专注于Hadoop生态系统中的核心组件MapReduce的教程。MapReduce是Google提出的一种分布式计算模型,广泛应用于大数据处理...

    基于hadoop的简单网络爬虫,HBase MapReduce.zip

    总结来说,这个项目涉及了从网络爬虫数据采集,到使用Hadoop MapReduce进行分布式处理,最后利用HBase进行数据存储的全过程,是学习大数据处理和分布式系统的一个典型示例。通过研究这个项目,可以深入理解如何在...

    mr.zip_hadoop

    对于学习和理解Hadoop的分布式计算能力以及如何利用它解决复杂问题来说,这些代码实例是非常有价值的资源。通过深入研究这些代码,开发者可以更好地掌握Hadoop MapReduce的编程模型,提高处理大数据问题的能力。

    Hadoop技术内幕 深入理解MapReduce架构设计与实现原理PDF

    《Hadoop技术内幕:深入理解MapReduce架构设计与实现原理》是一本专注于解析Hadoop核心组件MapReduce的专著。MapReduce是Google提出的一种分布式计算模型,被广泛应用于大数据处理领域,而Hadoop则是实现这一模型的...

    hadoop实现网站流量数据分析(MapReduce+hive)程序+说明.rar

    总的来说,这个项目为学习和实践Hadoop、MapReduce和Hive在网站流量数据分析中的应用提供了一个实际案例。通过这个项目,开发者可以了解如何在分布式环境下处理大规模的Web日志数据,从而提升数据分析效率,为网站...

    Hadoop源码分析 完整版 共55章

    - **MapReduce工作流程**:MapReduce框架主要包括Map阶段和Reduce阶段,其中Map阶段负责数据的划分和初步处理,Reduce阶段则负责汇总处理结果。 - **MapReduce优化技巧**:此外,还会涉及如何通过合理的设计和配置来...

Global site tag (gtag.js) - Google Analytics