天天看点

MaxCompute MapReduce的7个性能优化策略

对于列数特别多的输入表,map阶段处理只需要其中的某几列,可以通过在添加输入表时明确指定输入的列,减少输入量;

例如只需要c1,c2俩列,可以这样设置:

设置之后,你在map里的读取到的record也就只有c1,c2俩列,如果之前是使用列名获取record数据的,不会有影响,而用下标获取的需要注意这个变化。

对于map/reduce阶段每次都会用到的一些java对象,避免在map/reduce函数里构造,可以放到setup阶段,避免多次构造产生的开销;

合理选择partition columns,可以使用jobconf#setpartitioncolumns这个方法进行设置(默认是key schema定义的column),设置后数据将按照指定的列计算hash值分发到reduce中去, 避免数据倾斜导致作业长尾现象,如有必要也可以选择自定义partitioner,自定义partitioner的使用方法如下:

在jobconf里进行设置:

另外需要在jobconf里明确指定reducer的个数:

如果map的输出结果中有很多重复的key,可以合并后输出,combine后可以减少网络带宽传输和一定shuffle的开销,如果map输出本来就没有多少重复的,就不要用combiner,用了反而可能会有一些额外的开销。combiner实现的是和reducer相同的接口,例如一个wordcount程序的combiner可以定义如下:

map默认的split size是256mb,split size的大小决定了map的个数多少,如果用户的代码逻辑比较耗时,map需要较长时间结束,可以通过jobconf#setsplitsize方法适当调小split size的大小。然而split size也不宜设置太小,否则会占用过多的计算资源。

欢迎加入“数加·maxcompute购买咨询”钉钉群(群号: 11782920)进行咨询,群二维码如下:

MaxCompute MapReduce的7个性能优化策略

继续阅读