大数据学习-Hadoop生态章---(三)MapReduce

大数据学习-Hadoop生态章


(三) MapReduce

3.1.MapReduce是什么?

MapReduce是一种分布式的离线计算框架,是一种编程模型,用于大规模数据集(大于1TB)的并行运算。
将自己的程序运行在分布式系统上。
概念是:"Map(映射)“和"Reduce(归约)”。指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组
可应用于大规模的算法图形处理、文字处理

以上所述具体体现了Mapreduce–设计理念与思想(分与合

3.2.MapReduce的设计理念

3.2.1.分布式计算

分布式计算将该应用分解成许多小的部分,分配给多台计算机节点进行处理。这样可以节约整体计算时间,大大提高计算效率。

3.2.2.移动计算,而不是移动数据

移动计算是随着移动通信、互联网、数据库、分布式计算等技术的发展而兴起的新技术。
移动计算它的作用是将有用、准确、及时的信息提供给任何时间、任何地点的任何客户(这里我们说的是将计算程序应用移动到具有数据的集群计算机节点之上进行计算操作)。

3.3.MapReduce计算框架的组成(总览)

大数据学习-Hadoop生态章---(三)MapReduce_第1张图片

3.3.1.Mapper详解(分)

– Mapper负责“”,即把得到的复杂的任务分解为若干个“简单的任务”执行。
简单的任务”有几个含义:

  1. 数据或计算规模相对于原任务要大大缩小;
  2. 就近计算,即会被分配到存放了所需数据的节点进行计算;
  3. 这些小任务可以并行计算,彼此间几乎没有依赖关系
    大数据学习-Hadoop生态章---(三)MapReduce_第2张图片
    Split规则:
  • max.split(100M)
  • min.split(10M)
  • block(64M)
max(min.split,min(max.split,block))

split实际=block大小
Map的数目通常是由输入数据的大小决定的,一般就是所有输入文件的总块(block)数

3.3.2.Reduce详解(总)

– Reduce的任务是对map阶段的结果进行“汇总”并输出。
Reducer的数目由mapred-site.xml配置文件里的项目mapred.reduce.tasks决定。缺省值为1,用户可以覆盖之。
大数据学习-Hadoop生态章---(三)MapReduce_第3张图片
Reduce的数目建议:

0.95/1.75乘( mapred.tasktracker.reduce.tasks.maximum)。

用0.95,所有reduce可以在maps一完成时就立刻启动,开始传输map的输出结果。
用1.75,速度快的节点可以在完成第一轮reduce任务后,可以开始第二轮,这样可以得到比较好的负载均衡的效果。

增加reduce的数目会增加整个框架的开销,但可以改善负载均衡,降低由于执行失败带来的负面影响。

3.3.3.Shuffle详解(总)

  • 在mapper和reducer中间的一个步骤,Shuffle包含在 reducer中(可参看源码验证)
    可以把mapper的输出按照某种key值重新切分和组合成n份,把key值符合某种范围的输出送到特定的reducer那里去处理。
  • 可以简化reducer过程
    Partitoner : hash(key) mod R (给key 取模)

3.4.整个MR计算框架详细图解

大数据学习-Hadoop生态章---(三)MapReduce_第4张图片

3.5.MR架构

一主多从架构

  • 主 JobTracker:(RM)

负责调度分配每一个子任务task运行于TaskTracker上,如果发现有失败的task就重新分配其任务到其他节点。每一个hadoop集群中只一个 JobTracker, 一般它运行在Master节点上

  • 从TaskTracker:(NM)

TaskTracker主动与JobTracker通信,接收作业,并负责直接执行每一个MapTask/ReduceTask任务,为了减少网络带宽TaskTracker最好运行在HDFS的DataNode上

3.5.MapReduce安装

大数据学习-Hadoop生态章---(三)MapReduce_第5张图片
参考HA高可用配置,在基础上修改相关配置。
注意:停掉HA集群,之后修改配置
大数据学习-Hadoop生态章---(三)MapReduce_第6张图片
修改配置文件:
mapred-site.xml:
(如果没有该文件,新建一个。或将模版文件mapred-site.xml.template修改成这个文件)
在这里插入图片描述


    
        mapreduce.framework.name
        yarn
    

yarn-site.xml:


    
        yarn.nodemanager.aux-services
        mapreduce_shuffle
    

ResourceManager 和NodeManager主从结构
RS存在单点故障问题 所以要对他做HA高可用, 通过zk配置


	yarn.nodemanager.aux-services
	mapreduce_shuffle


	yarn.resourcemanager.ha.enabled
	true


 	yarn.resourcemanager.cluster-id
	mr_qiaoke


	yarn.resourcemanager.ha.rm-ids
	rm1,rm2


	yarn.resourcemanager.hostname.rm1
	node02


	yarn.resourcemanager.hostname.rm2
	node03
 

	yarn.resourcemanager.zk-address
	node01:2181,node02:2181,node03:2181

2个配置文件发到其他2个hadhoop节点
在这里插入图片描述

启动测试:
先开启
ZooKeeper(我这里3台)
在这里插入图片描述

启动hadoop:
大数据学习-Hadoop生态章---(三)MapReduce_第7张图片
开启resourcemanager: (我这里2台,node02,node03)
指令 :yarn-daemon.sh start resourcemanager
在这里插入图片描述

3.6.实战

以 单词统计(包含读写HDFS上数据) 为例

  1. WordCountJob.java 工作任务

    public class WordCountJob {
    	public static void main(String[] args) throws IOException {
    		/**
    		 * 1.设置环境变量
    		 */
    		Configuration configuration = new Configuration();
    		// Hadoop访问配置
    		configuration.set("fs.defaultFS", "hdfs://node02:8020");
    		// ResourceManager访问配置
    		configuration.set("yarn.resourcemanager.hostname", "http://node02:8088");
    		/**
    		 * 2.设置job任务 的相关信息
    		 */
    		Job job = Job.getInstance(configuration);
    		job.setJarByClass(WordCountJob.class);
    		job.setJobName("worldC");
    
    		// 设置 mapper继承类 反射
    		job.setMapperClass(MapWordCount.class);
    		// 设置 reducer继承类 反射
    		job.setReducerClass(ReduceWordCount.class);
    
    		// 设置Map 输出key值类型 反射
    		job.setMapOutputKeyClass(Text.class);
    		// 设置Map 输出value值类型 反射
    		job.setMapOutputValueClass(IntWritable.class);
    
    		/**
    		 * 3.输入数据文件 (读取HDFS上文件)
    		 */
    		FileInputFormat.addInputPaths(job, "/WorldCount/test.txt");
    
    		/**
    		 * 4.输出结果到指定地方
    		 */
    		Path path = new Path("/WorldCount/output");
    		FileSystem fSystem = FileSystem.get(configuration);
    		if (fSystem.exists(path)) {
    			fSystem.delete(path, true);
    		}
    		FileOutputFormat.setOutputPath(job, path);
    
    		/**
    		 * 5.结束
    		 */
    		boolean f;
    		try {
    			//
    			f = job.waitForCompletion(true);
    			if (f) {
    				System.out.println("job 成功。。");
    			} else {
    				System.out.println("----------");
    			}
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    	}
    }
    
  2. MapWordCount.java 继承Mapper的类

    public class MapWordCount extends Mapper {
    	@Override
    	protected void map(LongWritable key, Text value, Context context)
    		throws IOException, InterruptedException {
    	
    	String line = value.toString();
    	StringTokenizer words = new StringTokenizer(line);
    	while(words.hasMoreTokens()){
    		context.write(new Text(words.nextToken()), new IntWritable(1));
    	}
    	
    	}
    }
    
  3. ReduceWordCount.java 继承Reducer的类

    public class ReduceWordCount extends Reducer {
    	@Override
    	protected void reduce(Text words, Iterable values, Context context)
    		throws IOException, InterruptedException {
    
    	int sum = 0 ;
    	for(IntWritable v:values){
    		sum += v.get();
    	}
    	context.write(words, new IntWritable(sum));
    	}
    }
    

你可能感兴趣的:(个人学习,总结资料)