Spark的一个经典问题(1个Core5个Executor和5个Core1个Executor有什么区别)
一、问题分析
1.1先思考两个问题
1个Core VS 5个Core 有什么区别?在spark中如何用到Core
1个Executor VS 5个Executor 有什么区别?在spark中如何使用Executor?
1.2再思考两个问题
什么是IO密集?
什么是计算密集?
二、上述两种方式 如何选择
案例1
数据量10亿条,什么逻辑运算都不做处理,只是写到hdfs中,该选择哪种方式?
逻辑运算很少,说明不需要很多的Core,但是数据量很大,要写到hdfs中,io就成为了本案例的瓶颈,这种场景属于IO密集
那么就应该选择 1个core5个executor
这里举一个形象的例子,一个牧羊人把十万只羊赶到10公里外的羊圈,一次可以赶1万只,要赶十次,如果牧羊人可以一次赶十个一万只(十万只),那么就需要赶一次!
案例2
数据量1千条,逻辑运算超级复杂,该选择哪种方式?
逻辑运算超级复杂,如果想要加快计算,那么就需要更多的资源,cpu就成了本案例的瓶颈,这种场景属于计算密集
那么就应该选择1个core5个executor
这里举一个形象的例子,一个牧羊人给十万只羊剪羊毛,十万个牧羊人给十万只羊剪羊毛
三、从Spark任务提交流程说起
我们提交spark任务的时候一般是:
spark-submit
--master yarn
--deploy-mode cluster
--class com.leqee.sparkstream.stream.DMLStreaming
--driver-cores 1
--driver-memory 1G
--num-executors 2
--executor-cores 3
--executor-memory 4G
--name StreamA
--queue stream
--conf "spark.executor.memoryOverhead=2G"
xxx.jar
那么这里面我们就要明确几个参数
executor-cores 这个是每个executor申请的core
num-executor 这个任务一共申请的executor个数
四、涉及到的RDD原理
根据上述有一个问题
那么我们的task哪里去了?
spark 中task是根据分区来决定的,那么分区是怎么来的呢?
RDD的特点就是分区,容错,弹性。。。
那么spark的task是在executor中执行的,task是并发的,也就是说我们给少了core可以触发并发,
但是executor是并行的,每个executor分布在不同的NM(yanr模式)