大数据-Hadoop学习笔记09
来源:互联网 发布:美分知乎 编辑:程序博客网 时间:2024/05/22 14:13
30.MapReduce
mapreduce任务过程分为两个处理阶段:map阶段和reduce阶段。每个阶段都以k-v对作为输入和输出,其类型由开发者选择。 map阶段的输入时NCDC原始数据。我们选择文本格式作为输入格式,将数据集的每一行作为文本输入。1.编写MR程序【创建mapper】
public class MyMaxTempMapper extends Mapper<LongWritable, Text, Text, IntWritable>{ private static final int MISSING = 9999; /** * mapper */ @Override protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException { //value String String line = value.toString(); //提取年份 String year = line.substring(15, 19); //提取气温 int airTemperature; if (line.charAt(87) == '+') { airTemperature = Integer.parseInt(line.substring(88, 92)); } else { airTemperature = Integer.parseInt(line.substring(87, 92)); } //质量 String quality = line.substring(92, 93); //判断气温的有效性 if (airTemperature != MISSING && quality.matches("[01459]")) { context.write(new Text(year), new IntWritable(airTemperature)); } }}
【创建Reducer】
public class MyMaxTempReducer extends Reducer<Text, IntWritable, Text, IntWritable>{ @Override protected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException { //定义一个最小值 int maxValue = Integer.MIN_VALUE; //提取年度最高气温 for(IntWritable value : values) { maxValue = Math.max(maxValue, value.get()); } //写入输出 context.write(key, new IntWritable(maxValue)); }}
【创建app运行作业】
public class MyMaxTempApp { public static void main(String[] args) throws Exception { if (args.length != 2) { System.out.println("Usage: MaxTemperature <input path> <output path>"); System.exit(1); } Job job = Job.getInstance(); job.setJarByClass(MyMaxTempApp.class); //设置作业名称 job.setJobName("Max temp"); //输入路径 FileInputFormat.addInputPath(job, new Path(args[0])); //输出路径 FileOutputFormat.setOutputPath(job, new Path(args[1])); //设置mapper类型 job.setMapperClass(MyMaxTempMapper.class); //设置reducer类型 job.setReducerClass(MyMaxTempReducer.class); //设置对应输出key的类型 job.setOutputKeyClass(Text.class); //设置对应输出value的类型 job.setOutputValueClass(IntWritable.class); //开始执行job System.out.println(job.waitForCompletion(true) ? 0 : 1); }}
31.Job提交过程分析
【编程模型】 map(映射) + reduce(化简)【调用流程】 1.job.waitForCompletion() 2.submit()提交作业给cluster,并等待完成 a)ensureState(JobState.DEFINE)确保状态 b)setUseNewAPI()使用新型API c)connect()创建集群对象 d)创建JobSubmitter 3.submitter.submitJobInternal(Job.this, cluster) a)checkSpecs(job)检查输出目录,已存在则出异常 b)JobSubmissionFiles.getStagingDir()建立hdfs的临时目录 c)InetAddress.getLocalHost()取得本地ip d)submitClient.getNewJobID()创建作业id e)copyAndConfigureFiles()使用命令行参数设置conf信息 f)writeSplits(job, submitJobDir)在临时目录下产生创建切片文件 g)conf.setInt(MRJobConfig.NUM_MAPS, maps)设置map数量 h)writeConf(conf, submitJobFile)提交job.xml到提交目录 i)submitClient.submitJob()通过执行器提交作 4.submitClient.submitJob()通过执行器提交作业 a)Job job = new Job()创建LocalJobRunner.Job内部类对象 5.Job job = new Job() a)通过临时目录下job.xml创建JobConf b)this.start()启动线程,即调用run()方法 6.this.start() a)TaskSplitMetaInfo[]获取task切片信息 b)getMapTaskRunnables()得到mapper对应的runnable c)runTasks(mapRunnables, mapService, "map") d)getReduceTaskRunnables()得到reduce的任务数 e)runTasks(reduceRunnables, reduceService, "reduce") 7.runTasks() for (Runnable r : runnables) { service.submit(r); } 8.LocalJobRunner$Job$MapTaskRunnable a)创建MapAttempId b)创建MapTask c)创建MaoOutFile d)map.setXXX() e)map.run() f) 9.org.apache.hadoop.mapred.MapTask$run() a)runNewMapper() 10.runNewMapper a)创建taskContext b)taskContext.getMapperClass()用反射拿到Mapper对象 c)创建InputFormat d)创建split e)创建NewOutputCollector即context对象 11.mapper.run(mapperContext) 12.MyMaxTempMapper$run() setup(context); try { while (context.nextKeyValue()) { map(...) } } finally { cleanup() }【提交作业至集群】 编译打包后,在集群中通过 hadoop jar jarFile classname arg1 arg2 .. 进行作业的提交
0 0
- 大数据-Hadoop学习笔记09
- 大数据之hadoop[MapReduce]学习 笔记
- 大数据-Hadoop学习笔记01
- 大数据-Hadoop学习笔记02
- 大数据-Hadoop学习笔记03
- 大数据-Hadoop学习笔记04
- 大数据-Hadoop学习笔记05
- 大数据-Hadoop学习笔记07
- 大数据-Hadoop学习笔记08
- 大数据-Hadoop学习笔记10
- 大数据hadoop学习
- 大数据与Hadoop简单入门[学习笔记]
- 大数据学习笔记1--hadoop简介和入门
- 大数据学习笔记之二十七 Hadoop的HBase
- 大数据学习笔记:配置windows下的hadoop
- 大数据学习笔记:启动脚本分析,hadoop.cmd
- 大数据学习笔记:Hadoop中的IPC与RPC
- Hadoop大数据平台架构与实践学习笔记
- IOS CollectionView 拖拽移动
- Activity 的启动模式
- Linux内核系统调用的添加
- GRAN论文翻译
- 【Linux】File 结构体,和 fd 的关系
- 大数据-Hadoop学习笔记09
- 归并排序
- spring中bean的配置
- 学习笔记之SharedPreference问题解答
- HDU
- IOS 动态获取键盘高度
- 使用DocumentFragment加快DOM渲染速度
- 大数据系列-scala类型定义
- 【数据结构】——-树和二叉树(一)