您的位置:首页 > 大数据

[大数据]连载No9之SparkCore核心篇-资源调度

2018-02-21 13:32 411 查看
本次总结见目录



stage切割规则
1:每一个stage的并行度由task个数决定,task由partition个数决定,partitio由数据大小决定,或者说,stage并行度由最后一个RDD的partiton决定

2:每个task的处理逻辑就是每条线贯穿的Stage的所有的partition的处理逻辑,以递归函数的展开式整合起来的
见图




Spark任务调度流程
代码:
1)var conf = new SparkConf()
2)var sc = new SparkContext(conf)
3)var rddLine = sc.textFile("log")
4)var filterRDD=rddLile.filter()
5)var mapRdd=filterRDD.map()
6)mapRDD.count()
7)sc.stop()


说明:
1:当Worker节点启动后,会向maser节点注册其本身,并告诉maser其在当前节点管理多少资源
 2:Worker会像master每隔3秒发送一次心跳,但不会携带当前资源情况
 3:通过spark-sbumit提交jar,在执行第二步后,会创建SparkSontext对象同时,会创建 DGAScheduler和TaskSchedure对象
 4:TaskSchedure创建成功后,向master申请资源,未指定选项,使用默认值
   --executor-memory :1G 
   --executor-cores:没有默认值,每一个Worker管理的所有core数量
   --total-executor-cores:Int的最大值 (当前APPlication总共 使用多少core)
 5:Master收到请求后, 根据自己管理的资源情况, 通知资源充足的Worker,并在其节点上启动Executor进程
 6:每一个executor启动成功,将其反向注册给TaskScheduler,TaskScheduler就拥有了一批Executor地址了
 7:执行完第六步后,集群开始触发(遇到Action算子)Job执行,DAGSchedule会根据RDD的宽窄依赖,来切割这个RDD,划分Stage,切割完毕后,DAGscheduler会将这个stage中的所有task封装到TaskSet对象中,然后"发送"给TaskScheduler
 8:TaskSchelduer收到到每一个TaskSet对象后,都会遍历这个TaskSet集合,将集合中的每一个task异步发送到Executor中执行,如果task失败,默认重试三次

粗粒度的资源调度(spark)
 解释:当application执行之前,会将所有的资源(Executor)申请完毕,知道资源完毕后,才会进行任务调度,知道最后一个task执行完毕,才释放掉这部分资源
 优点:每一个task执行不需要申请资源,直接去用,而且另外一个task能复用资源,task时间短了,stage时间就短了,job时间也就短了,
 缺点:知道最后一个task执行完毕才释放资源,集群资源不能充分利用

 细粒度的资源调度(mapReduce)
 解释:在application执行前不需要讲资源申请完毕,而是直接进行任务的调度,每一个task在执行前自己去申请资源,申请到了才执行,每一个task执行完毕,会将自己申请的资源释放掉
 缺点:task时间变长了

提交application两种方式(client,cluster)
 client(适合测试环境):Dirver进程在client端启动,我们就能够看到task的执行情况
 cluster(适合生产环境):Dirver进程在集群中随机选择一台Worker节点启动,就能将网卡流量集中的问题,散布到集群各个节点,变为(--deploy-mode cluster)
  命令: spark-submit --master spark://master:7077 --deploy-mode cluster --class com.sxt.FilterCountOperator ./01-spark.jar 

 Driver进程与spark集群的通信
 1:申请资源
 2:executor启动完毕,反向注册给Driver
 3:Driver分发task
 4:Executor进程与Driver进程心跳机制 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: