`

Mapper和Reducer的分析

阅读更多
1.reduce和map类似,每个task内部可以共享静态类属性,每个task可能会多次调用reduce()函数,但每个key只对应某节点上的某个task的reduce()函数的一次执行

2.多个tasks之间不能共享静态类属性,即使在同一台机器上,因为是以进程方式运行

3.一个key不可能被两个tasks拆分执行,不管是否在相同的节点上。

4. Hadoop Map/Reduce框架为每一个InputSplit产生一个map任务,而每个InputSplit是由该作业的InputFormat产生的。

5. Map的数目通常是由输入数据的大小决定的,一般就是所有输入文件的总块(block)数。如果你输入10TB的数据,每个块(block)的大小是 128MB,你将需要大约82,000个map来完成任务,除非使用 setNumMapTasks(int)(注意:这里仅仅是对框架进行了一个提示(hint),实际决定因素见4)将这个数值设置得更高。

6. Reducer有3个主要阶段:shuffle、sort和reduce。
Shuffle
Reducer的输入就是Mapper已经排好序的输出。在这个阶段,框架通过HTTP为每个Reducer获得所有Mapper输出中与之相关的分块。
Sort
这个阶段,框架将按照key的值对Reducer的输入进行分组 (因为不同mapper的输出中可能会有相同的key)。
Shuffle和Sort两个阶段是同时进行的;map的输出也是一边被取回一边被合并的。

7.如果需要中间过程对key的分组规则和reduce前对key的分组规则不同,那么可以通过 JobConf.setOutputValueGroupingComparator(Class)来指定一个Comparator。再加上 JobConf.setOutputKeyComparatorClass(Class)可用于控制中间过程的key如何被分组,所以结合两者可以实现按值的二次排序。

8.Reducer的输出是没有排序的。

9.Reduce的数目建议是0.95或1.75乘以 ( * mapred.tasktracker.reduce.tasks.maximum)。用0.95,所有reduce可以在maps一完成时就立刻启动,开始传输map的输出结果。用1.75,速度快的节点可以在完成第一轮reduce任务后,可以开始第二轮,这样可以得到比较好的负载均衡的效果。上述比例因子比整体数目稍小一些是为了给框架中的推测性任务(speculative-tasks) 或失败的任务预留一些reduce的资源。

10.Partitioner
Partitioner用于划分键值空间(key space)。
Partitioner负责控制map输出结果key的分割。Key(或者一个key子集)被用于产生分区,通常使用的是Hash函数。分区的数目与一个作业的reduce任务的数目是一样的。因此,它控制将中间过程的key(也就是这条记录)应该发送给m个reduce任务中的哪一个来进行reduce 操作。

11.Mapper和Reducer的实现可以利用Reporter 来报告进度,或者仅是表明自己运行正常。在那种应用程序需要花很长时间处理个别键值对的场景中,这种机制是很关键的,因为框架可能会以为这个任务超时了,从而将它强行杀死。另一个避免这种情况发生的方式是,将配置参数mapred.task.timeout设置为一个足够高的值(或者干脆设置为零,则没有超时限制了)。

12.一些作业的参数可以被直截了当地进行设置(例如: setNumReduceTasks(int)),而另一些参数则与框架或者作业的其他参数之间微妙地相互影响,并且设置起来比较复杂(例如: setNumMapTasks(int))

13.InputFormat 为Map/Reduce作业描述输入的细节规范。
Map/Reduce框架根据作业的InputFormat来:
1. 检查作业输入的有效性。
2. 把输入文件切分成多个逻辑InputSplit实例, 并把每一实例分别分发给一个 Mapper。
3. 提供RecordReader的实现,这个RecordReader从逻辑InputSplit中获得输入记录, 这些记录将由Mapper处理。

14.任务的Side-Effect File
在一些应用程序中,子任务需要产生一些side-file,这些文件与作业实际输出结果的文件不同。

在这种情况下,同一个Mapper或者Reducer的两个实例(比如预防性任务)同时打开或者写 FileSystem上的同一文件就会产生冲突。因此应用程序在写文件的时候需要为每次任务尝试(不仅仅是每次任务,每个任务可以尝试执行很多次)选取一个独一无二的文件名(使用attemptid,例如task_200709221812_0001_m_000000_0)。

为了避免冲突,Map/Reduce框架为每次尝试执行任务都建立和维护一个特殊的 ${mapred.output.dir}/_temporary/_${taskid}子目录,这个目录位于本次尝试执行任务输出结果所在的 FileSystem上,可以通过 ${mapred.work.output.dir}来访问这个子目录。对于成功完成的任务尝试,只有${mapred.output.dir}/_temporary/_${taskid}下的文件会移动到${mapred.output.dir}。当然,框架会丢弃那些失败的任务尝试的子目录。这种处理过程对于应用程序来说是完全透明的。

在任务执行期间,应用程序在写文件时可以利用这个特性,比如 通过 FileOutputFormat.getWorkOutputPath()获得${mapred.work.output.dir}目录,并在其下创建任意任务执行时所需的side-file,框架在任务尝试成功时会马上移动这些文件,因此不需要在程序内为每次任务尝试选取一个独一无二的名字。

注意:在每次任务尝试执行期间,${mapred.work.output.dir} 的值实际上是 ${mapred.output.dir}/_temporary/_{$taskid},这个值是Map/Reduce框架创建的。所以使用这个特性的方法是,在 FileOutputFormat.getWorkOutputPath() 路径下创建side-file即可。

15.IsolationRunner

IsolationRunner 是帮助调试Map/Reduce程序的工具。

使用IsolationRunner的方法是,首先设置 keep.failed.tasks.files属性为true (同时参考keep.tasks.files.pattern)。

然后,登录到任务运行失败的节点上,进入 TaskTracker的本地路径运行 IsolationRunner:
$ cd /taskTracker/${taskid}/work
$ bin/hadoop org.apache.hadoop.mapred.IsolationRunner ../job.xml

IsolationRunner会把失败的任务放在单独的一个能够调试的jvm上运行,并且采用和之前完全一样的输入数据。
分享到:
评论

相关推荐

    Mapper类和Reducer类代码编写所需的全部基本jar包

    在Hadoop项目开发中,Mapper类和Reducer类是核心组件,负责处理分布式计算的数据流。为了正确地编译和运行这些类,我们需要依赖一系列的jar包。这些jar包提供了Hadoop框架所需的基本功能,以及与网络通信、计算、...

    mapper-reduce

    `Mapper`和`Reducer`是MapReduce模型中的两个关键组件,它们协同工作,对海量数据进行高效处理。 `Mapper`阶段是MapReduce流程的第一步,它的主要任务是对输入数据进行预处理,将原始数据转化为键值对(key-value ...

    Hive 用户指南 v1.0

    Hive 是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以...同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。

    Hive用户指南v1.0中文最新版本

    Hive 是建立在 Hadoop 上的数据仓库基础构架。...同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。感兴趣的朋友可以过来看看

    Hive编程指南

    学习hive,做大数据分析。Hive是建立在 Hadoop 上的数据仓库基础构架。...同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。

    page_rank:使用Mapper-Reducer实现PageRank算法

    使用Mapper-Reducer实现PageRank算法 如何运行: hdfs dfs -rm -r / transition#删除HDFS中的/ transition目录,如果该目录不存在,则忽略错误信息。 hdfs dfs -mkdir / transition#在HDFS中创建/ transition...

    利用Spring搭建基于Hadoop的大数据分析.zip

    7. **数据处理和分析**:在MapReduce任务中,你需要编写Mapper和Reducer逻辑,处理Hadoop的数据。这可能涉及到数据清洗、转换、聚合等操作。 8. **结果处理和持久化**:处理完大数据后,Spring可以帮助你将结果存储...

    基于Hadoop的上海餐饮性价比分析系统.zip

    通过Mapper和Reducer类,实现数据的映射和聚合操作。 3. 配置与执行 通过Java程序配置Hadoop作业,包括设置输入输出路径、Mapper和Reducer类、输入输出键值对的类型等。 提交作业到Hadoop集群执行,并根据作业...

    Hive基本概念及常用操作.rar

    Hive 是建立在 Hadoop 上的数据仓库基础构架。...mapper 和 reducer 无法完成的复杂的分析工作。 Hive概念及常用操作文件包含Hive的基本概念与架构,以及在平常的工作中常用的一些操作,包括HQL的开发运行,以及优化。

    Iris-Flower-Dataset-Analysis:在Java中配置了MapR Hadoop分布集群和编程的Mapper,Reducer和Driver类,以从Iris花数据集中提取见解

    在这个项目中,我们主要关注的是如何使用Java编程语言在MapR Hadoop分布式集群上处理鸢尾花(Iris)数据集...对于数据科学家和机器学习工程师来说,这是一个很好的实践案例,展示了如何在分布式环境中分析和挖掘数据。

    基于hadoop对某网站日志分析部署实践课程设计报告参考模板.doc

    - 运行MapReduce任务:使用hadoop-streaming工具,结合mapper和reducer程序,执行MapReduce作业,处理HDFS上的日志文件。 4. Hive和MySQL的使用: - Hive提供了一个基于Hadoop的数据仓库工具,可以将结构化的数据...

    基于MapReduce的Apriori算法代码

    3. Mapper和Reducer:Mapper和Reducer是MapReduce框架中的两个主要组件,Mapper负责将输入数据集映射成键值对,Reducer负责聚合Mapper输出的键值对。 4. 并行计算:该代码使用MapReduce框架来实现Apriori算法的并行...

    Hadoop Streaming程序实例

    Hadoop Streaming是一个强大的工具,它允许用户使用任何可执行文件(如Python脚本、Perl或Bash shell命令)作为MapReduce任务的Mapper和Reducer。这个技术使得非Java开发者也能利用Hadoop的大数据处理能力。在本文中...

    2.x MapReduce的测试类

    3. WrappedMapper和WrappedReducer:这两个类是MapReduce测试框架的一部分,用于包装自定义的Mapper和Reducer。它们提供了一种监控和调试方式,可以在Mapper和Reducer执行时捕获日志信息,帮助定位潜在问题。 测试...

    Hadoop Streaming 编程

    - **Mapper 和 Reducer 的交互方式**:Mapper 和 Reducer 会从标准输入中读取用户数据,逐行处理后通过标准输出发送数据。Streaming 工具创建 MapReduce 作业,发送给各个 TaskTracker,并监控整个作业的执行过程。 ...

    apache-hive-2.3.5-bin.tar.gz

    同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。 Hive 没有专门的数据格式。 Hive 可以很好的工作在 Thrift 之上,控制...

    hadoop源码分析-mapreduce部分.doc

    Writeable、Counter和ID相关类处理计数和标识,Context类提供Mapper和Reducer所需的上下文信息,Mapper、Reducer和Job类定义了MapReduce的基本操作。此外,还有一些辅助类协同Mapper和Reducer完成任务,如...

    Mapper_mapper_

    mapper.py"""import sys# input comes from STDIN (standard input)for line in sys.stdin: # remove leading and trailing whitespace line = line.strip() # split the line into words words = ...

    Big-Data-Management-using-Hadoop:这个项目是创建一个管理大天气数据的 HADOOP java 程序。 给出一个大天气数据集 (CSV) 作为输入,Mapper 和 Reducer 类管理数据集并按不同类别(例如每月、季节性和每年)输出天气。 这个项目是在 Hadoop Java (Linux) 中完成的

    大数据管理使用Hadoop 这个项目是创建一个... 给出一个大天气数据集 (CSV) 作为输入,Mapper 和 Reducer 类管理数据集并按不同类别(例如每月、季节性和每年)输出天气。 该项目是在 Hadoop Java (Linux) 中完成的。

    apache-mrunit-1.1.0-hadoop2-bin.tar

    1. **模拟Mapper和Reducer**:MRUnit提供了API,使得开发人员能够创建模拟输入数据并直接测试Mapper和Reducer的行为。这些API允许开发者控制输入键值对,检查输出结果,从而确保Mapper和Reducer的正确实现。 2. **...

Global site tag (gtag.js) - Google Analytics