优化前:sql逻辑不复杂,只是中间用到了一个udtf函数,函数处理逻辑非常复杂,先付一张sql图
这里涉及到大表join小表,所以采用了mapjoin,去掉reduce过程,然后重新定义文件数量,让多个map去并行。关键点在于udtf函数逻辑过于复杂,而且传入的拼接字段,每个月会有4万左右数据,拼接后的字符串相同,这样就会导致这些数据进了同一个map,同时由于udtf逻辑复杂,所以这两个map会一直跑,由此出现了map端的数据倾斜。运行时长在90分总以上,由于等不了,就停了,没有具体看过多久执行完
优化方式:这里是由于出现了map端的数据倾斜,所以第一步:通过distribute by rand() 将数据打散,随机放到不同的map去执行。第二步:与此同时,就会产生reduce的个数,此时再去手动设置reduce个数,我设置的是250个。第三步:为了保险起见把拼接的20几个字段再多拼接一个rand(),这里注意第三步如果不做,前两步是没有效果的。
优化后:没有了数据倾斜,运行时长为13分钟