00:00
好,接下来我们来看一下maps在生产环境下如何来调优。对吧,哎,据说咱们这个精通S对吧?啊S那看一看整个这个S过程当中,我们能配置哪些参数,使你这个MA6程序达到一个最优的状态。那首先我们来看一下这个,呃,Map阶段,就是map task阶段对应的S,我们可以做哪些优化哈,那我们先来回顾一下map reduce当中S的啊,这个map基站的沙。啊卖方法出来之后,对吧?哎,进入环境缓冲区,其实呢,这个数据啊,应该先进入到标记数据是哪一个分区的,然后才会进入到环境缓冲区对吧?因为它进的是叫get爬培方法,还记得吧?啊那进下来之后呢,对数据呢,进行分区排序,排序之后对数据进行一写啊第二次一写。一些之后呢,进行一个归并,归并然后commander压缩,压缩之后写入到磁盘,等待re端拉取整个,这是map test阶段的suffer。
01:02
那在这个沙过程当中,我们能进行哪些优化?首先来看第一个。你进来之后,首先标记数据是哪一个分区的,对吧,那这在这里面我们就可以重写你的get part方法。然后对你的数据进行一个冲击分区,刚才我们场景提出来一个说这个数据倾斜。对吧,大量的这个重复的key进入到了同一个reduce。那我们能不能把这个K给他打散呢?如果你这个数据量比较大,我是不是可以在前面加上一个随机数加二加三,这不是相同P吗?对吧,那我对你的K加上一加上二加上三,那我是不是就分出来三份了。那我这个reduce的压力不就小了吗?我计算性能不就快了吗?好,所以说这里面可以制定义分区,减少数据倾斜,这是其中一个解决方案。OK,再来。那下面呢,是减少溢血次数,那怎么讲呢?哎,它是这样做的啊,还记得咱这个环形缓冲区默认是100兆吗。
02:02
对吧,哎,我可以把它加大,加大到200兆。或者呢,我这里还原缓冲区到达80%的时候进行反应一些,我可以给他提高到90%,那有什么好处呢?你看啊,我这里是达到阀值之后进行一个一写对吧,形成一个文件,那如果我说这两个值加大的话,那我产生一写文件的个数是不是就少了。思考一下,比如说总共呢,我是这个,呃,128兆的数据。对吧,哎,那我在一写文件的数就会少了。哎,那少了之后呢,你墨叽这个墨叽这个数不就少了吗?那我速度不就快了吗?哎,好,这是这块,那再有我增加每次墨子合并的次数,这是合并。对吧,在这块,哎,我归并的时候,我能不能一次多归并几个。我原来一次默认归并的这个文件数呢是十个,如果我的内存足够充足,我可以归并到20个甚至更多。前提条件是你的系统的内存得足够用。
03:04
OK吧,哎,这要知道你别内存不够用,你还还往上往上调,如果内存不够用的话,你得把这值往小了调。因为磨制的过程啊,是把数据加载到内存进行一个处理。再往下。在不影响业务的前提条件下,我们可以提前开启,相当于在map阶段提前进行了一次密聚合。对吧,哎,那当然它有前提条件,也就说哎,求和没问题,求平均值那就不行了。再往下,下面呢是为了减少磁盘IO。你想想,我这是map阶段,最后的数据写入到磁盘了,是不是等待radio端来拉取啊,那拉取的过程当中是要走网络。那如果我为了减少这个网络上的数据的一个传输,我可以采用耐皮压缩或者拉住罗啊,通常情况下企业里面用耐皮压缩的比较多。啊,那这块这是具体的一个配置。这是采用压缩减少10O,那下面我可以调整map test的内存,哎,默认map test的内存上限呢,是一个G内存。
04:06
对吧,哎,那一个G内存够还是不够呢。通常1G内存处理128兆数据绰绰有余。那如果生产环境下,你这个map阶段处理的数据大于128兆,什么场景你前面的数据就是压缩的。对吧,假如说压缩完之后是一个G。那你觉得用1G的内存去处理一个G的数据能够用吗?不够用对吧,那你就要把这个map t的内存往上调,那通常你掌握一个原则,就是128兆数据,我用1G的内存来处理,原则上就够。那当然说我想用2G,那处理速度就更快一些。OK吧,好。向下走,那下面呢,除了这个map task那个内存上限之后,你还要调整这个mapb task对应内存大小,它俩的值你始终让它一致就行了,它是1G,那你就是1G,它2G,你也2G。哎,这是这个Java堆,OK吧,哎,堆里的那份大小,如果说你报的这个异常是out of OM就是OM对吧,那你要挑它。
05:06
哎,好多同学忘了去调它,只调了这一个值,其实没有用。哎,它是控制你这个Java能用多少对内存的啊,这个是map test内存的一个上限,这是两个值啊,都是保持一致就行了。再往下说,你这个map test里面的CPU默认呢,只有一个。那如果你这个任务呢,是一个CPU或者说计算密集型任务。里面涉及到大量的这种啊,加减乘除运算,那我就要增加对应的CPU核数。哎,我可以考虑增加两个,增加三个,哎,这样去提高。再往下,下边有一个异常重试。什么意思呢?说每个每个map task,它这个运行故障之后或者失败了,它可以有一个重试的机制。那咱默认可以重试几次呢?可以重试四次。那如果我说我这个服务器啊。特别差对不对,我知道他每次运行它第一次成功的可能性不太大,那其实四次也不一定够,那我可以适当的这个加大这个重复次数,比如说可以重复这个五次六次甚至七次。
06:07
但是如果我的服务器非趁,那我可以适当的降低这个啊,重复执行这个次数,甚至两次就行了。对吧,哎,这也是一个比较灵活的一个参数,好,这就是在这个。Map task阶段对应的S我能进行哪些相关的优化?OK,那下面我们来看一下这个reduce阶段的沙。对吧?哎,Map阶段结束之后,接下来进入到reduce,那reduce呢,首先呢是拷贝自己指定分区的数据,进入到reduce,拷贝过来首先放到内存里面,内存不够之后一写到磁盘,然后呢,不管你是内存的数据还是一写的数据,我都会进你对你进行归并排序,归并排完序之后,其实正常是一个分组,然后把数据呢写入到这流方法里面去。那在这个过程当中,我们能进行哪些优化呢?首先来看第一个参数,你这块呢是拉取自己指定分区的数据,那你一次拉取几个map task。
07:02
对应分级的数据。对吧,我前面可能100个map test,那你一下子就把100个map test数据都拉过来吗?不是,哎,他默认的一次只拉取五个map test的数据。哎,那生产文件呢,你可以提高到十个级以上。OK吧,哎,这是这块,哎,那前提条件仍然是你这块的内存,或者是你这台服务器的性能啊比较强,那你一次可以多拉几个,如果你的服务器性能不是那么特别强,那你这块就少拉几个。再往下走。那你拉取过来之后,对吧,我要放在内存里面,那我给这个数据准备多少内存。是吧,哎,默认的是你总内存的70%。啊,假如说你总内存reduce task啊,是1G内存,那我给你700兆。哎,这么大内存。OK吧,哎,那可以提高到80%。是吧,往上提高啊,让内存里面处理的数据越多,那你的计算性能是不是就快呀。
08:00
这是这个。那再往下找,下面呢是他。哎,仍然是沙鸡蛋的,这个末是规定排序啊,规定排序那它能用的内存默认是你总内存的66%。那你也可以适当的再往上提高,比如说提高到70%或者75再往上爬。OK吧,嗯,能用内存的那尽量用内存啊,当然还是根据你的机器的这个性能有关系,内存充足那我就多加一点。再往下。它也有自己的内存上限,默认的也是一个G。那你记住,原则仍然是128兆数据对应着1G内存,比如说你进来的数据。有128兆,那我就1G内存去处理,那就比较完美。那如果你的数据量比比这个一百八兆还小,那我们用1G就行了,那如果呢,你这里的数据大于128兆,那一般能往上调啊,可以调高到多少呢?四到六个G。如果四到6G还不行,那你就可以适当的要啊,自定义这个分区了。对吧,让这个数据呢?呃,部署在不同的这个reduce当中,比如减少每一个reduce里面的数据量。
09:06
啊,那叫自定义分区,再往下,下面呢,这个呢,仍然是reduce task的对应内存大小。对吧,哎,跟我们那个map t是一样的,那这两个值呢,要保持一致,你这边是一个G,我就一个G,你两个G,我两个G,你四个G,我也四个G。哎,如果发生报的是这个OM,那你就要跳他。对吧,啊。再往下看,说reduce task这个CPU核数啊,默认也是一个,那当然其实也不是特别充足啊,正常情况下呢,你至少要提高到呃,两到四个,因为reduce task它是把所有map test的数据聚合过来,对吧,指定分级的数据聚合过来,它的数据量呢,还是蛮大的啊,一般呢,要提高这个对应的CPU核数。同时这里面。按radio task也有运行失败的时候,那运行失败默认呢,也是重复执行四次。如果你的服务器性能好,那你就可以少执行几次,如果这个服务器性能比较差,那你就多执行几次,把这个值往上调高。
10:01
再往下面说啊,这个呢是当map task完成多少比例之后,我可以去开启reduce task,你这是map task对吧,假如说100个。那我是等100个map test全执行完之后,我才开始执行这个radio test吗?不是,哎,你只要map test对吧,哎,执行到5%的时候,那我这个read test就可以去申请资源准备开始运行了。OK吧,哎,这是这个值,那当然你说这个我就想等到map t全都结束,那你这个就设成一呗。后面还有一个。这个参数也比较有意思,说呀,如果你一个task在一定时间内没有进入的数据,哎,也不会读取新的数据,比如说卡死状态没有数据进来。那多长时间没有数据进来呢?哎,假如说十分钟都没有数据进来,那我会怎么办?对吧?啊,会怎么办?如果你的程序对每条输入数的数据处理时间过长,建议把这参数调大,也就如果说没有这个超过十分钟了,还没有进来一条新的数据,那我就可以强制退出这个程序啊,这是这个,呃,Map。
11:11
超时的一个时间。那如果你的服务器性能比较差,你说这十分钟很快我我就达到了,嗯,但是呢,其实我程序还在正常运行,那怎么办?那你把这十分钟往长了调。啊,像这个正常的机器,那不会说十分钟他也不会,呃,不会十分钟之内没有数据进来。对吧。那这个参数呢,也可以适当的一个调整。这就是卖6S,哎,这个在radio阶段相关阐述一个调用,那这两个加,呃,这个还有一个最后一个。说,如果你可以不用reduce的话,那尽量就不用。因为reduce呢,只要有reduce它就有沙风,有沙风呢就要涉及到一系列的这个排序分区,对吧,还有墨合并以及拉取这个过程,这个效率呢是比较低的,能不用就不用。行,那这些参数啊,啊,对于大家这个开发的时候呢,非常重要啊,这些参数我们都需要进行一个啊思考啊,要不要进行一个调整,那调整的依据呢,主要是你自己本身服务器的性能,以及呢,你对于计算一个MR程序,你对它的速度的一个响应要求,你希望它更快,对吧,那你就要调整一些这里面参数啊,当然前提条件呢,是你的机器硬件得有这些内存和对应的CPU。
12:22
OK吧,哎,这就是MA6啊,参数的一个调用。
我来说两句