实时项目复盘

聚合
1、先导用户行为数据,生成需要的rdd mappartition映射成list<tuple<sessionid,row>>(调优 数据量不大用mappartition,不用mappartition有多少数据function就要计算多少次,用了以后聚合到一起给一个task执行,function只执行一次)
2、groupbykey对session进行分组,遍历提取出每个session的点击类型和搜索关键字(开始结束时间,访问步长),拼接成聚合字段
返回tuple<userid,paraggrinfo>的rdd
3、查询用户数据,生成rdd mappartion映射成tup<Long,row>
3、join用户信息然后拼接row返回《sessionid,fullinfo》(从本来paraggrinfo抽出sessionid)
4、过滤,从tuple中截取聚合数据,然后筛选划分
5、对过滤出来的数据进行遍历,找出访问时长和步长
5、重构
重构
直接实现(不重构)
1、actiordd映射成<sessionid,row>
2、按sessionid聚合计算出没给session的访问时长和步长生成新的rdd
3、遍历新生成的rdd将每个session的访问时长和步长更新自定义accumulator中对应的值
4、使用自定义accumulator中统计值计算各个区间的比例
5、最后计算出来的结果写道mysql表
问题
1、为什么还用actionrdd映射,之前在session聚合的时候映射已经做过了
2、一定要为了session聚合这个功能,单独遍历一遍session?不,已经有session数据,之前过滤session的时候就是再遍历,所以这里没必要再过滤一次
重构思路
1、不去生成新的rdd;2、不单独遍历session;3、session聚合的时候直接计算出来session的访问时长和步长;4、过滤的时候本来就要遍历所有session信息可以再某个session通过筛选条件后将访问时长和步长累加到自定义累加器上去

在聚合中遍历时就计算出访问时长和步长

TopN
1、从过滤完的session粒度的数据和所有sessionid对应的行为访问数据rdd进行join然后 map得到一个rdd。
获取点击过、下单过、支付过的所有品类id用flatmaptopair切割信息里的点击品类id、下单id、支付id以pairrdd形式写进list里
去重,对品类id去重,不去重排序会对重复的品类id排序
2、计算品类点击下单支付次数
分别过滤出点下支行为然后map、reducebykey计算。先对是否有点击(下单、支付)行为过滤然后封装成 tuple<long,long>形式的rdd进行reducebykey
3、join各品类和他点下支的次数上面计算出来的三个不是所有的因为有的只点击过,所以用leftouterjoin
4、封装自定义排序(sortbykey 里的key)字段点下支次数,实现order接口要求的方法。1:和其他key比怎么判断大于、大于等于、小于、小于等于三个以此比相等就下一个,key必须实现serializable接口
重写compare和compareto方法
compare(Object o1,object o2)实现util。comparator接口方法,实际用的时带比较对象的compareto方法相减实现
conpareto(objcet o)是lang。comparable接口方法,对某个类的对象排序时需要实现comparable接口,重写compareto
5、数据映射成<categorysortkey,info>格式的rdd然后二次排序,封装排序key再倒序取出top10写出mysql

封装自定义排序(sortbykey 里的key)字段点下支次数,实现order接口要求的方法。和其他key比怎么判断大于、大于等于、小于、小于等于三个以此比相等就下一个,key必须实现serializable接口
重写compare和compareto方法
compare(Object o1,object o2)实现util。comparator接口方法,实际用的时带比较对象的compareto方法相减实现
conpareto(objcet o)是lang。comparable接口方法,对某个类的对象排序时需要实现comparable接口,重写compareto

自定义一个accumulator 低耦合
accumulatorparam
zero方法,数据初始化我们返回一个值,初始化中所有范围区间的数量,都是0
addinplace和addaccumulator我理解成是一样的v1初始化的连接串 v2便利session的时候判断出某个session的区间,然后用constants.time_period_1s_3s,我们在v1里找到v2对应的value,累加一,然后更新回连接串里
写一个add方法session、v1、v2返回更新以后的连接串(校验:v1空直接返回v2。用stringutils.getfieldfromconcatstring工具类从v1里提取v2对应的值累加一)(setfieldfromconcatstring先切割字符串把kv分割开放到数组里,然后判断 key是否等于,等于就加一,然后再把字符串拼接起来返回)

数据倾斜
避免不必要的shuffle,如使用广播小表的方式,将reduce-side-join提升为map-side-join
分拆发生数据倾斜的记录,分成几个部分进行,然后合并join后的结果
改变并行度,可能并行度太少了,导致个别task数据压力大
两阶段聚合,先局部聚合,再全局聚合 自定义paritioner,分散key的分布,使其更加均匀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值