1 分布式估算圆周率
- 计算原理
假设正方形的面积S等于x²,而正方形的内切圆的面积C等于Pi×(x/2)²,因此圆面积与正方形面积之比C/S就为Pi/4,于是就有Pi=4×C/S。
可以利用计算机随机产生大量位于正方形内部的点,通过点的数量去近似表示面积。假设位于正方形中点的数量为Ps,落在圆内的点的数量为Pc,则随机点的数量趋近于无穷时,4×Pc/Ps将逼近于Pi。
2 程序设计
package com.oldlu import scala.math.random import org.apache.spark.{SparkConf, SparkContext} /** * @author oldlu * @date 2021/11/2 * @version 1.0 */ object SparkPi { def main(args: Array[String]) { val conf = new SparkConf().setAppName("spark Pi") val spark = new SparkContext(conf) val slices = if (args.length > 0) args(0).toInt else 2 val n = 100000 * slices val count = spark.parallelize(1 to n, slices).map { i => val x = random * 2 - 1 val y = random * 2 - 1 if (x * x + y * y < 1) 1 else 0 }.reduce(_ + _) println("Pi is roughly " + 4.0 * count / n) spark.stop() } }
单击选择“Application”后,可在弹出对话框中设置参数,如图9-21所示,其中,“Name”设置为“sparkPi”;“Main class”设置为“com.csu.sparkPi”;“VM options”为“-Dspark.master=local -Dspark.app.name=sparkPi”;“Working directory”为系统自动设置的值;“Program arguments”不用填写;其余设置保持默认即可。
3 分布式运行
分布式运行是指在客户端(Client)以命令行的方式向Spark集群提交jar包的运行方式,所以需要将上述sparkPi程序编译成jar包(俗称打jar包)。
3.1 采用本地模式提交sparkAPP.jar
./spark-submit --master local --class com.oldlu.SparkPi /usr/local/sparkdemo/SparkPi.jar
3.2 采用Yarn-client或Yarn-cluster模式提交
注意,上述示例是作者计算机上的情形,读者看到的结果可能有一些差异。
读者也可以采用Yarn-client模式运行程序,这时只需要将提交命令中的“yarn-cluster”改为“yarn-client”即可,输出结果将直接显示在提交作业的终端中。
要正确执行上述命令,必须确保Spark集群中的Yarn已经启动。如果读者不能成功执行该命令,应首先检查一下系统是否启动了Yarn,如果没有,就需要设法启动它。例如,可以简单地通过启动Hadoop来启动Yarn,因为有的用户可能只安装了Hadoop自带的Yarn。