初识MR 初识YARN 初识ZooKeeper

学习目标:

  1. 初识MR
  2. 初识YARN
  3. 初识ZooKeeper

学习内容:

MR(MapReduce)

  • 什么是MR

      一个并行计算框架,将一个大文件拆分成一个个小任务,使执行更加效率。适合于大数据计算
    
  • MR的执行过程

         a. 当用户输入计算任务时,MR会将任务分成一个个小的任务块,(一般情况下map所处理的文件都在HDFS本地,原因是为了减少网络间的传送)
         b.将每个任务块分给不同的map任务,开始运行Map   进行一次次的迭代,每迭代一次,创建一个key/value对(一行一行的读取数据,默认情况下以行号为 Key,以行内容为 value)
     	 c. 当Map执行完,而后由内置的shuffle机制,以key为值,进行一次归并操作,创建一个新的 key/values 对
     	 d 当shuffle执行而后交给 Reduce进行归并排序操作,最终可以通过迭代操作,实现 key/value的持久化操作
    
  • 大数据排序:MR中三个阶段可进行排序

     a. Map阶段:局部排序,只是排本块中的数据
     b. Reduce阶段:有局限性,只能在Reduce并发度为 1 的情况下进行全局排序
     c. shuffle阶段:推荐,默认进行hash排序
    
  • 自定义排序规则,需要实现 WritableComparable接口 和Java中 排序规则类似,注意,需要在自定义类里实现 hashCode() 和 equals()方法

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 自定义分区阶段

     a.通过设置分区规则,让数据有规律的分成想要分成的几个部分,需要与Reduce的并发度配合    
     b.默认分区规则按照HashPartitioner进行
     c.自定义分区规则需要实现 Partitioner接口,返回值为整数,通常有几个返回值,确定几个分区
    

在这里插入图片描述
在这里插入图片描述

  • Combiner

      又称 本地Reduce,当Map分区过多时,可以先进行一次本地 reduce,减少本地的map个数,降低网络拥堵(可以应用于求最大值的应用)
    

在这里插入图片描述

YARN

  • 什么是YARN

     YARN:提供了一套通用的大数据作业的执行平台,可兼容第三方的计算框架,如 spark等
    
  • YARN的工作原理

     YARN总体上采用了 主从结构,其中,主节点被称为 ResouceManger,从节点采用
     了nodeManager,ResourceManager为NodeManager进行资源的分配和调度,当
     客户端提交了计算任务后,ResourceManager会从NodeManager会选中一定数量的
     NodeManager,并从其中选出一个ApplicationMaster,它负责向ResourceManger
     申请资源,并管理该计算任务中的其他NodeManager,直到计算任务结束,该	
     ApplicationManager将消失
    
  • 与YARN相关的配置文件

     启用YARN需要配置两份文件 yarn-site.xml  和 mapred-site.xm
    

ZooKeeper

  • 什么是ZooKeeper

    是一个分布式的,开放源码的分布式应用程序协调服务,最初设计是为了解决Hadoop的单点故障的,后来扩展了许多新应用
    
  • ZooKeeper/Redis的联系与区别

       Redis:分布式缓存(缓存:在自己的电脑内存里帮助别人存储数据)
       ZooKeeper:和Redis的功能类似,但最初的设计目标是为了协调Hadoop的masters之间的关系
    
  • ZooKeeper可解决一些常见问题

     a. 通用分布锁服务:解决分布式集群中的共享锁问题
     b. 统一命名服务
     c. 配置管理服务,项目中的配置信息
     d. 集群管理服务
     e. 支持队列管理
    
  • ZooKeeper基础架构

     a. 当集群中,存活的主机个数大于集群总数半数时,表示集群有效
     b. 为了提高效率,一般都会将集群数设置为奇数个
    
  • ZooKeeper特性:

     a. ZK的存储结构:树结构(类似于DOM树或者文件树结构),基本存储单位为node
     b. ZK集群中,保证同时只能有一个管理机存在(leader)
     c. 写数据时,如果超过一半的机器写入成功,leader则认定写入成功
     d. ZK数据实时同步,提供全局唯一数据视图,无论哪里写入,均保持读写一致
     e. 主机选举,基于3888端口,得票数多的即为新的leader
    

学习时间:

2021.4.19——2021.4.24

学习产出:

	求尿不湿与啤酒的关联度
data.txt内容:

	啤酒 香烟 尿不湿 
	苹果 辣条 方便面 
	啤酒 尿不湿 苹果
	辣条 方便面
	耳机 苹果
	苹果 方便面 脸盆 牙刷
	啤酒 香烟
	尿不湿 苹果 脸盆 牙刷
	辣条 方便面



package cn.nihuan004;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class MRDriver004 {

	public static void main(String[] args) throws Exception {
		Path src = new Path("hdfs://nihuan001/date/data.txt");
		Path dst = new Path("hdfs://nihuan001/date/out");
		Configuration conf = new Configuration();
		FileSystem fSystem = FileSystem.get(conf);
		
		if(fSystem.exists(dst)) {
			fSystem.delete(dst, true);
		}
		Job job = Job.getInstance(conf, "啤酒与尿不湿");
		job.setJarByClass(cn.nihuan004.MRDriver004.class);
		job.setMapperClass(Map004.class);
		job.setReducerClass(Reduce004.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);

		// TODO: specify input and output DIRECTORIES (not files)
		FileInputFormat.setInputPaths(job, src);
		FileOutputFormat.setOutputPath(job, dst);

		if (!job.waitForCompletion(true))
			return;
	}

}

class Map004 extends Mapper<LongWritable, Text , Text, Text>{

	@Override
	protected void map(LongWritable key, Text value,Context context)
			throws IOException, InterruptedException {
			String[] profucts = value.toString().split(" ");
			for(int i=0; i < profucts.length - 1; i++) {
				
				for(int j=1; j < profucts.length; j++) {
					
					if(!profucts[i].equals(profucts[j])) {
						
						context.write(new Text("商品序列为:"+profucts[i]+ "<----->"+ profucts[j]), new Text("1"));
					}
				}
			}
	
	}
	
}

class Reduce004 extends Reducer<Text, Text, Text, Text>{

	@Override
	protected void reduce(Text okey, Iterable<Text> ovalue, Context context)
			throws IOException, InterruptedException {
		Integer count = 0;
		for (Text num : ovalue) {
			count++;
			
		}
		context.write(okey, new Text(count.toString()));
		
	}
	
	
	
}
	
	

输出结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值