编程语言
首页 > 编程语言> > spark程序提交集群运行全在driver端的问题---setMaster的坑

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

标签:--,driver,---,全在,集群,executer,提交,spark,运行
来源: https://blog.csdn.net/suly_liping/article/details/113766120