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