Hadoop MapReduce是一个软件框架,基于该框架能够容易地编写应用程序,这些应用程序能够运行在由上千个商用机器组成的大集群上,并以一种可靠的,具有容错能力的方式并行地处理上TB级别的海量数据集。
软件框架如下图所示:
Client:用户编写的Mapreduce程序通过Client端提交给JobTracker端;Client还提供一些查看作业运行状态的接口
JobTracker:主要负责资源监控和作业调度。JobTracker监控所有TaskTracker与作业的健康状态,一旦发现失败情况后,其会将相应的任务转移到其他节点;同时JobTracker会跟踪任务执行进度、资源使用量等信息,并将这些信息告诉任务调度器,而调度器会在资源出现空闲的时候,选择合适的任务使用这些资源。
TaskTracker:TaskTracker会周期性地通过心跳包的形式将本节点上资源的使用情况和任务的运行进度进行汇报给JobTracker,同时接受JobTraker发送过来的命令并执行相应的操作(启动新任务、杀死任务等)
Task分为Map Task和Reduce Task两种,均由TaskTracker启动。
Map Task执行流程
Reduce Task执行流程
MapReduce作业执行过程
作业执行的生命周期如图所示:
步骤1:作业提交与初始化。用户提交作业后,JobClient实例会将作业相关信息,比如jar包、作业配置文件、分片元信息文件上传到分布式文件系统。然后JobClient通过RPC通知JobTracker。JobTracker收到新的提交请求后,由作业调度模块对作业进行初始化:JobInProgress的创建,跟踪每个任务的运行情况。
步骤2:任务监控与调度。由TaskTracker来完成,以HeartBeat的形式发送本机的运行状态。
步骤3:任务运行环境准备。运行环境的准备包括JVM启动和资源隔离,均由TaskTracker实现。TaskTracker为每个Task启动一个独立的JAVM以避免不同Task在运行过程中相互影响。
步骤4:任务执行。运行过程中的实时进度均由TaskTracker进行汇报。
步骤5:作业完成。
MapReduce编程接口
MapReduce编程接口体系如图所示:
下面对主要的编程接口进行介绍
InputFormat
主要完成功能:
1、逻辑分片
2、将输入的分片解析成若干key/value对
InputSplit[] getSplits(JobConf job, int numSplits) throws IOException;
RecordReader<K, V> getRecordReader(InputSplit split, JobConf job, Reporter reporter) throws IOException;
}
OutPutFormat
主要完成功能:
1、检查输出目录是否合法
2、将reduce输出写入文件。
RecordWriter<K, V> getRecordWriter(FileSystem ignored, JobConf job
String name, Progressable progress)
throws IOException;
void checkOutputSpecs(FileSystem ignored, JobConf job) throws IOException;
}
Partitioner
Mapreduce框架提供了两个Partitioner实现:HashPartitioner和TotalOrderPatitioner。
int getPartition(K2 key, V2 value, int numPartitions);