微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

spark程序提交集群运行全在driver端的问题---setMaster的坑

最近开发了一个超级简单的spark程序,也就rdd运行map再运行foreach,并提交到集群(standalone模式)运行。

不知道是不是我是刚入门的小白资历尚浅的问题,

但是。。但是。。。但是。。。。
它为什么只运行在driver上?

在这里插入图片描述

提交参数:

spark-submit --master spark://hadoop1:7077 --num-executors 4 --driver-memory 3G --executor-memory 3G --executocores 4 --deploy-mode cluster /usr/local/software/spark-2.4.2/task/testWorker.jar test

没有任何问题,但是为什么没有它没有executer呢?

经过艰难(并没有多艰难)的调试发现,问题就是出现在这代码上:

val conf = new SparkConf().setAppName("testWorker").setMaster("local[*]")
conf.set..........//此处省略一大段配置
val builder: SparkSession.Builder = SparkSession.builder().config(conf).enableHiveSupport()
val session: SparkSession = builder.getorCreate()

众所周知,.setMaster(“local[*]”)是用于设置本地模式运行时所需的cpu核数,在on yarn模式下,会被–master spark://hadoop1:7077参数代替(百度说的,不确定),请看链接https://www.it1352.com/1935856.html

所以我也天真地以为在spark-submit 只要添加参数–master spark://hadoop1:7077,它就会覆盖setMaster的东西,并以集群模式运行了;

但是事实是,在standalone模式下,如果把这个代码提交到集群上运行时,它就变成了在driver端的本地运行,所以提交到集群后永远是只有一个diriver端在运行,也就是单线程运行,白白浪费集群的资源了;

有日志为证:
成功启动了worker:

在这里插入图片描述

成功地在driver端启动了本地模式:

在这里插入图片描述

当然,解决方法就是在打包提交到集群上运行的时候,把.setMaster(“local[*]”)删掉即可;

再看一下提交集群运行情况

在这里插入图片描述

它有了他的Executors了,而且还是4个!!!!

在这里插入图片描述


关于executer数量的设置,在standalone模式下,是不支持通过–num-executors设置executer数量,on yarn模式就可以,然后standalone模式的executer数量是spark.cores.max/spark.executor.cores,所以只要在代码设置spark.cores.max的数量

conf.set("spark.cores.max","8")

和在提交参数设置:

--executor-cores 2

就可以设定executer数量
详情请参考:
https://blog.csdn.net/CPP_MAYIBO/article/details/89162372

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐