hadoop核心运行原理

                            我们通过下面这个天气数据处理的例子来说明Hadoop的运行原理.

1Map-Reduce的逻辑过程

假设我们需要处理一批有关天气的数据,其格式如下:

·        按照ASCII码存储,每行一条记录

·        每一行字符从0开始计数,第15个到第18个字符为年

·        25个到第29个字符为温度,其中第25位是符号+/-

0067011990999991950051507+0000+

0043011990999991950051512+0022+

0043011990999991950051518-0011+

0043012650999991949032412+0111+

0043012650999991949032418+0078+

0067011990999991937051507+0001+

0043011990999991937051512-0002+

0043011990999991945051518+0001+

0043012650999991945032412+0002+

0043012650999991945032418+0078+

现在需要统计出每年的最高温度。

Map-Reduce主要包括两个步骤:MapReduce

每一步都有key-value对作为输入和输出:

·        map阶段的key-value对的格式是由输入的格式所决定的,如果是默认的TextInputFormat,则每行作为一个记录进程处理,其中key为此行的开头相对于文件的起始位置,value就是此行的字符文本

·        map阶段的输出的key-value对的格式必须同reduce阶段的输入key-value对的格式相对应

对于上面的例子,在map过程,输入的key-value对如下:

(0, 0067011990999991950051507+0000+)

(33, 0043011990999991950051512+0022+)

(66, 0043011990999991950051518-0011+)

(99, 0043012650999991949032412+0111+)

(132, 0043012650999991949032418+0078+)

(165, 0067011990999991937051507+0001+)

(198, 0043011990999991937051512-0002+)

(231, 0043011990999991945051518+0001+)

(264, 0043012650999991945032412+0002+)

(297, 0043012650999991945032418+0078+)

map过程中,通过对每一行字符串的解析,得到年-温度的key-value对作为输出:

(1950, 0)

(1950, 22)

(1950, -11)

(1949, 111)

(1949, 78)

(1937, 1)

(1937, -2)

(1945, 1)

(1945, 2)

(1945, 78)

reduce过程,将map过程中的输出,按照相同的keyvalue放到同一个列表中作为reduce的输入

(1950, [0, 22, –11])

(1949, [111, 78])

(1937, [1, -2])

(1945, [1, 2, 78])

reduce过程中,在列表中选择出最大的温度,将年-最大温度的key-value作为输出:

(1950, 22)

(1949, 111)

(1937, 1)

(1945, 78)

其逻辑过程可用如下图表示:

下图大概描述了Map-ReduceJob运行的基本原理:

 

下面我们讨论JobConf,其有很多的项可以进行配置:

·        setInputFormat:设置map的输入格式,默认为TextInputFormatkeyLongWritable,valueText

·        setNumMapTasks:设置map任务的个数,此设置通常不起作用,map任务的个数取决于输入的数据所能分成的input split的个数

·        setMapperClass:设置Mapper,默认为IdentityMapper

·        setMapRunnerClass:设置MapRunner,map task是由MapRunner运行的,默认为MapRunnable,其功能为读取input split的一个个record,依次调用Mappermap函数

·        setMapOutputKeyClasssetMapOutputValueClass:设置Mapper的输出的key-value对的格式

·        setOutputKeyClasssetOutputValueClass:设置Reducer的输出的key-value对的格式

·        setPartitionerClasssetNumReduceTasks:设置Partitioner,默认为HashPartitioner,其根据keyhash值来决定进入哪个partition,每个partition被一个reducetask处理,所以partition的个数等于reducetask的个数

·        setReducerClass:设置Reducer,默认为IdentityReducer

·        setOutputFormat:设置任务的输出格式,默认为TextOutputFormat

·        FileInputFormat.addInputPath:设置输入文件的路径,可以使一个文件,一个路径,一个通配符。可以被调用多次添加多个路径

·        FileOutputFormat.setOutputPath:设置输出文件的路径,在job运行前此路径不应该存在

当然不用所有的都设置,由上面的例子,可以编写Map-Reduce程序如下:

public class MaxTemperature {

    public static void main(String[] args) throws IOException {

        if (args.length != 2) {

            System.err.println("Usage: MaxTemperature <input path><output path>");

            System.exit(-1);

        }

        JobConf conf = new JobConf(MaxTemperature.class);

        conf.setJobName("Max temperature");

        FileInputFormat.addInputPath(conf, new Path(args[0]));

        FileOutputFormat.setOutputPath(conf, new Path(args[1]));

        conf.setMapperClass(MaxTemperatureMapper.class);

        conf.setReducerClass(MaxTemperatureReducer.class);

        conf.setOutputKeyClass(Text.class);

        conf.setOutputValueClass(IntWritable.class);

        JobClient.runJob(conf);

    }

}

3Map-Reduce数据流(data flow)

Map-Reduce的处理过程主要涉及以下四个部分:

·        客户端Client:用于提交Map-reduce任务job

·        JobTracker:协调整个job的运行,其为一个Java进程,其mainclassJobTracker

·        TaskTracker:运行此jobtask,处理inputsplit,其为一个Java进程,其mainclassTaskTracker

·        HDFShadoop分布式文件系统,用于在各个进程间共享Job相关的文件

3.1、任务提交

JobClient.runJob()创建一个新的JobClient实例,调用其submitJob()函数。

·        JobTracker请求一个新的job ID

·        检测此joboutput配置

·        计算此jobinput splits

·        Job运行所需的资源拷贝到JobTracker的文件系统中的文件夹中,包括job jar文件,job.xml配置文件,input splits

·        通知JobTrackerJob已经可以运行了

提交任务后,runJob每隔一秒钟轮询一次job的进度,将进度返回到命令行,直到任务运行完毕。

 

3.2、任务初始化

 

JobTracker收到submitJob调用的时候,将此任务放到一个队列中,job调度器将从队列中获取任务并初始化任务。

初始化首先创建一个对象来封装job运行的tasks,status以及progress

在创建task之前,job调度器首先从共享文件系统中获得JobClient计算出的inputsplits

其为每个inputsplit创建一个maptask

每个task被分配一个ID

 

3.3、任务分配

 

TaskTracker周期性的向JobTracker发送heartbeat

heartbeat中,TaskTracker告知JobTracker其已经准备运行一个新的taskJobTracker将分配给其一个task

JobTrackerTaskTracker选择一个task之前,JobTracker必须首先按照优先级选择一个Job,在最高优先级的Job中选择一个task

TaskTracker有固定数量的位置来运行map task或者reduce task

默认的调度器对待maptask优先于reducetask

当选择reducetask的时候,JobTracker并不在多个task之间进行选择,而是直接取下一个,因为reduce task没有数据本地化的概念。

 

3.4、任务执行

 

TaskTracker被分配了一个task,下面便要运行此task

首先,TaskTracker将此jobjar从共享文件系统中拷贝到TaskTracker的文件系统中。

TaskTrackerdistributed cache中将job运行所需要的文件拷贝到本地磁盘。

其次,其为每个task创建一个本地的工作目录,将jar解压缩到文件目录中。

其三,其创建一个TaskRunner来运行task

TaskRunner创建一个新的JVM来运行task

被创建的childJVMTaskTracker通信来报告运行进度。

 

3.4.1Map的过程

MapRunnableinput split中读取一个个的record,然后依次调用Mappermap函数,将结果输出。

map的输出并不是直接写入硬盘,而是将其写入缓存memory buffer

buffer中数据的到达一定的大小,一个背景线程将数据开始写入硬盘。

在写入硬盘之前,内存中的数据通过partitioner分成多个partition

在同一个partition中,背景线程会将数据按照key在内存中排序。

每次从内存向硬盘flush数据,都生成一个新的spill文件。

当此task结束之前,所有的spill文件被合并为一个整的被partition的而且排好序的文件。

reducer可以通过http协议请求map的输出文件,tracker.http.threads可以设置http服务线程数。

3.4.2Reduce的过程

map task结束后,其通知TaskTrackerTaskTracker通知JobTracker

对于一个jobJobTracker知道TaskTracermap输出的对应关系。

reducer中一个线程周期性的向JobTracker请求map输出的位置,直到其取得了所有的map输出。

reduce task需要其对应的partition的所有的map输出。

reduce task中的copy过程即当每个map task结束的时候就开始拷贝输出,因为不同的map task完成时间不同。

reduce task中有多个copy线程,可以并行拷贝map输出。

当很多map输出拷贝到reducetask后,一个背景线程将其合并为一个大的排好序的文件。

当所有的map输出都拷贝到reducetask后,进入sort过程,将所有的map输出合并为大的排好序的文件。

最后进入reduce过程,调用reducerreduce函数,处理排好序的输出的每个key,最后的结果写入HDFS

 

 

3.5、任务结束

 

JobTracker获得最后一个task的运行成功的报告后,将job得状态改为成功。

JobClientJobTracker轮询的时候,发现此job已经成功结束,则向用户打印消息,从runJob函数中返回。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值