spark性能优化-数据倾斜

背景:

计算同一品类两两商品的相似度,已有的数据结构:[(cid,int); (pid,int); (features,vector)],商品数4W,商品对8W,用时8h。分析是由于数据倾斜导致,例如cid1有100个商品,cid2有300个商品,cid3有1000个商品,由于根据分类id,计算商品相似度,cid3的商品对在一个task中,导致所有任务都等待这一个task运行结束。

优化方案:

1、优化数据通信时间消耗

商品特征向量是1024维的向量,大约5K,4W商品共200M,可以将图片的特征向量进行广播,在每个执行器executor中保存一份,减少数据通信开销;否则按每个商品计算1000个商品对,总数据通信量为4W*5M=200G,在实际计算中远远超过200G。

2、优化数据倾斜

对连接后的商品对,按照(pid1,pid2)对做repartition哈希分区,因为商品对是唯一的,所以根据商品对做shuffle运算后,相似度计算均匀分布到每个task中,消除数据倾斜的问题。

优化后运行时间为1h30min。

代码如下:

#对商品的特征向量进行特征向量,优化数据通信时间开销
feature_broadcast = fn.broadcast(feature_vector)
 
#根据品类id,进行自连接,对商品对进行分区shuffle操作,优化数据倾斜
pid_pairs = cid_pid.join(cid_pid, "cid")\
            .toDF("cid", "pid1", "pid2")\
            .repartition(100, "pid1", "pid2").cache()
 
#获取商品特征信息,计算相似度
@fn.udf(returnType=FloatType())
def cos_sim(a, b):
    #将计算结果转化为float类型,因为string类型占有内存(char类型占2B)
    return float(a.dot(b)/(a.norm(2) * b.norm(2)))
pid_pairs_feature = pid_pairs.join(feature_broadcast, feature_broadcast.products_id == pid_pairs.pid1)\
            .select("cid", "pid1", "pid2", feature_broadcast.features.alias("feature1"))\
            .join(feature_broadcast, feature_broadcast.products_id == pid_pairs.pid2)\
            .select("cid", "pid1", "pid2", "feature1", feature_broadcast.features.alias("feature2"))
pid_pairs_simscore = pid_pairs_feature.withColumn("simscore", cos_sim("feature1", "feature2"))\
            .select("pid1", "pid2", "simscore")

版权声明:本文为CSDN博主「辰星M」的原创文章
原文链接:https://blog.csdn.net/woniu201411/article/details/93783020

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值