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