spark主流程源码分析

1、spark 任务提交过程首先调用sprark-submit函数
例子为 :

bin/spark-submit --class org.apache.spark.examples.SparkPi  --master spark://node-1.itcast.cn:7077 --executor-memory 2g --total-executor-cores 4

该命令主要调用相应脚本下着 这个主类
在这里插入图片描述
然后再源码的bin 中调用命令
exec “ R U N N E R " − c p " RUNNER" -cp " RUNNER"cp"CLASSPATH” J A V A O P T S " JAVA_OPTS " JAVAOPTS"@"

启动源码中的 org.apache.spark.deploy.SparkSubmit 类中 -》submit -》 doRunMain (args class cn.itcast.spark.WordCount …)
通过反射的方式启动 启动传给程序的主类然后启动( Class.forName通过反射调用自定义类的main方法 org.apache.spark.examples.SparkPi 程序)

2、程序进入主程序后 此时进入主程序代码
(1)sparkcontext 初始化运行所需的所有环境(环境初始化、任务资源调度等)
(2)然后就是下面代码分(最后会被切成不同stage 不同stage依次提交其下下的多个任务)
在这里插入图片描述

3、sparkcontext 中初始化环境步骤(这里面是任务运行调度的全部 ) 欢迎留下不同意见

new sparkcontext ()会调用sparkcontext 的主构造器。
(1)首先主构造器中会创建单例ActorSystom 主要作用是为后期集群master 和work excuter 等之间通讯都要通过他
在这里插入图片描述

(2)、创建TaskScheduler ,其中包含了根据不同的spark 调度模式(yarn、local、standAlone )创建调度器。(fifo 和公平调度器等)

(3)、创建DAG调度器,器主要根据任务映射的有向无环图做stage 阶段的划分。(todo 下面源码继续)

(4)、taskScheduler.start : 任务调度器开始,其实现的功能 通过第一步的ActorSystem 创建 driveActor 和AppClient 然后实现 Appcient段和master work 服务器节点通讯和excuter work 和 drive之间进行通讯等。然后通过

在这里插入图片描述

通过
在这里插入图片描述

向master 发送注册消息 此时 需要跳的 master.scla 类的 RegisterApplication 方法内容如下
在这里插入图片描述
其中他做的几件事主要是:

1、首先把应用的信息放到内存中存储
2、master 向 clintActor发送注册成功的消息
3、Master开始调度资源(其实就是把任务启动到哪些Worker上)

其中 schedule 方法中 具体给出了任务分配到资源的方式,Master发送消息给Worker,把参数通过case class传递给Worker,让他启动Executor,

在这里插入图片描述

通过如下方法进行excuter的构建 然后进入ExecutorRunner的主构造器start 方法启动子线程启动excutor的线程,然后并完成对driver的注册,并启动线程池(默认为newDaemonCachedThreadPool)

注意:启动线程池的作用是等待任务划分完后将任务扔入到线程池中
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我没有CSDN开发的ChitGPT能够生成max30102的源代码。但是,你可以在Maxim Integrated的官方网站上找到相关的文档和示例代码。以下是一个基于Arduino平台的简单示例代码: ``` #include <Wire.h> #include "MAX30105.h" #include "heartRate.h" MAX30105 particleSensor; const byte RATE_SIZE = 4; // Increase this for more averaging. 4 is good. byte rates[RATE_SIZE]; // Array of heart rates byte rateSpot = 0; long lastBeat = 0; // Time at which the last beat occurred float beatsPerMinute; int beatAvg; void setup() { Serial.begin(115200); // Initialize sensor if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) // Use default I2C port, 400kHz speed { Serial.println("MAX30105 was not found. Please check wiring/power. "); while (1); } // Configure sensor particleSensor.setup(); // Configure sensor with default settings particleSensor.setPulseAmplitudeRed(0x0A); // Turn Red LED to low to indicate sensor is running particleSensor.setPulseAmplitudeGreen(0); // Turn off Green LED } void loop() { // Check if a new beat has occurred long irValue = particleSensor.getIR(); if (checkForBeat(irValue) == true) { // Calculate the average beats per minute beatAvg = 0; for (byte x = 0 ; x < RATE_SIZE ; x++) beatAvg += rates[x]; beatAvg /= RATE_SIZE; beatsPerMinute = 60 * beatAvg; Serial.print("Heart Beat: "); Serial.println(beatsPerMinute); } } boolean checkForBeat(long irValue) { boolean beatDetected = false; // Detect if the signal crosses the threshold if (irValue > 500) { if (millis() - lastBeat > 1000) // Only accept the beat if it's been more than 1 second since the last one { lastBeat = millis(); beatDetected = true; if (rateSpot < RATE_SIZE) { rates[rateSpot++] = 60 / ((lastBeat - lastTime) / 1000.0); lastTime = lastBeat; } } } return beatDetected; } ``` 此代码使用Maxim Integrated的MAX30105心率传感器来检测心率,并在串口监视器上显示结果。请注意,此代码仅用于演示目的,您需要根据您的具体要求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值