yarn框架学习记录 MapReduce阶段学习

yarn

作业调度与集群资源管理的框架。

集群控制

资源管理器(Resource Manager)

是YARN中的主节点,它负责整个集群的资源调度和管理。它监控集群中各个节点的资源使用情况,并为应用程序分配和管理资源。Resource Manager接收来自Applications Manager的应用程序提交请求和资源请求,并根据集群中空闲资源的情况,为应用程序分配可用的计算资源。它还负责监控集群中各个节点的状态,检测节点的故障并进行处理。

其中包括了对MapReduce任务所需的计算资源(CPU、内存)和存储资源(HDFS数据块)进行分配和调度,并将任务分发到各个节点上执行。资源管理器通过与节点管理器(Node Manager)通信来监控和管理集群资源使用情况。

Applications Manager

资源管理器的子组件,它负责接收应用程序的提交请求,并为每个应用程序分配一个唯一的应用程序ID。一旦应用程序被接受,ApplicationsManager 将启动相应的 ApplicationMaster 来协调该应用程序的执行。

还负责监控和管理应用程序的生命周期。当应用程序完成或出现错误时,ApplicationsManager 负责通知资源管理器释放该应用程序占用的资源。

节点控制

节点管理器(Node Manager)

是运行在每个物理节点上的代理程序,它负责管理该节点上的资源和任务。节点管理器接收来自资源管理器的指令,启动和监控容器(Container),并向资源管理器汇报该节点上的资源使用情况。

容器(Container)

是一个封装了计算资源和环境的虚拟化实例。在MapReduce任务中,每个容器都运行一个Map或Reduce任务。容器由节点管理器启动和停止,并在运行过程中负责从HDFS中读取数据,对数据进行计算,以及将结果写回到HDFS中。

MapReduce(具体实现)

Map阶段

mapReduce 分片工作

MapReduce 分片工作是将输入数据切分成多个独立的数据块,并将这些数据块分配给不同的 Map 任务进行处理的过程。这样可以实现并行处理,提高处理效率。

具体来说,MapReduce 的分片工作包括两个主要步骤:

  1. 输入数据的切片(Input Splits):在分片工作开始之前,输入数据会被切成多个大小相等或尽量接近的数据块,称为输入分片。输入分片的大小通常由文件系统的块大小决定。切片的目的是将数据均匀地分布到不同的 Map 任务中,以实现并行处理。

  2. 分配分片给 Map 任务:一旦输入数据被切片,资源管理器(Resource Manager)会将这些分片分配给可用的 Map 任务。每个 Map 任务都会被分配一个或多个输入分片进行处理。不同的 Map 任务可以并行地处理它们各自的输入分片,而不会相互干扰。

通过以上的分片工作,MapReduce 程序可以将大规模的输入数据切分成多个较小的数据块,并将这些数据块分发给不同的 Map 任务并行处理。这种并行处理的方式能够充分利用集群中的计算资源,提高整体的处理效率和吞吐量。同时,分片工作也帮助保证了数据的局部性,即尽量将数据分配给与其所在位置相近的节点进行处理,减少数据的网络传输。

Partitioner(分区器)

在 MapReduce 中,Map 分区(Map Partition)是指将 Map 阶段的输出数据按照一定的规则划分成多个不同的分区,以便后续的 Reduce 阶段进行处理。

具体来说,Map 分区的主要目的是将 Map 阶段的输出结果根据键(Key)进行分组,并将相同键的值(Value)放置在同一个分区中。这样可以确保具有相同键的数据被发送到同一个 Reduce 任务进行处理,从而实现数据的聚合和排序。

Map 分区的过程通常由 Partitioner(分区器)来完成,Partitioner 是 MapReduce 框架中的一个组件。Partitioner 接收 Map 阶段的输出键值对,并根据一定的算法或规则,将它们分配到不同的分区中。

默认情况下,MapReduce 使用哈希分区(Hash Partitioning)来进行数据的分区。即,使用键的哈希函数将键映射到不同的分区。这种方式可以保证相同键的数据被均匀地分布到不同的分区中,以实现负载均衡。

然而,MapReduce 也提供了自定义的分区策略。用户可以根据自己的需求,实现自定义的 Partitioner 类,并通过设置 JobConf 对象的 setPartitionerClass() 方法来指定使用该自定义分区器。

总结起来,Map 分区是 MapReduce 中的一个重要步骤,它将 Map 阶段的输出数据按照键进行分组,以便后续的 Reduce 阶段可以更高效地处理数据。默认情况下使用哈希分区,同时也支持自定义分区策略。

Reduce 阶段

Shuffle(洗牌)

在 Shuffle 阶段,Map 阶段的输出结果会根据键(Key)进行排序,并按照键的哈希值将数据发送到对应的 Reducer。这个过程包括将 Map 阶段的输出数据分区、对每个分区内的数据进行排序,并将数据发送给对应的 Reducer。

Sort(排序)

在 Shuffle 阶段中,对于每个分区内的数据,会根据键进行排序。这样可以确保在 Reduce 阶段中,相同键的数据会被连续地处理,便于进行聚合操作。

Reduce(归约)

在 Reduce 阶段,每个 Reducer 会接收来自不同 Map Task 的数据,并对相同键的数据进行聚合、处理和计算。Reducer 会遍历它所负责的键值对集合,并根据用户自定义的 reduce 函数,对具有相同键的值进行合并、计算或其他操作。

Output(输出)

在 Reduce 阶段处理完成后,Reducer 会生成最终的输出结果。这些结果通常是经过归约操作后的聚合结果,可以写入 Hadoop 分布式文件系统(如HDFS)或其他存储系统中。

需要注意的是,这些阶段都是由 MapReduce 框架自动管理和执行的,开发人员只需实现 Map 和 Reduce 函数即可。框架会负责调度、分配任务、执行排序和归约等操作,以实现高效的并行计算。

FileOutputFormat和FileInputFormat

是Hadoop MapReduce框架中用于处理文件输入和输出的类。

FileInputFormat是一个抽象类,用于定义MapReduce任务的输入格式。它提供了一些方法来读取文件、切分文件并生成适合作为Map输入的记录。开发人员可以通过继承FileInputFormat类,并重写其中的方法来定义自己的输入格式。

public abstract class InputFormat<K, V> {
    public InputFormat() {
    }
    
    //该方法用于将输入数据切分成多个片段,每个片段被称为一个InputSplit。
    public abstract List<InputSplit> getSplits(JobContext var1) throws IOException, InterruptedException;
    
   /*该方法用于创建一个RecordReader对象,用于读取指定InputSplit中的数据。RecordReader负责从InputSplit中读取数据,并转换成键值对供Map任务处理。createRecordReader方法的返回值是一个实现了RecordReader接口的对象。*/
    public abstract RecordReader<K, V> createRecordReader(InputSplit var1, TaskAttemptContext var2) throws IOException, InterruptedException;
}

FileOutputFormat也是一个抽象类,用于定义MapReduce任务的输出格式。它提供了一些方法来写入MapReduce任务的输出数据到文件系统。同样,开发人员可以通过继承FileOutputFormat类,并重写其中的方法来定义自己的输出格式。

public abstract class OutputFormat<K, V> {
    public OutputFormat() {
    }
    //该方法用于创建一个RecordWriter对象,用于将Reduce任务的输出结果写入到指定的输出目录或输出流中。RecordWriter负责将键值对转换为指定输出格式的数据并写入输出目录或输出流。
    public abstract RecordWriter<K, V> getRecordWriter(TaskAttemptContext var1) throws IOException, InterruptedException;
    //该方法用于检查输出目录是否已存在,以及当前用户是否有权限读写该目录。如果输出目录不存在或无法访问,则抛出异常。
    public abstract void checkOutputSpecs(JobContext var1) throws IOException, InterruptedException;
    //
    public abstract OutputCommitter getOutputCommitter(TaskAttemptContext var1) throws IOException, InterruptedException;
}

这两个类的主要作用是将输入数据转换为可供MapReduce任务处理的键值对形式,并将MapReduce任务的输出数据写入到文件系统中。在使用Hadoop MapReduce进行数据处理时,通常需要根据实际需求自定义FileInputFormat和FileOutputFormat,以适应不同的数据输入和输出格式。

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YARN框架对比MapReduce1.0的改进 随着大数据时代的到来,大数据处理框架也在不断地发展和完善。MapReduce1.0曾经是Hadoop生态圈中最重要的组件之一,但是它存在着一些局限性。为了解决这些问题,Hadoop社区开发了YARN框架,它可以更好地支持多种应用程序,并且更加灵活和可扩展。 下面是YARN框架相对于MapReduce1.0的改进: 1. 更好的资源管理:MapReduce1.0将资源管理和作业调度紧密耦合在一起,这意味着只能运行MapReduce作业。而YARN框架采用了更加灵活的资源管理方式,可以支持多种应用程序,包括Hadoop、Spark、Storm等等。 2. 更好的作业调度:YARN框架采用了分布式作业调度器,可以更加灵活地调度作业。这使得作业的启动和停止更加快速,而且更加容易实现资源共享和作业排队。 3. 更好的容错性:MapReduce1.0的容错性有限,如果某个节点出现故障,整个作业都会失败。而YARN框架采用了更加可靠的容错机制,可以自动重启失败的任务,并且可以在多个节点之间重新分配任务,保证作业的顺利运行。 4. 更好的可扩展性:MapReduce1.0的可扩展性有限,只能通过增加更多的节点来扩展。而YARN框架采用了更加分布式的架构,可以更加容易地扩展,支持更多的节点和更大规模的数据处理。 总的来说,YARN框架相对于MapReduce1.0的改进是非常显著的。它提供了更加灵活、可扩展和可靠的资源管理、作业调度和容错机制。这使得它成为了大数据处理框架中最重要的组件之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值