Hadoop学习 第4-6章 Hadoop数据压缩、Yarn和企业优化

第4章 Hadoop数据压缩

4.1 概述

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

4.2 MR支持的压缩编码

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

4.3 压缩方式选择

4.3.1 Gzip压缩

在这里插入图片描述

4.3.2 Bzip2压缩

在这里插入图片描述
使用场景:历史数据备份

4.3.3 Lzo压缩

在这里插入图片描述

4.3.4 Snappy压缩

在这里插入图片描述

4.4 压缩位置选择

压缩可以在MapReduce作用的任意阶段启用,如图4-22所示。
在这里插入图片描述
在map之后reduce之前的shuffle阶段最经常使用压缩

如果在reduce后,并且形成MapReduce作业链条(多个串行的MapReduce),上一个MapReduce的输出是下一个MapReduce的输入,经常使用压缩技术,但是如果只有一个MapReduce,那么就不需要压缩,因为不压缩的话方便查看。

4.5 压缩参数配置

要在Hadoop中启用压缩,可以配置如下参数:
在这里插入图片描述
在这里插入图片描述

4.6 压缩实操案例

4.6.1 数据流的压缩和解压缩

了解 没有听课

第5章 Yarn资源调度器

在这里插入图片描述

5.1 Yarn基本架构

YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成,如图4-23所示。
在这里插入图片描述

5.3 Yarn工作机制

1.Yarn运行机制,如图4-24所示。
在这里插入图片描述
2.工作机制详解

(1)MR程序提交到客户端所在的节点。

(2)YarnRunner向ResourceManager申请一个Application。

(3)RM将该应用程序的资源路径返回给YarnRunner。

(4)该程序将运行所需资源提交到HDFS上。

(5)程序资源提交完毕后,申请运行mrAppMaster。

(6)RM将用户的请求初始化成一个Task。

(7)其中一个NodeManager领取到Task任务。

(8)该NodeManager创建容器Container,并产生MRAppmaster。

(9)Container从HDFS上拷贝资源到本地。

(10)MRAppmaster向RM 申请运行MapTask资源。

(11)RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。

(12)MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序。

(13)MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。

(14)ReduceTask向MapTask获取相应分区的数据。

(15)程序运行完毕后,MR会向RM申请注销自己。

MR任务和HDFS和Yarn是如何联系的?
MR任务运行需要从HDFS读数据,运行结束后需要向HDFS写数据。
MR提交到Yarn上进行任务调度和状态协调。

5.4 作业提交全过程

1.作业提交过程之YARN,如图4-25所示。
在这里插入图片描述
作业提交全过程详解

(1)作业提交

第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。
第2步:Client向RM申请一个作业id。
第3步:RM给Client返回该job资源的提交路径和作业id。
第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。
第5步:Client提交完资源后,向RM申请运行MrAppMaster。

(2)作业初始化

第6步:当RM收到Client的请求后,将该job添加到容量调度器中。
第7步:某一个空闲的NM领取到该Job。
第8步:该NM创建Container,并产生MRAppmaster。
第9步:下载Client提交的资源到本地。

(3)任务分配

第10步:MrAppMaster向RM申请运行多个MapTask任务资源。
第11步:RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。

(4)任务运行

第12步:MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序。
第13步:MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
第14步:ReduceTask向MapTask获取相应分区的数据。
第15步:程序运行完毕后,MR会向RM申请注销自己。

(5)进度和状态更新

YARN中的任务将其进度和状态(包括counter)返回给应用管理器, 客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新, 展示给用户。

(6)作业完成

除了向应用管理器请求作业进度外, 客户端每5秒都会通过调用waitForCompletion()来检查作业是否完成。时间间隔可以通过mapreduce.client.completion.pollinterval来设置。作业完成之后, 应用管理器和Container会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查。

2.作业提交过程之MapReduce,如图4-26所示
在这里插入图片描述

5.5 资源调度器

在这里插入图片描述
1.先进先出调度器(FIFO),如图4-27所示
在这里插入图片描述
2.容量调度器(Capacity Scheduler),如图4-28所示
在这里插入图片描述
3.公平调度器(Fair Scheduler),如图4-29所示
在这里插入图片描述

5.6 任务的推测执行

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

第6章 Hadoop企业优化

6.1 MapReduce 跑的慢的原因

在这里插入图片描述

6.2 MapReduce优化方法

MapReduce优化方法主要从六个方面考虑:数据输入、Map阶段、Reduce阶段、IO传输、数据倾斜问题和常用的调优参数。

6.2.1 数据输入

在这里插入图片描述

6.2.2 Map阶段

在这里插入图片描述

6.2.3 Reduce阶段

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

6.2.4 I/O传输

在这里插入图片描述

6.2.5 数据倾斜问题

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

6.2.6 常用的调优参数

在这里插入图片描述
在这里插入图片描述
(2)应该在YARN启动之前就配置在服务器的配置文件中才能生效(yarn-default.xml)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
面试经常问Hadoop有哪些调优手段,之前是对MapReduce进行调优,下面对HDFS进行调优

6.3 HDFS小文件优化方法

6.3.1 HDFS小文件弊端

在这里插入图片描述

6.3.2 HDFS小文件解决方案

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

第7章 MapReduce扩展案例

7.1 倒排索引案例(多job串联)

在这里插入图片描述
在这里插入图片描述
3.第一次处理

(1)第一次处理,编写OneIndexMapper类

package com.BW.mr.index;

import java.io.IOException;

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.lib.input.FileSplit;

public class OneIndexMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
	
	String name;
	Text k=new Text();
	IntWritable v=new IntWritable(1);
	
	@Override
	protected void setup(Mapper<LongWritable, Text, Text, IntWritable>.Context context)
			throws IOException, InterruptedException {
		
		//获取文件名称
		FileSplit inputSplit= (FileSplit) context.getInputSplit();
		name=inputSplit.getPath().getName();
	}
	
	@Override
	protected void map(LongWritable key, Text value, Context context)
			throws IOException, InterruptedException {
		
		//1.获取一行
		String line=value.toString();
		
		//2.切割
		String[] fields=line.split(" ");
		
		//3.循环写出
		for (String word : fields) {
			
			k.set(word+"--"+ name);
			context.write(k, v);
		}		
	}
}

(2)第一次处理,编写OneIndexReducer类

package com.BW.mr.index;

import java.io.IOException;

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

public class OneIndexReducer extends Reducer<Text, IntWritable,Text, IntWritable>{
	
	IntWritable v=new IntWritable();
	
	@Override
	protected void reduce(Text key, Iterable<IntWritable> values,
			Context context) throws IOException, InterruptedException {
		
		int sum=0;
		//1.累加求和
		for (IntWritable value : values) {
			sum+=value.get();
		}
		
		v.set(sum);	
		
		//2.写出
		context.write(key, v);
	}
}

(3)第一次处理,编写OneIndexDriver类

package com.BW.mr.index;

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 OneIndexDriver {
	public static void main(String[] args) throws IllegalArgumentException, IOException, ClassNotFoundException, InterruptedException {
		// 输入输出路径需要根据自己电脑上实际的输入输出路径设置
				args = new String[] { "e:/hadoop/input/inputoneindex", "e:/hadoop/output/outputoneindex" };

				Configuration conf = new Configuration();

				Job job = Job.getInstance(conf);
				job.setJarByClass(OneIndexDriver.class);

				job.setMapperClass(OneIndexMapper.class);
				job.setReducerClass(OneIndexReducer.class);

				job.setMapOutputKeyClass(Text.class);
				job.setMapOutputValueClass(IntWritable.class);
				
				job.setOutputKeyClass(Text.class);
				job.setOutputValueClass(IntWritable.class);

				FileInputFormat.setInputPaths(job, new Path(args[0]));
				FileOutputFormat.setOutputPath(job, new Path(args[1]));

				job.waitForCompletion(true);

	}

}

(4)查看第一次输出结果 运行成功
在这里插入图片描述
然后编写第二个job 还在同一个包内:

4.第二次处理

(1)第二次处理,编写TwoIndexMapper类

package com.BW.mr.index;

import java.io.IOException;

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

public class TwoIndexMapper extends Mapper<LongWritable, Text, Text, Text>{
	
	Text k=new Text();
	Text v=new Text();
	
	@Override
	protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, Text>.Context context)
			throws IOException, InterruptedException {
		
		//1.获取一行
		String line=value.toString();
		
		//2.切割
		String[] fields=line.split("--");
		
		//3.封装
		k.set(fields[0]);
		v.set(fields[1]);
		
		//4.写出
		context.write(k, v);
		
	}

}

(2)第二次处理,编写TwoIndexReducer类

package com.BW.mr.index;

import java.io.IOException;

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

public class TwoIndexReducer extends Reducer<Text, Text, Text, Text>{
	
	Text v=new Text();
	
	@Override
	protected void reduce(Text key, Iterable<Text> values, Context context)
			throws IOException, InterruptedException {
		StringBuffer sb=new StringBuffer();
		// 1.拼接
		for (Text value : values) {
			sb.append(value.toString().replace("\t", "-->")+"\t");
			
		}
		
		v.set(sb.toString());
		
		//2.写出
		context.write(key, v);
	}
}

(3)第二次处理,编写TwoIndexDriver类

package com.BW.mr.index;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
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 TwoIndexDriver {
	public static void main(String[] args) throws IllegalArgumentException, IOException, ClassNotFoundException, InterruptedException {
		// 输入输出路径需要根据自己电脑上实际的输入输出路径设置
		args = new String[] { "e:/hadoop/input/inputtwoindex", "e:/hadoop/output/outputtwoindex" };

				Configuration config = new Configuration();
				Job job = Job.getInstance(config);

				job.setJarByClass(TwoIndexDriver.class);
				job.setMapperClass(TwoIndexMapper.class);
				job.setReducerClass(TwoIndexReducer.class);

				job.setMapOutputKeyClass(Text.class);
				job.setMapOutputValueClass(Text.class);
				
				job.setOutputKeyClass(Text.class);
				job.setOutputValueClass(Text.class);

				FileInputFormat.setInputPaths(job, new Path(args[0]));
				FileOutputFormat.setOutputPath(job, new Path(args[1]));

				boolean result = job.waitForCompletion(true);
				System.exit(result?0:1);
	}
}

(4)第二次查看最终结果 运行成功
在这里插入图片描述

7.2 TopN案例

企业真实面试题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这个问的多
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这个问的不多 但是要会
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这个不算标准 看课件的步骤
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
证明自己看过源码,秀
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
切片:默认大小是按照块的大小进行切割
1.1倍 有个公式 最大值 最小值

在这里插入图片描述
这个问的比较少
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
或者问MapReduce工作流程
或者shuffle工作机制
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
shuffle的工作流程几乎必问
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
京东面试题 二次排序
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
写的最多的是spark的worldcount
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
job里面有很多task maptassk 和reducetask

真正的开发重点

HDFS
shell操作 重要
API操作 和IO操作 目前遇到比较少
理论看好
添加新节点 退役节点 偏运维

Mapreduce
worldcount 案例
序列化案例
自定义inputformat案例
CombineTextinputFormat 案例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值