目录
1. 官方求PI案例(直接运行已打成依赖jar包中的指定class)
Local模式就是Spark运行在单节点的模式,通常用于在本机上练手和测试,分为以下三种情况:
(1)local:所有计算都运行在一个线程中;
(2)local[K]:指定K个线程来运行计算,通常CPU有几个Core(线程数),就指定K为几,最大化利用CPU并行计算能力;
(3)local[*]:自动设定CPU的最大Core数;
在API操作中体现在SparkConf的环节(配置信息),将Master(资源管理器)设定为哪种模式,对应几个线程:
val conf = new SparkConf().setMaster("local[*]").setAppName("Application")
1. 官方求PI案例(直接运行已打成依赖jar包中的指定class)
首先启动单节点的HDFS(单节点已安装完毕Spark和Hadoop)
[kevin@hadoop100 spark]$ bin/spark-submit \
> --class org.apache.spark.examples.SparkPi \
> --executor-memory 1G \
> --total-executor-cores 2 \
> ./examples/jars/spark-examples_2.11-2.1.1.jar \
> 100
bin/spark-submit是Spark的bin目录下一个提交任务脚本
executor-memory,是给executor(具体计算功能的承担者)分配1G的内存
total-executor-cores,指定每个executor使用的cup核数为2个
最后的jar包是已经打成依赖的jar包;这个jar包可以是本地、也可以是HDFS中hdfs://、也可以是来自文件系统file:// path
运行结果如下,该算法是利用蒙特·卡罗算法求PI
Pi is roughly 3.1409291140929114
2. 编写scala语言实现功能
这里写一个WordCount的测试Demo程序:
(1)在spark/input目录下,创建1.txt和2.txt文件
[kevin@hadoop100 input]$ cat 1.txt
hello spark
hello world
[kevin@hadoop100 input]$ cat 2.txt
hello hi
kevin spark
(2)启动spark-shell
[kevin@hadoop100 spark]$ bin/spark-shell
....
scala>
(3)运行WordCount的scala程序
scala> sc.textFile("input").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
res0: Array[(String, Int)] = Array((world,1), (kevin,1), (hello,3), (spark,2), (hi,1))
textFile("input"):读取本地文件,spark/input文件夹数据;
flatMap(_.split(" ")):压平操作,按照空格分割符,将文件每一行数据映射(Map)成一个个单词;
map((_,1)):对每一个单词操作,将单词映射为元组(单词,1);
reduceByKey(_+_):形同key的value值进行聚合,相加;
collect:将数据收集到Driver端展示。
(4)登录4040端口,可以查看DAG图
发现Executor中分成了两个stage来运算。
3. 整个Spark运算的流程:
Client提交Spark任务;
Driver驱动器中初始化sc、任务划分、任务调度;然后像资源管理器ApplicationMaster注册应用程序,AM向Master申请资源,并分配给具体的Worker工作节点;
在Worker中的Executor执行器执行任务,执行设定的textFile、flatMap等操作算子,
最后通过collect算子反向注册给Driver,在Driver端显示运行结果。
4. Spark中的Driver和Executor
(1)Driver(驱动器):负责任务调度
它负责开发人员编写的用来创建SparkContext、创建RDD,以及进行RDD的转化操作和行动操作代码的执行。
用API操作,Driver就是编写SparkContext的那个main方法的进程;
用spark shell操作,启动shell时会自动生成一个叫做sc的SparkContext对象;
主要作用:
` 把用户程序转化成Job
· 跟踪Executor的运行状况
· 为Executor节点调度任务
· UI展示应用程序执行结果
(2)Executor(执行器)
存在于Worker工作节点中,负责具体的spark运算任务的进程,并且可以实现HA和负载均衡,负责:
· 运行编写的spark任务,并将结果返回给Driver
· RDD直接缓存在Executor中,实现基于内存的spark运算
5. 总结Spark中各种组成部分的关系
Spark中,Master和ApplicationMaster相当于Yarn中的ResourceManager和ApplicationMaster;前者分配全局资源,后者为任务向Master申请资源并分配给Worker;
(1)Master和Applcation负责资源调度;
(2)Driver负责任务调度;
(3)Worker是具备资源环境的工作节点;
(4)Executor在Worker中实现具体计算;
(5)RDD直接缓存在Executor中,基于内存计算。
一个物理节点可以有多个Worker,一个Worker可以包含多个Executor,一个Executor拥有多个Core和Memory