spark性能优化-数据倾斜

针对大规模商品数据,通过广播特征向量和哈希分区优化,解决数据倾斜问题,显著提升商品相似度计算效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:

       计算同一品类两两商品的相似度,已有的数据结构:[(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")

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值