学习目标:
- 初识MR
- 初识YARN
- 初识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()));
}
}
输出结果: