本周,主要干的事就是去给初二初三的补课,从三点补到八点,每天上课时间五个小时,再加上两个多小时的备课时间,讲的主要是初二的物理数学,初三的数学物理化学,很认真的讲课和准备,用一周基本把每一科的一章讲完了,有点累,不过还行,主要每一科上50分钟,小孩也还蛮有意思,然后我也有准备课程的记录:分为讲课的内容和练习册,每天上课先把练习册的提讲了,在讲一节的新课,在跳几道题做做,剩下留作作业,然后还挺紧张,不过毕竟是初中的课程,除了数学要简单推一下,剩下就直接原理,哦,还有物理的电很无语,可能我讲的也不太好吧。
记录下备课得内容:
然后也抽空对大数据学习了下,学的是mapreduce,学的怎么样呢,会用吗,只会用他那个案例,还是背下来的,而且,以前觉得程序会用就行,但是我觉得大数据不一样,他是真的在讲源码,我是真的不动,目前就知道了mapreduce是什么,案例照着敲了下,反正最后学成啥算啥吧,至于源码,听不懂,怎么用,就明白了案例,然后我还觉得甚至都不用他给的程序,感觉是一个编程题,主要想表达的不知道学的是啥东西,不知道怎么用。
一、MapReduce概述
1、定义
MapReduce 是一个分布式运算程序的编程框架,是用户开发“基于 Hadoop 的数据分析
应用”的核心框架。
MapReduce 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的
分布式运算程序,并发运行在一个 Hadoop 集群上。
2、优势劣势
优点:
MapReduce 易于编程:它简单的实现一些接口,就可以完成一个分布式程序
良好的扩展性:当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力。
高容错性:如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,
不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由 Hadoop 内部完成的。
适合 PB 级以上海量数据的离线处理:可以实现上千台服务器集群并发工作,提供数据处理能力。
缺点:
不擅长实时计算
不擅长流式计算:流式计算的输入数据是动态的,而 MapReduce 的输入数据集是静态的,不能动态变化。 这是因为 MapReduce 自身的设计特点决定了数据源必须是静态的。
不擅长 DAG(有向无环图)计算:多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下, MapReduce 并不是不能做,而是使用后,每个 MapReduce 作业的输出结果都会写入到磁盘, 会造成大量的磁盘 IO,导致性能非常的低下。
3、WordCount案例
核心思想:
(1)分布式的运算程序往往需要分成至少 2 个阶段。
(2)第一个阶段的 MapTask 并发实例,完全并行运行,互不相干。
(3)第二个阶段的 ReduceTask 并发实例互不相干,但是他们的数据依赖于上一个阶段
的所有 MapTask 并发实例的输出。
(4)MapReduce 编程模型只能包含一个 Map 阶段和一个 Reduce 阶段,如果用户的业
务逻辑非常复杂,那就只能多个 MapReduce 程序,串行运行。
总结:分析 WordCount 数据流走向深入理解 MapReduce 核心思想
二、序列化
常用数据序列化类型
MapReduce 编程规范
Mapper阶段
(1)用户自定义的Mapper要继承自己的父类
(2)Mapper的输入数据是KV对的形式(KV的类型可自定义)
(3)Mapper中的业务逻辑写在map()方法中
(4)Mapper的输出数据是KV对的形式(KV的类型可自定义)
(5)map()方法(MapTask进程)对每一个<K,V>调用一次
Reducer阶段
(1)用户自定义的Reducer要继承自己的父类
(2)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV
(3)Reducer的业务逻辑写在reduce()方法中
(4)ReduceTask进程对每一组相同k的<k,v>组调用一次reduce()方法
Driver阶段
相当于YARN集群的客户端,用于提交我们整个程序到YARN集群,提交的是
封装了MapReduce程序相关运行参数的job对象
利用这个案例编写了几个程序:
public class WordCountDriver { public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException { //1获取job Configuration configuration = new Configuration(); Job job = Job.getInstance(configuration); //2获取jar包路径 job.setJarByClass(WordCountDriver.class); //3关联mapper和reducer job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); //4设置map的kv类型 job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class); //5设置最终输出的KV类型 job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); //6设置输入路径和输出路径 FileInputFormat.setInputPaths(job,new Path("D:\\input\\inputword")); FileOutputFormat.setOutputPath(job,new Path("D:\\output\\output2")); //7提交job boolean result = job.waitForCompletion(true); System.exit(result?0:1); } }
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
private Text outK = new Text();
private IntWritable outV = new IntWritable(1);
@Override
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
//获取一行
String line = value.toString();
//进行切割
String[] words = line.split(" ");
//循环写出
for (String word : words) {
//封装
outK.set(word);
//写出
context.write(outK,outV);
}
}
}
public class WordCountReducer extends Reducer<Text, IntWritable,Text,IntWritable> {
private IntWritable outV = new IntWritable();
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
int sum = 0;
//atguigu,(1,1)
// 累加
for (IntWritable value : values) {
sum += value.get();
}
outV.set(sum);
context.write(key,outV);
}
}
//放一个块里了
学的很难受,主要一点成就感都没,不知道干啥,ok,备课去了。
标签:总结,Mapper,IntWritable,假期,MapReduce,第六周,job,new,class From: https://www.cnblogs.com/JIANGzihao0222/p/17592074.html