1. map变慢 --hashmap导致
eg
select ...from (select ds,unique_id,pre_pagefrom cbucdm.tmp_dwd_cn_log_app_ut_1where ds='${bizdate}'and pre_page is not null) aleft outer join(select t.*,length(t.page_type_rule) rule_lengthfrom cbucdm.dim_cn_app_page_ut twhere ds='${bizdate}'and is_enable = 'Y') bon 1=1where a.pre_page rlike b.page_type_rule ;
从日志看,长尾的Instance中处理的数据量比较小,单个Instance的处理时间达到了40分钟,在对表中字段的数据分布情况进行统计分析,发现pre_page这个字段的值很多只出现一次,而一些热门的字段出现的频率特别高,导致整体的数据分布很不均匀。因此,在Map端热点Key与小表做笛卡尔积,非常耗时,造成Map端长尾。针对这种情况,可以使用distribute by rand()来打乱数据分布,使数据尽可能的分布均匀。
修改后代码如下:
lect ...from (select ds,unique_id,pre_pagefrom cbucdm.tmp_dwd_cn_log_app_ut_1where ds='${bizdate}'and pre_page is not nulldistribute by rand()) aleft outer join(select t.*,length(t.page_type_rule) rule_lengthfrom cbucdm.dim_cn_app_page_ut twhere ds='${bizdate}'and is_enable = 'Y') bon 1=1where a.pre_page rlike b.page_type_rule ;
2.