离线阶段第五天
上次课程内容回顾
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_0000001 | Pdt_01 | 222.8 |
---|---|---|
Order_0000001 | Pdt_05 | 25.8 |
Order_0000002 | Pdt_03 | 522.8 |
Order_0000002 | Pdt_04 | 122.4 |
Order_0000002 | Pdt_05 | 722.4 |
Order_0000003 | Pdt_01 | 222.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-mb | 8192 |
---|---|
定义每台机器的虚拟内核使用大小
yarn.nodemanager.resource.cpu-vcores | 8 |
---|---|
定义交换区空间可以使用的大小(交换区空间就是讲一块硬盘拿出来做内存使用)
这里指定的是nodemanager的n内存的2.1倍
yarn.nodemanager.vmem-pmem-ratio | 2.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