1.输出1到100的数字中x,y轴的和在单位圆中的点,并统计个数
object sparkPi {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf()
conf.setAppName("sparkPi")
conf.setMaster("local")
val context: SparkContext = new SparkContext(conf)
val value: RDD[Int] = context.parallelize(1 to 100)
val value1: RDD[Int] = value.map(one => {
var x = random() * 2 - 1
var y = random() * 2 - 1
if (x * x + y * y <= 1) 1 else 0
})
val count: Int = value1.reduce((v1, v2) => v1 + v2)
println(count)
}
}
2.基于standalone模式提交任务
(1) standalone-client提交任务方式
程序写完进行打包,上传到Master节点虚拟机上,打包之前需要clear把target清空然后把master删除,然后package
在虚拟机终端spark-3.0.0/bin,
./spark-submit --master spark://hadoop102:7077 --class 包名+类名 虚拟机中路径
./spark-submit --master spark://hadoop102:7077 --class sparkPi /opt/software/submit.jar
图解:
1. client模式提交任务后,会在客户端启动Driver进程。
2. Driver会向Master申请启动Application启动的资源。
3. Master收到请求之后会在对应的Worker节点上启动Executor
4. Executor启动之后,会注册给Driver端,Driver掌握一批计算资源。
5. Driver端将task发送到worker端执行。worker将task执行结果返回到Driver端。
(2)standalone-cluster 提交任务方式
./spark-submit --master spark://hadoop102:7077
–deploy-mode cluster
–类名+包名 jar包位置
3.spark基于yarn模式两种提交任务方式
(1)yarn-client提交任务方式
spark-3.0.0/bin下:
spark-submit–master yarn client --class 包名+类名 打包的程序绝对路径
执行流程:
- 客户端提交一个Application,在客户端启动一个Driver进程。
- 应用程序启动后会向RS(ResourceManager)发送请求,启动AM(ApplicationMaster)的资源。
- RS收到请求,随机选择一台NM(NodeManager)启动AM。这里的NM相当于Standalone中的Worker节点。
- AM启动后,会向RS请求一批container资源,用于启动Executor.
- RS会找到一批NM返回给AM,用于启动Executor。
- AM会向NM发送命令启动Executor。
- Executor启动后,会反向注册给Driver,Driver发送task到Executor,执行情况和结果返回给Driver端。
(2)yarn -cluster提交任务方式
spark-submit–master yarn client --cluster 包名+类名 打包的程序绝对路径
执行流程:
- 客户机提交Application应用程序,发送请求到RS(ResourceManager),请求启动AM(ApplicationMaster)。
- RS收到请求后随机在一台NM(NodeManager)上启动AM(相当于Driver端)。
- AM启动,AM发送请求到RS,请求一批container用于启动Executor。
- RS返回一批NM节点给AM。
- AM连接到NM,发送请求到NM启动Executor。
- Executor反向注册到AM所在的节点的Driver。Driver发送task到Executor。