Spark性能优化研究--cache的用法

本文探讨了在Spark中使用cache进行性能优化的研究,特别是在处理50亿量级数据训练GradientBoostedTrees模型时的效果。通过对比试验发现,cache可以显著减少job和stage的数量,避免内存溢出问题。优化技巧包括仅使用样本ID进行抽样,并在合适时机cache数据。
摘要由CSDN通过智能技术生成

Spark性能优化研究–cache的用法

背景

最近在用spark训练模型,数据量达到了50亿量级,遇到了很多性能问题,特此进行了试验总结。我们使用cache或者persist内存持久化的目的,是为了在以后的数据计算中减少数据读取的时间,当要处理的数据量过大时,比如50亿级,常常会遇到内存不够,或者cache所需时间过长的问题。cache会破坏spark在做DAG优化执行计划的时候的数据本地性(Data Locality),spark在执行计划之前,会通过yarn进行资源管理和任务调度,尽可能的把task分配到包含其计算所需数据的机器上去,这样做是为了尽可能地减少网络传输的时间,这里的时间就是spark UI上展示的schedule delay。

SparkUI界面截图

试验

试验是针对spark下的GradientBoostedTrees的训练过程,训练数据在50亿左右,需要对数据进行正负样本抽样。

1. 训练数据不cache到内存中,直接输入到训练模型
val date = "2018-07-19"
    val data = spark.sql("select * from train_features_table where dt>=date_sub('" + date + "',31) and dt<'" + date + "'")//.persist(StorageLevel.MEMORY_AND_DISK) //.where("browse_cnt_his_user>0")
    val labels = spark.sql("select pin,item_code,is_buy,date_sub(dt,1) as dt from label_table where dt>=date_sub('" + date + "',30) and dt<='" + date + "'")
    val indexes = data.select("pin","item_id","dt").join(labels, data("pin")<=>labels("pin")&&data("item_id")<=>labels("item_code")&&data("dt")<=>labels("dt"),"left").drop(labels("pin")).drop(labels("dt"))
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值