MapReduce原理分析

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

HDFS理解

(底层存储)分布式存储,将庞大的任务进行分散到各个节点上,每个节点负责一小部分,处理起来更加方便。
HDFS底层依赖-----方便计算衍生出各种计算的东西-----到大数据发展到现在的技术的生态圈。

MapReduce

MapReduce是hadoop的核心组件之一,hadoop要实现分布式需要包括两部分,一部分是分布式文件系统hdfs,一部分是分布式计算框架mapreduce

原理解释:
在此引用一下奋斗的小炎这个例子,简单易懂

我问妻子:“你真的想要弄懂什么是MapReduce?” 她很坚定的回答说“是的”。 我:
你是如何准备洋葱辣椒酱的?(以下并非准确食谱,请勿在家尝试) 妻子:
我会取一个洋葱,把它切碎,然后拌入盐和水,最后放进混合研磨机里研磨。这样就能得到洋葱辣椒酱了。但这和MapReduce有什么关系? 我:
你等一下。让我来编一个完整的情节,这样你肯定可以在15分钟内弄懂MapReduce。 妻子: 好吧。
我:现在,假设你想用薄荷、洋葱、番茄、辣椒、大蒜弄一瓶混合辣椒酱。你会怎么做呢? 妻子:
我会取薄荷叶一撮,洋葱一个,番茄一个,辣椒一根,大蒜一根,切碎后加入适量的盐和水,再放入混合研磨机里研磨,这样你就可以得到一瓶混合辣椒酱了。
我: 没错,让我们把MapReduce的概念应用到食谱上。Map和Reduce其实是两种操作,我来给你详细讲解下。Map(映射)
把洋葱、番茄、辣椒和大蒜切碎,是各自作用在这些物体上的一个Map操作。所以你给Map一个洋葱,Map就会把洋葱切碎。
同样的,你把辣椒,大蒜和番茄一一地拿给Map,你也会得到各种碎块。 所以,当你在切像洋葱这样的蔬菜时,你执行就是一个Map操作。
Map操作适用于每一种蔬菜,它会相应地生产出一种或多种碎块,在我们的例子中生产的是蔬菜块。在Map操作中可能会出现有个洋葱坏掉了的情况,你只要把坏洋葱丢了就行了。所以,如果出现坏洋葱了,Map操作就会过滤掉坏洋葱而不会生产出任何的坏洋葱块。Reduce(化简)这一阶段,你将各种蔬菜碎都放入研磨机里进行研磨,你就可以得到一瓶辣椒酱了。这意味要制成一瓶辣椒酱,你需要研磨所有的原料。因此,研磨机通常将map操作的蔬菜碎聚集在了一起。

妻子: 所以,这就是MapReduce? 我: 你可以说是,也可以说不是。
其实这只是MapReduce的一部分,MapReduce的强大在于分布式计算。 妻子: 分布式计算? 那是什么?请给我解释下吧。 我:
假设你参加了一个辣椒酱比赛并且你的食谱赢得了最佳辣椒酱奖。得奖之后,辣椒酱食谱大受欢迎,于是你想要开始出售自制品牌的辣椒酱。假设你每天需要生产10000瓶辣椒酱,你会怎么办呢?
妻子: 我会找一个能为我大量提供原料的供应商。 我:是的,就是那样的。那你能否独自完成制作呢?也就是说,独自将原料都切碎?
仅仅一部研磨机又是否能满足需要?而且现在,我们还需要供应不同种类的辣椒酱,像洋葱辣椒酱、青椒辣椒酱、番茄辣椒酱等等。 妻子:
当然不能了,我会雇佣更多的工人来切蔬菜。我还需要更多的研磨机,这样我就可以更快地生产辣椒酱了。
我:没错,所以现在你就不得不分配工作了,你将需要几个人一起切蔬菜。每个人都要处理满满一袋的蔬菜,而每一个人都相当于在执行一个简单的Map操作。每一个人都将不断地从袋子里拿出蔬菜来,并且每次只对一种蔬菜进行处理,也就是将它们切碎,直到袋子空了为止。这样,当所有的工人都切完,工作台上就有了洋葱块、番茄块、和蒜蓉等等。
妻子:但是我怎么会制造出不同种类的番茄酱呢?
我:现在你会看到MapReduce遗漏的阶段——搅拌。MapReduce将所有输出的蔬菜碎都搅拌在了一起,这些蔬菜碎都是在以key为基础的map操作下产生的。搅拌将自动完成,你可以假设key是一种原料的名字,就像洋葱一样。
所以全部的洋葱keys都会搅拌在一起,并转移到研磨洋葱的研磨器里。这样,你就能得到洋葱辣椒酱了。同样地,所有的番茄也会被转移到标记着番茄的研磨器里,并制造出番茄辣椒酱。

图片解释
在这里插入图片描述
第一步:数据先发过来,将计算程序分发
第二步:提前先对数据进行清洗------去除脏数据
第三步:提前进行一次小的聚合
第四步:将小聚合之后的数据连通剩余的数据进行运输(shuffle)-----最影响效率,最浪费时间
第五步:在Reduce进行一个大合并,也就是最后一次合并
简而言之:
1.数据进行切片
2.开始计算
2.1寻找过程–磁盘
2.1计算过程–内存
2.3结果 --磁盘
Map
相当于一个处理把数据有序发送
Suffle
相当于管道,传输数据
Reduce
相当于工厂,把数据整理成一个有序的,或者是最直后的成品
代码解释
1、1、新建项目—MapReduce Project
2、把lib删除,更换成jar包
3. 有一个权限问题 导入我的nativeio包到src-----消除权限冲突 ***********重点
4、开始编写代码
wordcount
4.1创建map和reduce类-----有直接对应的方法创建
4.2创建执行类—job
(1)Map

  • mapreduce程序中map端在读取数据的时候,默认每一次读一行 long string string int
  • 在mapreduce中原有的java类型是在数据传输中不能使用 ,需要使用其封装类 LongWritable
  • context作用是连接map端和reduce端程序的连接点,输出的数据需要通道context写到磁盘中

public class Mapper extends org.apache.hadoop.mapreduce.Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable ikey, Text value, Context context) throws IOException, InterruptedException {
String[] st = value.toString().split(" ");//文件切割
for(int i=0;i<st.length;i++){
context.write(word, one);//进行文件的传输
}
}
}
(2)Reduce
public class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
// process values
int sum=0;
for (IntWritable i:values) {
sum+=i.get();
}
context.write(key, new IntWritable(sum));
}
}
(3)Job

public class Job1 {
public static void main(String[] args) throws Exception {
System.setProperty(“HADOOP_USER_NAME”, “root”);
Configuration conf=new Configuration();
conf.set(“fs.defaultFS”, “hdfs://192.168.110.131:9000”);
Job job = Job.getInstance(conf);
job.setJobName(“wc2Job”);
job.setJarByClass(Job1.class);
job.setMapperClass(Mapper.class);
job.setReducerClass(Reduce.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//设置需要计算的输入文件路径
FileInputFormat.setInputPaths(job, new Path(“hdfs://192.168.110.131:9000/user/root/abc.txt”));
FileOutputFormat.setOutputPath(job, new Path(“hdfs://192.168.110.131:9000/user/root1”));
//System.exit(job.waitForCompletion(true) ? 0 : 1);
boolean zt=job.waitForCompletion(true);
if(zt){
System.out.println(“执行成功”);
}
}
}

Job 1、配置文件
2、将类方法写入
3、input和output的路径
4、boolean zt=job.waitForCompletion(true);判断是否执行

猜你喜欢

转载自blog.csdn.net/power_k/article/details/92006410
今日推荐