【云计算】spark调优解析
小标 2018-12-05 来源 : 阅读 1026 评论 0

摘要:本文主要向大家介绍了【云计算】spark调优解析,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

本文主要向大家介绍了【云计算】spark调优解析,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。


广播变量:

在Spark Application中,经常会使用到一个共享变量,众所周知的,Spark是一个并行计算框架,对于这个变量,每一个executor的task在访问它的时候,都会去拷贝一份副本去使用。如下图所示:





1.对于这种默认方式,它会极大的系统的内存,我们可以假设一个集群中有1024个task,这个共享变量大小假设为1M,那么就会去复制1024份到集群上去,这样就会有1个G的数据在网络中传输,并且系统需要耗费1G内存去为这些副本分配空间,这样对于系统有什么影响呢?

2.如果系统内存不足,RDD持久化的时候无法在内存中持久化,需要持久化到磁盘中,那么后续的操作会因为频繁的磁盘IO使得速度变慢,性能下降,当task中创建对象时,发现堆中内存不足,那么就需要进行GC操作,进行GC的时候,会导致工作线程暂停,如果内存严重不足,频繁的GC对于Spark作业的速度的影响是可想而知的

解决方法:

针对这个情况我们可以使用Broadcast,将这种每个task需要用到的共享变量广播出去。

从上面的图中可以看到,当每一个task需要使用这个变量的时候都会拷贝一份。如果使用广播变量,首先该广播变量会拷贝一份副本到Driver中,当每一个executor的task使用到该变量时,首先会去每个executor的BlockManager中去检查是否有该变量的副本,如果没有,接着会去Driver中去拷贝一份副本到BlockManager中,然后供该executor中的每一个task使用,到下一个executor的task需要使用这个变量时,它的BlockManager可以去Driver中拷贝副本,也可以去距离比较近的executor的BlockManager中去拷贝。(每一个executor中的BlockManager的作用是负责管理每一个executor对应的内存和磁盘的数据。)其原理图如上所示





在默认情况下,如果是1024个task需要消耗1G内存,但是如果我们有50个executor来平分这些task,那么只需要50个副本即可,总共消耗了50M内存,那么在内存的消耗了节省了大约20倍。而且副本的复制有时不需要从Driver拷贝,而是从其他executor中拷贝,那么,网络 传输带来的性能消耗也会小很多,可想而知,使用广播变量可以节省很多内存,从而使得性能显著提升

广播方法:

比如我们的共享变量是一个map类型的变量,我们可以使用Spark上下文来创建广播变量:

Broadcast<map> broadcast=sc.broadcast(map);1

在task中使用的时候可以使用value方法或者getValue方法来获取它的值:

Map map=broadcast.value;


          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标大数据云计算大数据安全频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved