Spark启动过程
正常启动Spark集群时往往使用start-all.sh ,此脚本中通过调用start-master.sh和start-slaves.sh启动mater及workers节点。
1、 启动Master
a) 注册SignalLogger日志记录器
b) 创建名称为master的Actor 并启动,在启动master之前会:
i. 创建workers、apps、drivers等例表,用于记录相关信息
ii. 创建WebUi
iii. 创建及启动MetricsSystem用于监控系统状态
iv. 定期检查Worker状态,维护可用Worker列表
2、 启动Worker
a) 注册SignalLogger日志记录器
b) 创建名称为worker的Actor 并启动,在启动worker之前会:
i. 创建executors、drivers、finishedApps等列表,用于记录相关信息
ii. 创建及启动MetricsSystem用于监控worker状态
iii. 生成workerID,以时间串+host+port组成,其不可能重复。
iv. 创建worker工作目录
v. 向master注册worker
vi. 定期检查Worker状态,维护可用Worker列表
3、 Worker 向Master注册过程
a) 将worker被启动时,向master发送消息:master ! RegisterWorker(workerId, host, port, cores, memory, webUi.boundPort, publicAddress)。
b) 当master收到worker发磅的RegisterWorker消息后,先检测workerId是否已注册,
i. 若已注册,向worker发送sender ! RegisterWorkerFailed("Duplicate worker ID")消息
ii. 若未注册,则注册worker,将其信息记录worker相关的列表,如idToWorker、workers等中,并将其添加到persistenceEngine中,通知sender ! RegisteredWorker(masterUrl, masterWebUiUrl)
iii. 执行schedule()
c) 当worker收到master的反馈消息时:
i. 当消息内容为RegisteredWoker时,worker开启定期向master报活。开始报活后,若Master联系4个报活周期未收到worker心跳,则master认为worker已经不可用,从其维护的worker列表中移除连续未报活worker信息。若向master报活的worker并未在master维护的worker列表中,则master通知该worker重新进行注册。
ii. 若消息内容为RegisterWorkerFailed,则表示注册败,重试或退出。