一 ,SparkPi 源码分析 :
1 ,在 linux 中把例子整出来 :
2 ,得到 jar 包 :
3 ,把他整到 idea 中 :
4 ,看这个类 : SparkPi
5 ,源码查看 : 读懂它,老师已经添加详细注释
- 思路 :
- 代码 :
package day01.demo01.pi
import org.apache.spark.{SparkConf, SparkContext}
import scala.math.random
object MyPi {
def main(args: Array[String]): Unit = {
var sc = new SparkContext(new SparkConf().setAppName("pi").setMaster("local"))
// 系数取值 : 如果传参了,就ongoing第一个参数,没传参的话,就用默认值 2
val slices = if (args.length > 0) args(0).toInt else 2
// n : 比如我们传进来参数 100,n = 1000 0000
val n = math.min(100000L * slices, Int.MaxValue).toInt
// 打点 n 个,slices 是分区个数 ( count 就是有多少个点,落在圆内 )
val count = sc.parallelize(1 until n, slices).map { i =>
// -1 --> 1
val x = random * 2 - 1
val y = random * 2 - 1
// 落在圆内( x方+y方<r方 ),就取值 1 ,落在圆外就取值 0 ( 取值 n 次,所以,这个 n ,指的是次数,并不直接参与预算 )
if (x*x + y*y <= 1) 1 else 0
// 一共有多少个点落在圆内
}.reduce(_ + _)
// 思考 : π1^2=面积
// count / (n - 1) = 比例 : 圆内的点的比例,占了正方形的几分之几
// count / (n - 1) * (2*2) = 面积
// π = 4.0 * count / (n - 1)
println(s"Pi is roughly ${4.0 * count / (n - 1)}")
sc.stop()
}
}
6 ,获得知识 :
- 数组 --> rdd
val rdd:RDD[String] = sc.parallelize(Array[String](1,2,3,4))
val rdd:RDD[String] = sc.makeRDD(Array[String](1,2,3,4))
- reduce 求和 :
def main(args: Array[String]): Unit = {
var conf = new SparkConf().setAppName("rd").setMaster("local")
var sc = new SparkContext(conf)
val rdd1: RDD[Int] = sc.parallelize(Array[Int](1,2,3,4,5))
val i: Int = rdd1.reduce(_+_)
println(i)
sc.stop()
}
- 指定分区个数 :
数据 : 1 --> n
分区数 : slices
spark.sparkContext.parallelize(1 until n, slices)
7 ,运行结果 :
8 ,在集群中运行 :
cd /export/servers/spark-2.3.1-bin-hadoop2.6/bin
./spark-submit --master spark://node01:7077 --class org.apache.spark.examples.SparkPi /export/servers/spark-2.3.1-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.3.1.jar 100
9 ,得到结果 :
二 ,搭建 Spark 提交任务的客户端
1 ,原理 :
- 把 spark 安装包严封不动的复制到另一台机器上即可
- 为什么 : 因为主机是 node01 ,从节点是 node02 , node03 ,即使把 spark 安装包复制到 node04 了,node04 也只是个提交任务的工具而已,没有别的用。
2 ,做法 :
将 spark 安装包复制到另一台机器即可
三 ,spark on yarn 搭建 :
1 ,停止 spark 集群 :
cd /export/servers/spark-2.3.1-bin-hadoop2.6/sbin
./stop-all.sh
2 ,修改 yarn 配置 : ( 三台机器 )
- 关闭虚拟内存检查
cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
vim yarn-site.xml
<!-- 关闭虚拟内存检查 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
scp yarn-site.xml root@node02:$PWD
scp yarn-site.xml root@node03:$PWD
- 也可以 : 修改虚拟内存 :
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>9000</value>
<discription>每个任务最多可用内存,单位MB,默认8192MB</discription>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>200</value>
<discription>每个任务最少可用内存,单位MB</discription>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>4.1</value>
<discription>container最少使用的虚拟内存比例</discription>
</property>
3 ,修改 - 环境变量 :
vim /etc/profile
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
source /etc/profile
4 ,修改 - spark-env.sh
cd /export/servers/spark-2.3.1-bin-hadoop2.6/conf
vim spark-env.sh
# HADOOP_CONF_DIR
export HADOOP_CONF_DIR=/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/
5 ,基于 yarn 提交任务 : 理论
- 不需要 spark 集群
- 只要启动 yarn 就可以了
- 为什么 :
1 ,算法是我们写的
2 ,计算引擎是 Spark 的
3 ,资源是由 yarn 分配的
6 ,基于 yarn 提交任务 : 动手
- 启动 hdfs : node01
start-dfs.sh - 启动 yarn :node01
start-yarn.sh - 启动历史任务 :node01
mr-jobhistory-daemon.sh start historyserver - 提交 SparkPi :node01
cd /export/servers/spark-2.3.1-bin-hadoop2.6/bin
./spark-submit --master yarn --class org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.11-2.3.1.jar 10000
7 ,正确的结果 :