`
java-大神
  • 浏览: 34943 次
  • 性别: Icon_minigender_1
  • 来自: 大山东
社区版块
存档分类
最新评论

MapReduce编程模型之InputFormat接口分析

阅读更多

 

      最近小组任务是在MapReduce编程模型,分析其接口体系结构,即InputFormat、Mapper、Partitioner、Reducer和OutputFormat五个接口的分析,我的任务是分析InputFormat接口,当时觉得不就是几个接口吗,还用得着五个人来分工,回家一晚上就可以全部搞定,好在当时没有冲动,现在花了一周(其实只有假期里)总算勉强玩转一个,想想还有点小激动。

      想深入学习MapReduce的小伙伴们不妨看下hadoop技术内幕,有两册,楼主看的是MapReduce的架构设计和实现原理,还有Commen+HDFS,后者对Commen和HDFS的源码进行了分析,感兴趣的话read下也是极好的。再者就是谷歌三大论文中有关于MapReduce的论文,百度上都有PDF文档可以直接下载,嫌麻烦的同学可以看下http://blog.csdn.net/active1001/article/details/1675920,其实内容都差不多啦。

      MapReduce应用广泛的原因之一在于它的易用性。它提供了一个因高度抽象化而变得异常简单的编程模型。MapReduce是在总结大量应用的共同特点的基础上抽象出来的分布式计算框架,特点:任务可以分解成相互独立子问题。

      上面灰色部分是整个编程模型,分为两层:所谓工具层就是增加点兼容性(楼主个人理解,不喜勿喷)而已,而下面的接口层就是费神的地方了。

      先来点官方的,InputFormat主要用于描述数据的格式,它提供一下两个功能:

      数据切分:按照某个策略将输入数据切分成若干个split,以便确定Map Task个数以及对应的split。

      为Mapper提供输入数据:给定某个split,能将其解析成一个个key/value对。

      乍一看,挺简单的,不就是把数据打碎,变成k&v对提交给Mapper么,好吧,学了等于没学,这些貌似没什么用。

      楼主这里从数据划分splitI调度数据读取这三方面来分析InputFormat。

      具体还是先从经典的MapReduce工作流程入手吧。
          
1、运行一个MapReduce程序;

2、运行时将生成一个Job,JobClient向JobTracker申请一个JobID以标识这个Job;
3、JobClient将Job所需要的资源提交到HDFS中一个以JobID命名的目录中。这些资源包括JAR包、配置文件、InputSplit等;
4、JobClient向JobTracker提交这个Job;
5、JobTracker接收并初始化这个Job;
6、JobTracker从HDFS获取这个Job的Split等信息;
7、JobTracker向TaskTracker分配任务;
8、TaskTracker从HDFS获取这个Job的相关资源;
9、TaskTracker开启一个新的JVM;
10、TaskTracker用新的JVM来执行Map或Reduce;

       数据划分

 

      注意看第三步,这里提交的资源中包含了InputSplit(上文中已标记)就是数据划分的结果。数据划分是在JobClient上完成的,它适用InputFormat将输入数据做一次划分,形成若干split。

      InputFormat是一个接口,它包含两种方法:

      1) InputSplit[] getsSplits(JobConf job,int numSplits) throws IOException;

      2) RecordReader<K,V> getRecordReader(InpputSplit split,JobConf job,Reporter reporter) throws IOException;

      这里getSplits函数就是划分函数。job参数是任务的配置集合,从中可以取到用户在启动MapReduce时指定的输入文件路径。而numSplits参数是一个Split数目。

      返回接口数组InputSplit,描述所有的Split信息,一对一。它也有两个函数:

      1) long getLength() throws IOException;

      2) String[] getLocation() throws IoException;

      即描述Split长度与Split的位置(在HDFS上存放的机器),属于逻辑分片。

      序列化问题:对象序列化主要用于进程间通信和永久存储。InputSplit序列化主要是为了前者。

 

      getRecordReader方法返回一个RecordReader对象,将输入的InputSplit解析成若干key/value对。

      

      顺便插一句,有时候会遇到输入文件是不可划分的,比如一个tar.gz,划分会是其无法解压,可以考虑重载FileInoutFormat的isSplitable()函数来告知文件是否可分,或者干脆从头实现一个InputFormat。

  

      Split调度

      图片第6步JobTracker会从HDFS获取Job的Split信息,这将生成一系列待处理的Map和Reduce任务。    JobTracker 并不会主动的为每一个TaskTracker划分一个任务子集,而是直接把所有任务都放在跟Job对

应的待处理任务列表中。

      在分配Map任务时,Split的Location信息就要发挥作用了。JobTracker会根据TaskTracker的地址来选择一个Location与之最接近的Split所对应的Map任务(注意一个Split可以有多个Location)。这样一来,输入文件中Block的Location信息经过一系列的整合(by InputFormat)和传递,最终就影响到了Map任务的分配。其结果是Map任务倾向于处理存放在本地的数据,以保证效率。

 

 

      数据读取

      图片第10步,TaskTracker启动一个JVM来执行Map程序。在Map执行的时候,会使用InputFormat.getRecordReader()所返回的RecordReader对象来读取Split中的每一条记录。

      PS:实际上,RecordReader并不关心Split的Location,只管Open它的Path。前面说RecordReader是由具体的InputFormat创建并返回的,它跟对应的InputFormat所使用的InputSplit必定是配对的。比如,对应于  FileSplit,RecordReader要读取FileSplit.file文件中的相应区间、对于CombineFileSplit,RecordReader要读  取CombineFileSplit.paths中的每个文件的相应区间。

       

      最后,介绍大家系统自带的各种InputFormat实现。



       如上图,所有基于文件的InputFormat实现的基类是FileInputFormat,并派生出针对文本格式的TextInputFormat、KeyValueTextInputFormat和NLineInputFormat以及针对二进制文件格式的SequenceFileInputFormat等。

      注意:当使用基于FileInputFormat实现InputFormat时,为了提高Map Task 的数据本地性,应尽量是InputSplit与block大小相同。

 

 

  • 大小: 144.7 KB
  • 大小: 44.4 KB
  • 大小: 70 KB
分享到:
评论

相关推荐

    Hadoop源码解析---MapReduce之InputFormat

    在Hadoop的生态系统中,MapReduce是处理海量数据的一种编程模型,而InputFormat作为MapReduce编程模型的重要组成部分,是负责处理输入数据的关键接口。为了深入理解MapReduce工作原理,必须掌握InputFormat的设计和...

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

    MapReduce编程模型3.1 MapReduce编程模型概述3.1.1 MapReduce编程接口体系结构3.1.2 新旧MapReduce API比较3.2 MapReduce API基本概念3.2.1 序列化3.2.2 Reporter参数3.2.3 回调机制3.3 Java API解析3.3.1 ...

    MapReduce计算模型详讲(结合源码深入解读)

    MapReduce是Hadoop中的一种编程模型,用于处理大规模数据。它主要由两部分组成:Map和Reduce。Map阶段负责将输入数据分割成小块,并对每个小块进行处理;Reduce阶段负责将Map阶段的输出结果进行聚合和处理。下面是...

    MapReduce2.0程序设计多语言编程(理论+实践)

    1. **MapReduce编程模型**:MapReduce的核心是Map和Reduce两个函数。Map负责将输入数据拆分成键值对,进行局部处理;Reduce则将Map阶段的结果进行聚合,生成最终结果。中间结果通过 Shuffle 和 Sort 阶段进行排序和...

    MapReduce2.0源码分析与实战编程

    6. **实战编程**:MapReduce编程涉及定义Mapper和Reducer类,以及配置输入输出格式。例如,自定义InputFormat处理非标准输入,OutputFormat定义结果存储方式。此外,还需关注作业提交、监控和调试技巧。 7. **...

    Hadoop-2.8.0-Day04-MapReduce编程案例-课件与资料.zip

    在这个"Day04"的学习资料中,我们将深入探讨MapReduce编程模型,并通过具体的案例来理解其工作原理。 MapReduce 分为两个主要阶段:Map阶段和Reduce阶段。在Map阶段,原始数据被分割成多个块,每个块由一个Map任务...

    hadoop eclipse mapreduce下开发所有需要用到的JAR包

    4. **hadoop-mapreduce-client-core**: 包含MapReduce编程模型的核心类和接口,如Mapper、Reducer、Partitioner、InputFormat和OutputFormat等。 5. **hadoop-mapreduce-client-app**: 提供了JobTracker的替代,即...

    Hadoop MapReduce Cookbook 源码

    2. **MapReduce编程模型**:介绍Map和Reduce函数的编写,以及Combiner和Partitioner的使用,它们分别用于局部聚合和分区优化。 3. **数据输入与输出**:探讨InputFormat和OutputFormat接口,理解如何自定义输入输出...

    0324大数据代码与数据_JAVA大数据_文本分析_运用MapReduce做数据分析_

    总的来说,"0324大数据代码与数据_JAVA大数据_文本分析_运用MapReduce做数据分析_"项目涵盖了大数据处理的关键技术,包括Java编程、MapReduce模型、文本分析以及可能的数据存储和可视化。通过学习和实践这个项目,...

    mapreduce解析网络日志文件(或从mysql数据库获取记录)并计算相邻日志记录间隔时长

    在大数据处理领域,MapReduce是一种广泛使用的编程模型,尤其适合处理和存储海量数据。本话题主要探讨如何利用MapReduce解析网络日志文件,或者从MySQL数据库中获取记录,并计算相邻日志记录之间的间隔时长。这涉及...

    MapReduce分布式计算平台编程示例

    它提供了一种简单有效的编程模型,允许开发者编写并行处理大规模数据的应用程序。MapReduce的核心概念是将复杂的计算任务分解成较小的子任务,并在分布式环境中并行执行。 **1.1 编程模式** MapReduce的基本编程...

    大数据技术基础培训-MapReduce技术培训.pptx

    MapReduce是Google提出的一种编程模型,用于处理和生成大规模数据集。该框架的核心思想是将复杂的大规模数据处理任务分解为两个主要阶段:Map阶段和Reduce阶段,同时引入Shuffle阶段作为两者之间的桥梁。此外,...

    simple-cdmh-mapreduce

    "simple-cdmh-mapreduce" 是一个与MapReduce编程模型相关的项目,可能是一个简化版的CDMH(可能是某个公司或组织的缩写)MapReduce实现。MapReduce是Google提出的一种分布式计算模型,常用于大数据处理,它将大规模...

    分布式计算利器_MapReduce

    MapReduce是一种编程模型,用于处理和生成大数据集的算法模型。它的设计思想源自于函数式编程中的map和reduce操作。在Hadoop框架中,MapReduce作为一个核心组件,能够运行在上千台的商用机器上,以处理极其大量的...

    Hadoop_MapReduce教程

    Hadoop MapReduce 是一种分布式编程模型,旨在处理大规模数据集(TB级别甚至PB级别)的计算任务。它通过将计算任务分解为多个子任务并在多台机器上并行执行这些任务来提高效率。Hadoop MapReduce 由两个主要组件构成...

    实验五 MapReduce实验.docx

    Writable 是 Hadoop 自定义的序列化接口,实现该类的接口可以用作 MapReduce 过程中的 value 数据使用。 MapReduce 是一种高效的计算模型,通过将数据交给不同的机器去处理,数据划分,结果归约,实现了并行计算,...

    大数据平台-MapReduce介绍.pdf

    MapReduce编程过程是一个继承类与实现接口的过程,这些类与接口来自于Hadoop的Map-Reduce框架,由框架控制其执行流程。编程过程的三个阶段是输入阶段、计算阶段和输出阶段。 在输入阶段,InputFormat文件分割,读取...

    Hadoop实战中文版

    Hadoop包含多个相互关联的子项目,最核心的两个部分是Hadoop分布式文件系统(HDFS)和MapReduce编程模型。 Hadoop的核心概念包括集群管理和数据处理。集群是由多个计算机节点组成的硬件集合,这些计算机协同工作,...

    MapReduceV2笔记

    MapReduce是一种编程模型,用于处理大规模数据集,它是Hadoop项目的核心组成部分。MapReduceV2是其更新的版本,其设计思想和架构主要是为了解决大数据环境下的存储和计算问题。MapReduceV2的工作机制可以分为map阶段...

Global site tag (gtag.js) - Google Analytics