MapRedcue的初始和工作原理和eclipse代码实现

MapReduce的认识

MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算,概念“Map(映射)”和“Reduce (归约)”,是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性,它极大地方便了编程人员在不会分布式并行编程地情况下,将自己的程序运行在分布式系统上,当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中每一个共享相同的健组;

MapReduce工作原理

MapReduce程序的工作分两个阶段进行:

	 1.Map阶段


	
     2.Reduce 阶段



输入到每一个阶段均是键 - 值对。此外,每一个程序员需要指定两个函数:map函数和reduce函数

整个过程要经历三个阶段执行,即

MapReduce如何工作

让我们用一个例子来理解这一点 –

假设有以下的输入数据到 MapReduce 程序,统计以下数据中的单词数量:

Welcome to Hadoop Class

Hadoop is good

Hadoop is bad

在这里插入图片描述
输入拆分:

输入到MapReduce工作被划分成固定大小的块叫做 input splits ,输入折分是由单个映射消费输入块。

映射 - Mapping

这是在 map-reduce 程序执行的第一个阶段。在这个阶段中的每个分割的数据被传递给映射函数来产生输出值。在我们的例子中,映射阶段的任务是计算输入分割出现每个单词的数量(更多详细信息有关输入分割在下面给出)并编制以某一形式列表<单词,出现频率>

重排

这个阶段消耗映射阶段的输出。它的任务是合并映射阶段输出的相关记录。在我们的例子,同样的词汇以及它们各自出现频率。

Reducing

在这一阶段,从重排阶段输出值汇总。这个阶段结合来自重排阶段值,并返回一个输出值。总之,这一阶段汇总了完整的数据集。

在我们的例子中,这个阶段汇总来自重排阶段的值,计算每个单词出现次数的总和。

详细的整个过程


	
		映射的任务是为每个分割创建在分割每条记录执行映射的函数。


	
		有多个分割是好处的, 因为处理一个分割使用的时间相比整个输入的处理的时间要少, 当分割比较小时,处理负载平衡是比较好的,因为我们正在并行地处理分割。


	
		然而,也不希望分割的规模太小。当分割太小,管理分割和映射创建任务的超负荷开始逐步控制总的作业执行时间。


	
		对于大多数作业,最好是分割成大小等于一个HDFS块的大小(这是64 MB,默认情况下)。


	
		map任务执行结果到输出写入到本地磁盘的各个节点上,而不是HDFS。


	
		之所以选择本地磁盘而不是HDFS是因为,避免复制其中发生 HDFS 存储操作。


	
		映射输出是由减少任务处理以产生最终的输出中间输出。


	
		一旦任务完成,映射输出可以扔掉了。所以,复制并将其存储在HDFS变得大材小用。


	
		在节点故障的映射输出之前,由 reduce 任务消耗,Hadoop 重新运行另一个节点在映射上的任务,并重新创建的映射输出。


	减少任务不会在数据局部性的概念上工作。每个map任务的输出被供给到 reduce 任务。映射输出被传输至计算机,其中 reduce 任务正在运行。

	在此机器输出合并,然后传递到用户定义的 reduce 函数。

	不像到映射输出,reduce输出存储在HDFS(第一个副本被存储在本地节点上,其他副本被存储于偏离机架的节点)

MapReduce如何组织工作

Hadoop 划分工作为任务。有两种类型的任务:

	1.	Map 任务 (分割及映射)


	
	2.	Reduce 任务 (重排,还原)



如上所述

完整的执行流程(执行 Map 和 Reduce 任务)是由两种类型的实体的控制,称为


	
		Jobtracker : 就像一个主(负责提交的作业完全执行)


	
		多任务跟踪器 : 充当角色就像从机,它们每个执行工作



对于每一项工作提交执行在系统中,有一个 JobTracker 驻留在 Namenode 和 Datanode 驻留多个 TaskTracker

在这里插入图片描述

作业被分成多个任务,然后运行到集群中的多个数据节点。

		JobTracker的责任是协调活动调度任务来在不同的数据节点上运行。


	
		单个任务的执行,然后由 TaskTracker 处理,它位于执行工作的一部分,在每个数据节点上。


	
		TaskTracker 的责任是发送进度报告到JobTracker。


	
		此外,TaskTracker 周期性地发送“心跳”信号信息给 JobTracker 以便通知系统它的当前状态。


	
		这样 JobTracker 就可以跟踪每项工作的总体进度。在任务失败的情况下,JobTracker 可以在不同的 TaskTracker 重新调度它

Eclipse代码实现wordconunt

1 实现创建一个MapReduce工程
2.直接创建Mapper类,mapper类主要负责数据切割发送到Reduce类中

package com.hpe.wc;

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Mapper.Context;

public class Mappera extends Mapper<LongWritable, Text, Text, IntWritable> {
 
	//定义一个写死的常量1
	private final static IntWritable one = new IntWritable(1);
	//定义一个文本
	private Text word = new Text();
	
	public void map(LongWritable key, Text value,Context context) throws IOException, InterruptedException {
		//把传过来的数据进行切割
		String[] st = value.toString().split(" ");//st[0] --> nihao st[1] -->beijing
		//进行for循环把值传进去
		for(int i=0;i<st.length;i++){
	    //往Reduce里面传送
        context.write(word, one);
        System.out.println(word);

		}}
}

2.创建reduce类,用于合并以及接受Mapper发来的数据

package com.hpe.wc;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.Reducer.Context;



public class Reduce1 extends Reducer<Text,IntWritable,Text,IntWritable> {

	@Override
	protected void reduce(Text key, Iterable<IntWritable> values,Context context)
			throws IOException, InterruptedException {
	   int sum=0;
	   for(IntWritable i:values){
		   //接受一行的值并相加
		   sum+=i.get();
	   }
	   //发送到hdfs中
	   context.write(key, new IntWritable(sum));
	}

}

3.中间启动类Job代码

package com.hpe.wc;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class Job1 {
	
	public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
		//System.setProperty("HADOOP_USER_NAME", "root");
		//new一个配置文件
		Configuration conf = new Configuration();
		//conf.set("fs.defaultFS", "hdfs://192.168.241.129:9000");
		//conf.set("dfs.permissions","false");
		//加载配置文件
		Job job= Job.getInstance(conf);
		//设置进程的名称
		job.setJobName("zhouge");
		//把自己当成jar包发送到集群中
		job.setJarByClass(Job1.class);
		//启动mapper类
		job.setMapperClass(Mappera.class);
		//启动Reduce类
		job.setReducerClass(Reduce1.class);
		//设置map输出的key
		job.setMapOutputKeyClass(Text.class);
		//设置map输出的值
		job.setMapOutputValueClass(IntWritable.class);
		System.out.println("------------");
		//设置输入的配置文件
		FileInputFormat.setInputPaths(job, new Path("a.txt"));
		System.out.println("------------");
		//设置输出的配置文件
		FileOutputFormat.setOutputPath(job, new Path("qq1"));
		System.out.println("------------");
		//执行所有
		boolean b = job.waitForCompletion(true);
		System.out.println(b+"------------");
		if(b) {
			System.out.println("执行成功");//周哥牛逼
		}
	}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值