0
点赞
收藏
分享

微信扫一扫

Hive性能调优之数据倾斜(2)

Map数

<1>​通常情况下,作业会通过input的目录产生一个或者多个map任务。

主要的决定因素有:input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M,可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改);

<2>举例:

        a)​一个大文件​: 假设input目录下有1个文件a,大小为780M,那么hadoop会将该文件a分隔成7个块(6个128m的块和1个12m的块),从而产生7个map数。

        b) ​多个小文件​:假设input目录下有3个文件a,b,c大小分别为10m,20m,150m,那么hadoop会分隔成4个块(10m,20m,128m,22m),从而产生4个map数。即,如果文件大于块大小(128m),那么会拆分,如果小于块大小,则把该文件当成一个块。

<3>​是不是map数越多越好?

        答案是否定的。如果一个任务有很多小文件(远远小于块大小128m),则每个小文件也会被当做一个块,用一个map任务来完成,而​一个map任务启动和初始化的时间远远大于逻辑处理的时间​,就会造成很大的资源浪费。而且,同时可执行的map数是受限的。

<4>是不是保证每个map处理接近128m的文件块,就高枕无忧了?

        答案也是不一定。比如有一个127m的文件,正常会用一个map去完成,但这个文件只有一个或者两个字段,却有几千万的记录,​如果map处理的逻辑比较复杂,用一个map任务去做,肯定也比较耗时

        针对上面的问题3和4,我们需要采取两种方式来解决:即​减少map数​和​增加map数

如何适当的增加map数

        ​当input的文件都很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率。

        针对上面的第4条

        假设有这样一个任务:

Select data_desc,
count(1),
count(distinct id),
sum(case when …),
sum(case when …),
sum()
from a group by data_desc

        如果表a只有一个文件,大小为120M,但包含几千万的记录,如果用1个map去完成这个任务,肯定是比较耗时的,这种情况下,我们要考虑​将这一个文件合理的拆分成多个,这样就可以用多个map任务去完成。

set mapreduce.job.reduces =10;
create table a_1 as
select * from a
distribute by rand();

        这样会将a表的记录,随机的分散到包含10个文件的a_1表中,再用a_1代替上面sql中的a表,则会用10个map任务去完成。

        每个map任务处理大于12M(几百万记录)的数据,效率肯定会好很多。

        看上去,貌似这两种有些矛盾,一个是要合并小文件,一个是要把大文件拆成小文件,这点正是重点需要关注的地方,根据实际情况,​控制map数量需要遵循两个原则​:​使大数据量利用合适的map数;使单个map任务处理合适的数据量

调整reduce数

<1> 调整reduce个数方法一

        a) 每个Reduce 处理的数据量默认是256MB

        ​​hive.exec.reducers.bytes.per.reducer=256123456​

        b) 每个任务最大的reduce数,默认为1009

        ​​hive.exec.reducers.max=1009​

        c)计算reducer数的公式

        ​​N=min(参数2,总输入数据量/参数1)​

        参数1:每个Reduce处理的最大数据量

        参数2:每个任务最大Reduce数量

<2>调整reduce个数方法二

        在hadoop的mapred-default.xml文件中修改

        设置每个job的Reduce个数

        set mapreduce.job.reduces = 15;

<3>reduce个数并不是越多越好

        a) ​过多的启动和初始化reduce也会消耗时间和资源;

        b) ​有多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;

总结:

        ​在设置reduce个数的时候也需要考虑这两个原则:处理大数据量利用合适的reduce数;使单个reduce任务处理数据量大小要合适;

        本次的分享就到这里了,喜欢的小伙伴们不要忘了点赞加关注哦ヾ(๑╹◡╹)ノ"

Hive性能调优之数据倾斜(2)_Hadoop



举报

相关推荐

0 条评论