最近开发了一个超级简单的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 举报,一经查实,本站将立刻删除。