05-mapreduce高阶训练,yarn的资源调度

离线阶段第五天

上次课程内容回顾

1、mapreduce的分区以及reducetask的个数的设置

分区:将相同key的数据发送到同一个reduce里面去。相同的key合并,value形成一个集合。

reduceTask个数:job.setNumReduceTasks(5)

2、mapredcue当中的序列化以及二次排序

序列化:Writable

排序:Comparable

序列化 + 排序:WritableComparable

需要对谁排序,就把谁作为K2,将两个字段封装成了javaBean

3、mapreduce当中的计数器 了解,知道

4、MapReduce当中的规约 combiner的过程

combiner作用:减少发送到reduce端的k2的数量

5、手机上网流量综合统计:搞定

6、maptask运行机制以及maptask的并行度

maptask的个数:与block块有关,默认一个block块对应一个切片,一个切片启动一个maptask

maptask的运行的过程:

map阶段两个步骤

第一步:读取文件 TextInputFormat 一行一行读取,读取一行,调用一次map方法

第二步:自定义map逻辑,接收k1 v1 转换成新的k2 v2 输出

map 端的shuffle:三个步骤

第三步:分区

​ 第一种写法:手动显示的指定分区号 reduceTask的个数大于等于分区号的个数

​ 第二种写法:% numReduceTask

第四步:排序:排序的过程,map端的局部排序,每个mapTask处理的内部的数据,进行局部的排序

第五步:规约 调优的过程

每个maptask都会有一个环形缓冲区:主要总用就是将maptask输出的数据,暂时存储到环形缓冲区,发生我们的第三步,第四步,第五步。

环形缓冲区:100M

环形缓冲区溢写比例:0.8

达到溢写比例之后,maptask启动溢写的线程,将80M的数据写入到磁盘里面去

最后maptask处理完成:合并拉出出来的80M的各种文件,合并成为一个大文件,等待reducetask来拉取

7、reducetask的运行机制

第一步:reducetask启动线程,拉取属于自己的数据

第二步:将数据保存在内存,或者磁盘,或者内存 + 磁盘当中

第三步:进行分组的过程。将相同的key合并,value形成一个集合

第四步:调用reduce逻辑

第五步:数据的输出

8、mapreduce的shuffle过程

9、数据的压缩

10、更多的mapreduce编程的案例

reduce端join

map端的join:调优的手段,主要用于解决我们数据倾斜的问题

项目当中有没有遇到什么问题??

怎么发现这个问题的??

怎么解决这个问题的??

数据倾斜:大量的数据都跑到了一个reduceTaks里面去了,导致一个reducetask运行比较慢,其他的reducetask都运行比较快

mapreduce高阶训练,yarn的资源调度

1、求共同好友

数据如下:冒号前是用户,冒号后是好友列表,关系是单向的
A:B,C,D,F,E,O
B:A,C,E,K
C:F,A,D,I
D:A,E,F,L
E:B,C,D,M,L
F:A,B,C,D,E,O,M
G:A,C,D,E,F
H:A,C,D,E,O
I:A,O
J:B,O
K:A,C,D
L:D,E,F
M:E,F,G
O:A,H,I,J

求:那两个人之间有共同好友,以及他们的共同好友都有哪些人
最终结果
A-B : C,E

提示:可以使用多个mapreduce来实现

相同key的数,发送到同一个reduce里面去

第一个mapreduce
A:B,C,D,F,E,O
B:A,C,E,K
以每一个好友作为k2,以用户作为v2
K2 V2
B A
C A
D A
F A
E A
O A

A B
C B
E B
K B

reduce端
C [A,B,]
E [A,B]

第一步输出的数据如下:
好友 所有的用户
A F,D,O,I,H,B,K,G,C,
B E,A,J,F,
C K,A,B,E,F,G,H,
D G,K,C,A,E,L,F,H,
E G,F,M,B,H,A,L,D,
F M,D,L,A,C,G,
G M,
H O,
I C,O,
J O,
K B,
L E,D,
M F,E,
O J,I,H,A,F,

E-D A
E-O A
E-I A

K2
A-E B
A-E C

A-E B,C

2、倒排索引

哪个单词,在哪个文章里面出现了多少次

word hello.txt 2

world abc.txt 3

world 123.txt 10

其实就是类似wordcount

hello-a.txt 3

hello-b.txt 2

hello-c.txt 2

3、自定义inputformat合并小文件

hadoop不擅长处理小文件,文件存储不擅长处理小文件,占用太多的元数据信息,占用太多的内存

mapreduce角度来看,也不擅长处理小文件,一个小文件占用一个block块,一个block块需要启动一个maptask,启动一个maptask也比较慢。启动maptask的时间比数据的处理的时间还要长,得不偿失

第一步:从磁盘读文件,读取到内存

内存100兆溢写环形缓冲区,一个个的小文件

一个个的小文件合并

reduce网络拷贝拉取数据加载到内存以及磁盘,最后调用reduce再写出去到磁盘

数据的处理反复从内存到磁盘,从磁盘到内存,所以比较慢

hadoop集群一定要避免大量小数据的产生

如何解决小文件的问题:

1、上传之前的合并 通过hdfs的javaAPI,上传之前进行合并

2、上传之后的合并 hdfs上面已经存在了大量的小文件,我需要对其进行统一的合并

3、har文档文件

1、自定义输入

2、自定义map逻辑

3、自定义分区

4、自定义排序

5、自定义规约

6、分组

7、自定义reduce

8、自定义输出

订单id 商品id 订单金额

Order_0000001Pdt_01222.8
Order_0000001Pdt_0525.8
Order_0000002Pdt_03522.8
Order_0000002Pdt_04122.4
Order_0000002Pdt_05722.4
Order_0000003Pdt_01222.8

求:每个订单当中金额最大的那个商品是谁

Order_0000001 Pdt_01 222.8

Order_0000002 Pdt_05 722.4

Order_0000003 Pdt_01 222.8

求每组里面最大的一个值

select max(money) from order group by orderId

搞不定

分组求topN

Order_0000001 Pdt_01 222.8

Order_0000001 Pdt_05 25.8

Order_0000002 Pdt_05 722.4

Order_0000002 Pdt_03 522.8

Order_0000003 Pdt_01 222.8

使用mapreduce实现分组求top1的功能

mapreduce参数的优化

资源相关的一些参数:

以下调整参数都在mapred-site.xml这个配置文件当中有

//以下参数是在用户自己的mr应用程序中配置就可以生效

(1) mapreduce.map.memory.mb: 一个Map Task可使用的资源上限(单位:MB),默认为1024。如果Map Task实际使用的资源量超过该值,则会被强制杀死。

(2) mapreduce.reduce.memory.mb: 一个Reduce Task可使用的资源上限(单位:MB),默认为1024。如果Reduce Task实际使用的资源量超过该值,则会被强制杀死。

(3) mapred.child.java.opts 配置每个map或者reduce使用的内存的大小,默认是200M

(4) mapreduce.map.cpu.vcores: 每个Map task可使用的最多cpu core数目, 默认值: 1

(5) mapreduce.reduce.cpu.vcores: 每个Reduce task可使用的最多cpu core数目, 默认值: 1

virtual 虚拟的

//shuffle性能优化的关键参数,应在yarn启动之前就配置好

(6)mapreduce.task.io.sort.mb 100 //shuffle的环形缓冲区大小,默认100m

(7)mapreduce.map.sort.spill.percent 0.8 //环形缓冲区溢出的阈值,默认80%

//应该在yarn启动之前就配置在服务器的配置文件中才能生效

以下配置都在yarn-site.xml配置文件当中配置

(8) yarn.scheduler.minimum-allocation-mb 1024 给应用程序container分配的最小内存

(9) yarn.scheduler.maximum-allocation-mb 8192 给应用程序container分配的最大内存

(10) yarn.scheduler.minimum-allocation-vcores 1

(11)yarn.scheduler.maximum-allocation-vcores 32

(12)yarn.nodemanager.resource.memory-mb 8192

容错相关的一些参数

(1) mapreduce.map.maxattempts: 每个Map Task最大重试次数,一旦重试参数超过该值,则认为Map Task运行失败,默认值:4。

(2) mapreduce.reduce.maxattempts: 每个Reduce Task最大重试次数,一旦重试参数超过该值,则认为Map Task运行失败,默认值:4。

(3) mapreduce.job.maxtaskfailures.per.tracker: 当失败的Map Task失败比例超过该值为,整个作业则失败,默认值为0. 如果你的应用程序允许丢弃部分输入数据,则该该值设为一个大于0的值,比如5,表示如果有低于5%的Map Task失败(如果一个Map Task重试次数超过mapreduce.map.maxattempts,则认为这个Map Task失败,其对应的输入数据将不会产生任何结果),整个作业仍认为成功。

(5) mapreduce.task.timeout: Task超时时间,默认值为600000毫秒,经常需要设置的一个参数,该参数表达的意思为:如果一个task在一定时间内没有任何进入,即不会读取新的数据,也没有输出数据,则认为该task处于block状态,可能是卡住了,也许永远会卡主,为了防止因为用户程序永远block住不退出,则强制设置了一个该超时时间(单位毫秒)。如果你的程序对每条输入数据的处理时间过长(比如会访问数据库,通过网络拉取数据等),建议将该参数调大,该参数过小常出现的错误提示是“AttemptID:attempt_14267829456721_123456_m_000224_0 Timed out after 300 secsContainer killed by the ApplicationMaster.”。

效率和稳定性相关的一些参数

(1) mapreduce.map.speculative: 是否为Map Task打开推测执行机制,默认为true,如果为true,如果Map执行时间比较长,那么集群就会推测这个Map已经卡住了,会重新启动同样的Map进行并行的执行,哪个先执行完了,就采取哪个的结果来作为最终结果,一般直接关闭推测执行

(2) mapreduce.reduce.speculative: 是否为Reduce Task打开推测执行机制,默认为true,如果reduce执行时间比较长,那么集群就会推测这个reduce已经卡住了,会重新启动同样的reduce进行并行的执行,哪个先执行完了,就采取哪个的结果来作为最终结果,一般直接关闭推测执行

(3) mapreduce.input.fileinputformat.split.minsize: FileInputFormat做切片时的最小切片大小,默认为0

(4)mapreduce.input.fileinputformat.split.maxsize: FileInputFormat做切片时的最大切片大小(已过时的配置,2.7.5当中直接把这个配置写死了,写成了Integer.maxValue的值)

(切片的默认大小就等于blocksize,即 134217728)

推测执行一般都直接关闭

mapreduce程序执行:

任务的提交过程

第一步:客户端提交jar包任务

第二步:resourceManager 接收任务,保存jar包到本地的路径

第三步:resourceManager启动一个ApplicationMaster (每提交一个任务,会启动一个appmaster)

appmaster全权负责管理任务的执行

第四步:appmaster向resourceManager申请资源

第五步:appMaster启动container,分配资源

第六步:appmaster分配任务

第七步:continer当中执行任务

第八步:任务执行完成之后,appmaster向resourceManager汇报最终执行结果,appmaster自杀

appmaster的主要作用:第一个:申请资源,第二个:分配资源,第三个:分配任务,第四个:汇报任务的执行状况

yarn的基本介绍

yarn的主要作用:管理任务,调度资源

yarn当中各个组件的介绍:背下来

resourceManager:主节点,主要用于接收客户端的请求,分配资源

nodeManager:从节点,主要是用于执行我们的任务,说白了就是提供cpu和内存的

ApplicationMaster:主要用于申请资源,分配资源,分配任务,任务生命周期的管理

container:资源分配的单位,所有的任务执行,都在container里面,主要用于分配资源,以及回收资源

JobHistory:查看历史完成的任务的日志

TimeLineServer:2.4以后引入的新特性 查看正在执行的任务的情况

yarn当中的调度器

调度器:主要是用于研究一个任务提交之后,下一个任务又来了该怎么执行。决定我们任务如何进行执行

yarn当中的调度器主要用三种

第一种:队列调度器 FIFO。第一个任务提交,先执行,然后第二个任务提交,等着第一个任务执行完毕之后再执行第二个任务

第一个任务:大任务,需要运行4个小时

第二个任务:小任务,需要运行3分钟

这种调度器没人用,不管是apache软件的版本,还是CDH软件的版本

第二种调度器:capacity Scheduler 容量调度器 apache的版本默认使用的调度器

将整个资源,划分成好多块。

根据我们提交的任务需要资源的大小,将我们的任务,划分到不同的资源队列里面去,可以允许多个任务并行的快速的执行

缺点:将资源给划散了

第三种调度器:Fair scheduler 公平调度器 CDH的软件默认使用的调度器

第一个任务提交,将所有的资源 全部分配给第一个任务,保证第一个任务最快的完成

第二个任务提交:从第一个任务当中划分一部分资源出来,给第二个任务进行执行

缺点:造成资源的频繁的分配

优点:可以快速的执行我们的一些大任务

交换区空间大小:如果内存不够用了,找一块磁盘,当做内存来用

磁盘大小定义 2.1 * 内存大小

yarn的一些常用的参数的设置

第一个参数:container分配最小内存

yarn.scheduler.minimum-allocation-mb 1024 给应用程序container分配的最小内存

第二个参数:container分配最大内存

yarn.scheduler.maximum-allocation-mb 8192 给应用程序container分配的最大内存

第三个参数:每个container的最小虚拟内核个数

yarn.scheduler.minimum-allocation-vcores 1 每个container默认给分配的最小的虚拟内核个数

第四个参数:每个container的最大虚拟内核个数

yarn.scheduler.maximum-allocation-vcores 32 每个container可以分配的最大的虚拟内核的个数

第五个参数:nodeManager可以分配的内存大小

yarn.nodemanager.resource.memory-mb 8192 nodemanager可以分配的最大内存大小,默认8192Mb

在我们浏览yarn的管理界面的时候会发现一个问题

我们可以在yarn-site.xml当中修改以下两个参数来改变默认值

定义每台机器的内存使用大小

yarn.nodemanager.resource.memory-mb8192

定义每台机器的虚拟内核使用大小

yarn.nodemanager.resource.cpu-vcores8

定义交换区空间可以使用的大小(交换区空间就是讲一块硬盘拿出来做内存使用)

这里指定的是nodemanager的n内存的2.1倍

yarn.nodemanager.vmem-pmem-ratio2.1

课程总结:

1、社交粉丝的数据分析,求共同好友

2、倒排索引

3、自定义inputformat合并小文件 最后输出成SequenceFile

SequenceFileOutputFromat 读取文件 SequenceFileInputFormat

4、自定义outputformat实现多路径输出

5、分组求topN 好好想一想

6、mapreduce的参数优化:资源相关的参数,效率和稳定性相关的一些参数,容错相关的参数

7、yarn的资源调度

​ yarn的架构:

​ resourceManager

​ nodeManager

​ ApplicationMaster

​ container

​ mapTask

​ ReduceTask

8、yarn当中的调度器

​ 主要有三种调度器

第一种:FIFO 队列调度器

第二种:capacity Scheduler 容量调度器 apache默认使用的调度器

第三种:fair scheduler 公平调度器 CDH使用的版本

关于yarn资源设置的一些参数

写sql语句 3

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值