您的位置:首页 > 大数据 > 云计算

MapReduce 1 程序开发

2016-12-04 00:18 162 查看
本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/article/2016/05/31/MapReduce
1 程序开发/

1、 主JobTracker:负责总任务的调度和分配工作,控制其他的TaskTracker的执行,发现其中的TaskTracker无法执行就分配其他TaskTracker接着执行相应的任务,总调度作用,若任务中的JobTracker只有一个,通常运行在Master节点上。

2、 从TaskTracker:主动与JobTracker通信,接收JobTracker分配的任务并执行,为了较少网络负担,通常运行在DataNode节点上(和数据在一起,减少数据网络拷贝次数);

3、 MapReduce搭建配置过程:

   A、 选择一台负责JobTracker的机器,修改mapred-site.xml文件,指定JobTracker的机器;并把配置文件同步到其他所有节点机器上;

   B、 其他的TaskTracker默认分配在DataNode节点上,执行start-all.sh启动整个系统;

   C、 浏览器访问:http://namenode:50030访问MapReduce管理界面

4、 编写分布式程序:

   A、 继承org.apache.hadoop.mapreduce.Mapper;编写mapper方法,对输入数据进行分割并封装成特定键值对

   B、 继承org.apache.hadoop.mapreduce.Reducer;编写reduce方法,对上面的Map的输出键值对进行合并操作,这个时候reduce方法收到的已经是Map的所有相同key下的键值对集合(一个key对应这个key的所有value的集合),对这个集合的操作相当于最后的统计工作;

   C、 编写任务类:

     org.apache.hadoop.conf.Configuration;///Hadoop的MapReduce执行配置

     org.apache.hadoop.mapreduce.Job;///任务实体

     设置好Job的相关参数,封装成分布式系统可识别的jar包,如下:

     //根据配置创建一个任务

     Job job = new Job(configuration);

     //设置任务main入口

     job.setJarByClass(JobRun.class);

     //设置map的class类

     job.setMapperClass(QQFriendMapper.class);

     //设置reduce 的class类

     job.setReducerClass(QQFriendReducer.class);

     //设置map的输出数据的key类型

     job.setMapOutputKeyClass(Text.class);

     //设置map的输出数据的value类型

     job.setMapOutputValueClass(Text.class);

     //设置执行任务的reduce的数量,和程序运行效率有关

     job.setNumReduceTasks(2);// 设置Reduce任务个数,默认为1

   D、 设置好这个程序的输入数据和输出数据的文件来源(HDFS文件系统中)

     // 设置程序执行输入数据目录或文件

     FileInputFormat.addInputPath(job, new Path("/test1/qq.txt"));

     // 设置程序执行结果输出目录

     FileOutputFormat.setOutputPath(job, new Path("/test1/qqresult"));

     // job执行完成就返回0,程序退出,否则返回1表示有错

   E、 设置程序退出状态:

    System.exit(job.waitForCompletion(true) ? 0 : 1);

5、 将这个程序打成jar包上传到NameNode节点服务器中即可执行。

6、 执行过程分析:

   A、 NameNode节点使用命令执行相应的jar,执行main函数入口;

   B、 程序在指定的JobTracker节点开始运行,根据Job设置的Mapper和Reducer类分配好Map和Reduce节点;

   C、 根据Job设置的输入输出文件来源设置好程序的运行过程所需的文件数据;

   D、 执行Mapper,将数据输入文件Split,并把每个Split调用一次mapper方法去执行,Map结果写入HDFS;

   E、 所有Map执行结束,将所有结果按照键值分组,每个分组为一个相同key的集合,每个集合调用一次reduce方法;

   F、 在reduce方法中,对相同key的集合做最后的统计工作(与业务逻辑相关),并把执行结果按照键值对写入最后的输出文件中;

   G、 所有reduce运行结束,正常退出exit(0);

注:

   A、 整个过程:从Job设置的输入文件读取了大数据,进行分布式运算之后,再将执行结果输出到Job设置的输出文件当中,其他需要这个输出结果的程序可以直接在HDFS当中获得这个执行结果数据。

   B、 分布式程序的执行结果其实是存在于一个文件夹中的:

_SUCCESS:这个空文件表示执行成功

     part-r-00000:part结果文件,会有多个, Job中设定执行这个任务的reduce节点机器数量,一个节点就会产生一个part文件,所有这些文件的集合就是这个分布式程序的总执行结果。

本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/article/2016/05/31/MapReduce
1 程序开发/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息