spark进程、端口号

进程

Master进程:管理整个集群资源,Yarn中为ResouceManager

Worker进程:负责管理本节点的资源,定期向Master汇报心跳,接收Master的命令,启动Executor。Yarn中为NodeManager

client:客户端进程,负责提交作业到Master。在yarn-cluster模式中,在Resource Manager端提交应用程序,会生成SparkSubmit进程,该进程只用来做Client端,应用程序提交给集群后,就会删除该进程。

Application:基于spark的用户程序,包含了driver程序和集群上的executor

Driver:一个Spark作业运行时包括一个Driver进程,也是作业的主进程,负责作业代码的解析、生成Stage并调度Task到Executor上。包括DAGScheduler,TaskScheduler。在yarn-cluster模式中,resourcemanager会选取一个nonemanager上运行applicationManager,该AM会同时运行着Driver。

ClusterManager:在集群上获取资源的外部服务(如standalone、yarn)

Executor:在worker上为某个应用启动的一个进程,负责接收taskSet,运行任务,以及将数据存储到内存或者是磁盘上,每个应用都有自己独立的executors。

Task:被送到某个executor上的工作节点

Job:和spark的action对应,包含很多任务的并行计算

Stage:一个job被拆分为多组任务,每组任务被称为stage

DAGScheduler:基于stage构建DAG,决定每个任务的最佳位置;记录哪个RDD或者stage需要物化;将taskset(一组task)传给底层调度起TaskScheduler;重新提交shuffle输出丢失的stage

TaskScheduler:提交taskset到集群运行并汇报结果;出现shuffle输出lost要报告fetch

sparkContext:整个应用的上下文,控制应用的生命周期

SparkConf:负责存储配置信息

failed错误;碰到straggle任务需要放到别的节点上重试;为每一个taskset维护一个taskSetmanager(追踪本地性及错误信息)

端口号

8080:master的webUI,Tomcat的端口号

7077:spark基于standalone的提交任务的端口号

8081:worker的webUI的端口号

18080:historyServer的webUI的端口号

4040:application的webUI的端口号

组件挂掉

master挂掉影响:
driver无法向master进行注册,无法检测executor的执行情况
解决方案:
配置高可用

worker挂掉影响:
该节点无法为master进行工作,无法启动executor、driver(cluster模式下)
解决方案:
去worker节点中执行sbin/start-slave.sh即可,执行脚本如下:

sbin/start-slave.sh 10 spark://hdp5:7077
PS:

10是worker编号,自定义的,注意这个编号是从0开始递增的,所以不要与以往worker编号重复。

Spark://hdp5:7077  这个是master地址

executor:
挂掉影响:
无法对driver分配的任务进行处理:
解决方案;
1、堆内内存不足OOM时候会挂掉,解决办法是申请多点的内存 —executor-memory 5G
2、堆外内存不足 OOM,解决办法是增加 —conf spark.yarn.executor.memoryOverhead=2048
默认情况下每个Executor 会申请堆外内存大小是executor-memory 10%

拓展

什么是堆内内存与堆外内存呢?

堆内内存:

jvm参数中只要使用-Xms,-Xmx等参数就可以设置堆的大小和最大值,理解jvm的堆还需要知道下面这个公式:堆内内存 = 新生代+老年代+持久代。
JVM虚拟机的内存管理机制,采用垃圾回收器(GC)统一进行内存管理,GC会在某些特定的时间点进行一次彻底回收,也就是Full GC。
对于spark的excutor 堆内内存就可以很好的理解了,就是应用程序运行需要的内存。

堆外内存:

堆外内存就是把内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理(而不是虚拟机),这样做的结果就是能够在一定程度上减少垃圾回收对应用程序造成的影响。

那么excutor 申请堆内内存是用来干嘛的呢?



Spark底层shuffle的传输方式是使用netty传输,netty在进行网络传输的过程会申请堆外内存,因为netty是进行零拷贝。


那什么是零拷贝呢?

一般情况下把文件读入到socket 需要四个步骤,且需要经过应用程序调度,而零拷贝则是直接用操作系统的内核态读取数据给socket,参考 :https://www.cnblogs.com/200911/articles/10432551.html 故这部分内存是直接受操作系统进行管理的。

driver挂掉:
无法进行初始化,将task提交给executor处理,无法和executor进行通信

解决方案:
针对 Standalone 集群。相当于SparkContext(Driver)
Driver HA 当Driver死掉会重新启动一个新的Driver
第一步:在提交application的时候添加 - - supervise(Standalone 集群才有的)选项,如果Driver挂掉会自动启动-个Driver
但 :这种启动的Driver 并不知道集群处理到什么位置,也不知道处理的逻辑是什么,所以容易造成数据重复消费。。
第二步:必须在代码中恢复Driver(SparkStreamingContext)

设置的内存太小,增加driver的内存

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值