MapReduce -- task 的执行

本文探讨了Hadoop MapReduce框架中对任务执行的高级控制方法,包括如何利用推测执行减少慢速任务的影响,以及OutputCommitter在确保作业正确提交方面的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面来看下,MapReduce用户对task执行的更多控制

The Task Execution Environment

Hadoop为map task和reduce task提供了运行环境信息。例如,一个map task 可以知道它正在处理的文件的名称,和一个map或reduce task可以找出已经尝试的次数、下表中的属性都可以在job的配置信息中访问到,在老的MapReduce API中可以通过Mapper或reducer的configuer()方法获得这些信息,其中配置作为参数传入。在新的API中,这些属性可以通过context对象获得,该对象被传入到Mapper和Reducer的方法中。


Speculative Execution(推测执行)

MapReduce 模型将job分割成若干task,然后并行运行的这些task的,这使得job的整体执行时间要少于顺序执行这些task的时间。那么执行缓慢的task,将影响job的执行时间,当一个job有上百或上千个task时,有几个“拖后腿”task是很常见的。

Task缓慢有多种原因,包括硬件故障、软件配置错误,但是缓慢的原因又很难检测出来,因为job已成功完成,尽管完成时间比预期的要长。Hadoop不会试着去分析和修复运行缓慢的task,而是自动推测,试着启动另外一个等效的task。这就是所谓的task“推测执行”。

speculative execution并不是在大约同一时间同时运行两个task,而是,调度器跟踪所有task的进度,推测执行只对明显低于平均速率的task(一般占较小比例),才启动一个副本task,当一个task成功完成,那么其所有正在运行的副本task将被杀死,因为不在需要了。如果原task在speculative task之前完成,那么speculative task将被杀死;如果speculative task 先完成,那么原task将被杀死。

Speculative Execution仅是一个优化措施,并不能使job的运行更可靠。如果存在bug,可能会引起task的挂起或运行缓慢。

Speculative Execution默认是启用的,也可以单独的为map或reduce task、job、集群范围启用或停用。相关属性见下表:


Speculative Execution的目的就是减少job的执行时间的,但这是以牺牲集群效率为代价的。对于一个比较繁忙的集群,speculative execution 会降低整体的吞吐量,因为冗余的task正在执行。处于这个原因,一些集群管理员通常会关闭speculative execution,但用户可以为个别的job开启speculative  execution。Hadoop老版本更是如此,因为它在调度speculative task时会过度使用speculative execution。

一个关闭speculative execution例子就是reduce task,因为任何speculative task会使用和原reduce task同样的map 输出,这就明显增加了集群的网络传输。

Output Committers

MapReduce使用一个commit协议,来确保job和task的要么完全成功,要么完全失败。该行为是由OutputCommitter实现,在旧的MapReduce API中,是通过掉JobConf的setOutputCommitter()方法或通过setting mapred.output.committer.class属性来设置。在新的MapReduce API中,OutputCommiter是由OutputFormat的getOutputCommitter()方法确定的,默认为FileOutputCommitter,这是基于文件处理的MapReduce。另外,如果有特殊需求,也可以为job或task自定义一个OutputCommitter或写一个新的实现。

OutputCommitter的API如下:

public abstract class OutputCommitter {
  public abstract void setupJob(JobContext jobContext) throws IOException;
  public void commitJob(JobContext jobContext) throws IOException { }
  public void abortJob(JobContext jobContext, JobStatus.State state) throws IOException { }
  public abstract void setupTask(TaskAttemptContext taskContext) throws IOException;
  public abstract boolean needsTaskCommit(TaskAttemptContext taskContext) throws IOException;
  public abstract void commitTask(TaskAttemptContext taskContext) throws IOException;
  public abstract void abortTask(TaskAttemptContext taskContext) throws IOException;
}
setupJob()方法在job运行之前调用,主要做一些初始化操作。对于FileOutputCommitter,该方法会为map输出创建最终的输出目录${mapreduce.output.fileoutputformat.outputdir},和临时工作空间_temporary作为其下的子目录。

如果job成功,就会调用commitJob()方法,它将会删除临时工作空间,并创建一个隐藏的空的标记文件_SUCCESS,表示job成功完成。如果job没有成功,将会调用abortJob()方法,它带有一个state对象表示job是失败或被杀死(例如用户),默认它也会删除临时工作空间。

setupTask()方法是针对对Task的,它在task运行前调用,默认不做任何事情,因为在写task输出时已经为task的输出创建了临时目录。

task的commit阶段是可选,也可以通过needsTaskCommit().方法返回false来禁用,这将会使框架不必运行分布式提交协议,并且也不会调用commitTask() 、 abortTask()方法。当task没有输出可写时,FileOutputCommitter将跳过commit阶段。

如果task成功,将会调用commitTask()方法,它会将临时输出目录(为避免冲突,不同的task尝试以尝试ID作为目录名)移动到最终的输出路径${mapreduce.output.fileoutputformat.outputdir}。否则,将调用abortTask()方法,它将删除临时输出目录。

MapReduce框架对于一个特定的task,如果多个任务尝试的实例,可以确保仅有一个可以提交,其它的将被放弃。出现这种情况是因为某些原因第一次尝试失败,它将被放弃,之后的尝试成功的将被提交。也可能会发生两个尝试task同时在运行,这种情况,先执行完成的先提交,另一个将被放弃。



<think>好的,我现在需要回答用户关于Hadoop 3.3.0中MapReduce示例程序计算圆周率时的输出结果解释的问题。首先,我得回忆一下Hadoop自带的示例程序,特别是计算π的那个。用户想知道输出的具体含义,所以我要详细分析每个部分。 首先,用户提到的是使用hadoop-mapreduce-examples.jar中的pi命令。通常,运行这个命令的格式是`hadoop jar hadoop-mapreduce-examples.jar pi <numMaps> <numSamples>`。这里,numMaps是指定的任务数,numSamples是总样本数。程序会通过蒙特卡洛方法来估算π的值。 接下来,我需要回想输出结果的结构。通常,MapReduce作业会有一些标准输出,比如作业ID、提交信息、完成状态等。然后是关于π计算的具体结果,比如估算的π值、采样点的统计信息等。 然后,我要考虑用户可能的疑惑点。例如,输出中的“Number of Maps”和“Samples per map”是什么意思?为什么会有不同的结果?还有,输出的Estimated value of Pi后面的数字代表什么,标准差和误差是如何计算的? 同时,我需要确保引用的内容正确。用户提供的引用中有提到Hadoop的启动、Mapper类的编写、HBase的数据导入等,但直接相关的可能较少。不过,引用[4]提到了MapReduce处理数据的方法,可能和蒙特卡洛方法的并行计算有关联,但需要确认是否相关。 然后,我需要解释每个输出部分。例如,作业提交到ResourceManager,Map和Reduce的完成情况,采样点总数,在圆内的点数,最后计算出的π估计值,以及误差和标准差。这些都需要用简单的中文解释清楚。 还要注意用户提到的Hadoop版本是3.3.0,可能输出格式是否有变化。可能需要查阅相关文档或实际运行示例,确保信息准确。如果记得正确,输出大致包括这些部分,但具体数值会根据运行参数变化。 另外,需要说明蒙特卡洛方法的基本原理,即通过随机采样落在单位圆内的概率来估算π。公式的话,应该是用落入圆内的点数除以总点数,再乘以4得到π的近似值。这部分可能需要用行内公式,比如$π ≈ 4 \times (点数在圆内 / 总点数)$,符合用户的格式要求。 最后,生成的相关问题需要考虑用户可能进一步想了解的内容,比如如何提高计算精度,参数调整的影响,或者与其他方法的比较等。 检查是否需要引用用户提供的参考资料。虽然用户的引用主要涉及HDFS、Mapper类和HBase数据导入,但可能引用[4]提到MapReduce的处理方式,可以适当关联,但可能不直接相关。需要确认是否有必要添加引用标识,如果有合适的关联点就加上,比如在解释MapReduce作业时引用[2]或[4]。 总结,回答的结构应该是先解释命令格式,再详细分解输出内容,解释每个部分的含义,然后说明原理,最后给出相关问题和引用。</think>在Hadoop 3.3.0中,使用MapReduce示例程序计算圆周率(π)的输出结果包含以下关键信息和分析: --- ### **1. 命令格式** 执行命令为: ```bash hadoop jar hadoop-mapreduce-examples.jar pi <numMaps> <numSamples> ``` - **`<numMaps>`**:指定Map任务的数量,影响并行度。 - **`<numSamples>`**:总采样点数,值越大计算结果越精确。 --- ### **2. 输出结果解析** 典型输出示例如下: ``` Job Finished in 20.123 seconds Estimated value of Pi is 3.1415926536 Wrote input for Map task#0 ... Sampling Statistics = Number of Maps = 10 Samples per Map = 1000000 Selected Samples = 10000000 Circle Sampler Output = Total inside = 7853981 Total outside = 2146019 Total samples = 10000000 Error = 0.0000001234 (标准误差: 0.0000000456) ``` #### **关键字段解释** 1. **`Number of Maps`** Map任务数量,由用户输入的`<numMaps>`决定,用于并行生成随机采样点。 2. **`Samples per Map`** 每个Map任务分配的采样点数,总采样数为`numMaps × samplesPerMap`[^4]。 3. **`Total inside`与`Total outside`** - **`Total inside`**:落在单位圆内的采样点数量。 - **`Total outside`**:落在单位圆外的采样点数量。 - 计算原理:通过蒙特卡洛方法,利用概率比估算π值,公式为: $$π ≈ 4 × \frac{\text{Total inside}}{\text{Total samples}}$$ 例如:若`Total inside=7853981`,则估算值为$4 × 7853981 / 10000000 = 3.1415924$。 4. **`Error`与`标准误差`** - **`Error`**:估算值与真实π值的绝对误差。 - **`标准误差`**:基于采样点分布的统计误差,反映结果的置信区间。 --- ### **3. 原理说明** 程序通过**蒙特卡洛方法**模拟随机投点: 1. 在单位正方形内生成均匀分布的随机点$(x,y)$。 2. 统计满足$x^2 + y^2 ≤ 1$的点数比例,此比例近似为$\frac{π}{4}$。 3. 最终结果由MapReduce分布式计算聚合得出。 --- ### **4. 提高精度的方式** - **增加采样点**(增大`numSamples`):减少统计波动。 - **调整Map任务数**(`numMaps`):合理分配计算负载,但过多可能引发调度开销。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值