Hadoop MapReduce执行框架作业调度方法 组件和执行流程

1、Hadoop MapReduce作业调度

早期的Hadoop使用的FIFO调度器来调度用户提交的 作业。现在主要使用的调度器包括Yahoo公司提出的计算能力调度器(Capacity Scheduler)以及Facebook公司提出的公平调度器(Fair Scheduler)

2、MapReduce执行框架的组件和执行流程

   每个TaskTracker节点将从HDFS分布式文件中读取所有处理的数据。Hadoop MapReduce框架提供了一个InputFormat对象负责具体以什么样的输入格式读取数据。然后数据会被分为很多个分片(Split),每个分片将交由一个Map对象处理。再进入Map之前,需要通过RecorderReader对象逐个从数据分片中读出数据记录、并转换为Key-value键值对,逐个输入到Map中处理。Map输出中间结果前,需要经过一个Combiner对象将该Map输出的相同主键下的所有键值对合并成一个键值对;map所输出的中间结果在进入Reduce之前,先通过中间的Partitioner对象进行数据分区,将数据发送到合适的Reduce节点上,避免不同Reduce节点上数据相关性,保证每个reduce节点可独立完成本地计算;在传入Reduce节点之前还会将所有键值对按照主键值进行排序。Reduce节点完成计算后,经过OutputFormat对指定输出数据的具体格式,最终将数据输出并写回到HDFS中。

3、InputFormat类简介   数据输入格式

InputFormat类是Hadoop MapReduce框架中的基础类之一,他描述了MapReduce作业数据的输入形式和格式。作业的InputFormat将MapReduce框架赋予三个任务:

①验证作业数据的输入形式和格式

②将输入数据分割为若干逻辑意义上的InputSplit,其中每一个InputSpllit将单独作为一个Mapper的输入

③提供一个RecordReader,用于将Mapper的输入(即InputSplit)处理转化为若干输入记录。

可以使用下面的代码来指定MapReduce作业数据的输入格式(以设置输入格式KeyValueTextInputFormat为例)

job.setInputFormatClass(KeyValueTextInputFormat.class);

InputFormat是一个抽象类,位于org.apache.hadoop.mapreduce.InutFormat<k,v>   该抽象类有两个抽象方法

abstract List<InputSplit> getSplit(JoContext context);
abstract Recorder<K,V> createRecordReader(InputSplit split,TaskAttemptContext context);
getSplits()方法将被JobClient调用,返回一个InputSplit列表。

JobTracker将根据这个列表完成确定Mapper数量、分配Mapper与InputSplit的工作。createRecordReader()方法被TaskTracker在初始化Mapper时调用,返回一个RecordReader用于读取记录。

4、FileInputFormat类

  FileInputFormat类是最常用的InputFormat类别。它重载了InputFormat类的getSplits()方法,用于从HDFS中读取文件并分块,这些文件可能是文本文件或者顺序文件。默认的输入格式TextInputFormat即为FileInputFormat的一个子类,此外,CombineFileInputFormat,KeyValueTextInputFromat,NLineInputFormat,SequenceFileInputFormat也都是FileInputFormat的子类。

   FileInputFormat提供类若干静态方法,用户可以用他们设定输入路径、指定分块大小等全局设置。比如,addInputPath()方法可以添加一个输入文件(或文件夹)的路径,setMaxInputSplitSize()方法可以设定一个数据分块的最大大小(默认数据分块的大小等于HDFS的块大小)

5、常用的内置InputFormat类

    hadoop提供了一些常用的内置InputFormat类,包括TextInputFormat,KeyValueTextInputFormat以及SequenceFileInputFormat,都是FileInputFormat的子类。

6、TextInputFormat类    默认输入格式;读取文本文件的行,    key   当前行偏移位置      value   当前行内容

  ①如果用户不指定输入格式,则系统默认的输入格式为TextInputFormat类。 它将HDFS上的文本文件分块送入Mapper,然后逐行读入,将当前行在整个文本文件中的字符偏移位置作为键key,将该行的内容作为值  value

②TextInputFormat提供了默认的LineRecordReader,以读入一个文本行数据记录。在使用TextInputFormat时,Mapper的输入数据格式应指定为<LongWritable,Text>

7、KeyValueTextFormat类

①KeyValueTextFormat同TextInputFormat一样逐行读入文本文件,同时它将行的内容解析为键值对。具体地,他会寻找当前行的第一个分隔符(默认为制表符“\t”),将此分分隔符前的内容作为主键,而后面的内容直到行尾作为值

②KeyValueTextFormat内置的默认RecorderReader是KeyValueLineRecordReader。

③在使用KeyValueTextFormat时,Mapper的输入数据格式应指定为<Text,Text>

8、SequenceFileFormat类

①Hadoop的顺序文件格式可以存储二进制的键值对序列。SequenceFileInputFormat类能够以顺序二进制文件数据作为MapReduce的输入,读取其中的键值供用户处理。SequenceFileInputFormat可用于读取和处理诸如媒体(图片、视频、声音)等二进制数据文件。

②具体的输入键值对格式需要用户定义。   SequenceFileInputFormat内置的默认RecordReader是SequenceFileRecordReader,

③在使用SequenceFileInutFormat时,Mapper的输入数据格式应当按照顺序的二进制文件中键值数据的实际格式来指定。

9、其他的内置InputFormat类

①hadoop提供了各种丰富的InputFormat类,它们重载了getSplits()和createRecordReader()方法,以实现从特定数据源或特殊目的的输入要求。

②各种可用的InputFormat类:TextInputFormat,   KeyValueTextInputFormat,

NLineInputFormat,

CombineFileInputFormat,

SequenceFileInputFormat,

SequenceFileAsTextInputFormat,

SequeceFileAsBinaryInputFormat,

SequenceFileInputFilter,

DBInputFormat,

DataDrivenDBInputFormat,

OracleDataDrivenDBInputFormat.

10、输入数据分块InputSplit

   ①  数据分块InputSplit是Hadoop MapReduce框架中的基础类之一。一个InputSplit将单独作为一个Mapper,即作业的Mapper数量是由InputSplit的个数决定的。

   ②  用户不能自由地选择InputSplit的类型,而是在选择某个InputFormat时就决定了对应的InputSplit。具体地,特定的InputFormat类重载的getSplit方法,他的返回值就是特定的InputSplit类的列表。

  ③  任何数据块的实现都继承自抽象基类InputFormat,它位于:   org.apache.hadoop.mapreduce.InputSplit     该抽象基类有两个抽象方法:

abstract long getLength();
abstract String[] getLocation();

getLength()方法返回该分块的大小,getLocation()方法返回一个列表,其中列表的每一项为该分块的数据所在的节点。这些数据对于这些节点是“本地的”

④JobTracker的调度器根据这两个方法的返回值,以及TaskTracker通过心跳通信反馈给JobTracker的Map Slot的可用情况,选择合适的调度策略为TaskTracker分配Map任务,使得它所需的数据分块尽量在本地

⑤ 一个常见的数据分块类是FileSplit。它对应与输入格式FileInputFormat。还提供一些其他的方法如getPath()方法返回该文件分块的文件名,getStart()方法返回该文件的第一个字节在文件中的位置。

11.数据记录读入  RecordReader

① RecordReader负责从数据块中读取数据记录并转化为键值对的类

②和InputSplit类一样,用户并不能自由的选择RecordReader的类型,而是选择某个InputFormat时就决定了对应的RecordReader。特定的InputFormat类重载createRecordReader方法,他的返回值就是特定的RecordReader类。

如  TextInoutFormat对应的默认RecordReader是LineRecordReader,

KeyValueTextInputFormat对应的默认RecordReader是KeyValueLineRecordReader

实际中也可自定义

③任何数据记录读入功能的实现都继承自抽象基类RecordReader,    org.hadoop.mapreduce.RecordReader<KEYIN,VALUEIN>,该抽象类实现了Closable接口,

 

abstract void close();//关闭RecordReader,继承自Closable接口
abstract void initialize(InputSplit split ,TaskAttempContext context);//初始RecordReader
abstract boolean nextKeyValue();//读取下一个键值对,如果读取成功,则返回true,否则返回false
abstract KEYIN getCurrentKey();//返回当前key
abstract VALUEIN getCurrentValue();//返回当前Value
abstract float getProgress(); //返回0-1之间的小数,表示已读取数据的比例
 

④ 默认Mapper的run()方法的核心代码如下所示,其中context对象的nextKeyValue()、getCurrentKey()和getCurrentValue方式都是RecordReader对应的封装

public void run(Context context){
    setup(context);
    while(context.nextKeyValue()){
        map(context.getCurrentKey(), context.getCurrentValue() , context);
    }

}

⑤常用的内置RecordReader类

LineRecordReader列逐行读出文件中的一行作为一个记录,  并将当前行在整个文本文件中的字符偏移位置作为键,对应着TextInputFormat类

KeyValueLineRecordReader类则认为每行文本已按照“键值对”的格式逐行组织好数据,对应着KeyValueTextInputFormat类

SequenceFileRecordReader类则将文本作为二进制顺序文件读出,具体的键值对格式需要由用户实现,对应的SequenceFileInputFormat类


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值