文章目录
- 一,Spark Standalone架构
- (一)client提交方式
- (二)cluster提交方式
- 二,Spark集群拓扑
- 三,前提条件:安装配置了分布式Hadoop环境
- 四,在master虚拟机上安装配置Spark
- (一)将spark安装包上传到master虚拟机
- (二)将spark安装包解压到指定目录
- (三)配置spark环境变量
- (四)编辑spark环境配置文件
- (五)创建slaves文件,添加从节点
- 五,在slave1虚拟机上安装配置Spark
- (一)把master虚拟机上安装的spark分发给slave1虚拟机
- (二)将master虚拟机上环境变量配置文件分发到slave1虚拟机
- (三)在slave1虚拟机上让spark环境配置文件生效
- 六,在slave2虚拟机上安装配置Spark
- (一)把master虚拟机上安装的spark分发给slave2虚拟机
- (二)将master虚拟机上环境变量配置文件分发到slave2虚拟机
- (三)在slave2虚拟机上让spark环境配置文件生效
- 七,启动Spark Standalone集群
- (一)启动hadoop的dfs服务
- (二)启动Spark集群
- 八,访问Spark的WebUI
- 九,启动Scala版Spark Shell
一,Spark Standalone架构
Spark Standalone模式为经典的Master/Slave(主/从)架构,资源调度是Spark自己实现的。在Standalone模式中,根据应用程序提交的方式不同,Driver(主控进程)在集群中的位置也有所不同。应用程序的提交方式主要有两种:client和cluster,默认是client。可以在向Spark集群提交应用程序时使用–deploy-mode参数指定提交方式。
(一)client提交方式
集群的主节点称为Master节点,在集群启动时会在主节点启动一个名为Master的守护进程,类似YARN集群的ResourceManager;从节点称为Worker节点,在集群启动时会在各个从节点上启动一个名为Worker的守护进程,类似YARN集群的NodeManager。
Spark在执行应用程序的过程中会启动Driver和Executor两种JVM进程。
Driver为主控进程,负责执行应用程序的main()方法,创建SparkContext对象(负责与Spark集群进行交互),提交Spark作业,并将作业转化为Task(一个作业由多个Task任务组成),然后在各个Executor进程间对Task进行调度和监控。通常用SparkContext代表Driver。在上图的架构中,Spark会在客户端启动一个名为SparkSubmit的进程,Driver程序则运行于该进程。
Executor为应用程序运行在Worker节点上的一个进程,由Worker进程启动,负责执行具体的Task,并存储数据在内存或磁盘上。每个应用程序都有各自独立的一个或多个Executor进程。在Spark Standalone模式和Spark on YARN模式中,Executor进程的名称为CoarseGrainedExecutorBackend,类似运行MapReduce程序所产生的YarnChild进程,并且同时与Worker、Driver都有通信。
(二)cluster提交方式
Standalone cluster提交方式提交应用程序后,客户端仍然会产生一个名为SparkSubmit的进程,但是该进程会在应用程序提交给集群之后就立即退出。当应用程序运行时,Master会在集群中选择一个Worker进程启动一个名为DriverWrapper的子进程,该子进程即为Driver进程,所起的作用相当于YARN集群的ApplicationMaster角色,类似MapReduce程序运行时所产生的MRAppMaster进程。
二,Spark集群拓扑
Spark Standalone模式的集群搭建需要在集群的每个节点都安装Spark,集群角色分配如下表所示:
节点 | 角色 |
---|---|
master | Master |
slave1 | Worker |
slave2 | Worker |
三,前提条件:安装配置了分布式Hadoop环境
启动hadoop集群
访问Hadoop WebUI界面
四,在master虚拟机上安装配置Spark
(一)将spark安装包上传到master虚拟机
(二)将spark安装包解压到指定目录
执行命令:tar -zxvf spark-3.3.2-bin-hadoop3.tgz -C /opt
(三)配置spark环境变量
执行命令:vim /etc/profile
# Spark 环境变量
export SPARK_HOME=/opt/spark-3.3.2
export PATH=$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH
存盘退出后,执行命令:source /etc/profile,让配置生效
查看spark安装目录(bin、sbin和conf三个目录很重要)
(四)编辑spark环境配置文件
进入spark配置目录后,执行命令:cp spark-env.sh.template spark-env.sh与vim spark-env.sh
export JAVA_HOME=/usr/java/latest
export SPARK_MASTER_HOST=master
export SPARK_MASTER_PORT=7077
- JAVA_HOME:指定JAVA_HOME的路径。若集群中每个节点在/etc/profile文件中都配置了JAVA_HOME,则该选项可以省略,Spark集群启动时会自动读取。为了防止出错,建议此处将该选项配置上。
- SPARK_MASTER_HOST:指定集群主节点(master)的主机名,此处为master。
- SPARK_MASTER_PORT:指定Master节点的访问端口,默认为7077。
存盘退出,执行命令:source spark-env.sh,让配置生效
(五)创建slaves文件,添加从节点
执行命令:vim slaves,添加两个从节点主机名
五,在slave1虚拟机上安装配置Spark
(一)把master虚拟机上安装的spark分发给slave1虚拟机
执行命令:scp -r $SPARK_HOME root@slave1:$SPARK_HOME
(二)将master虚拟机上环境变量配置文件分发到slave1虚拟机
在master虚拟机上,执行命令:scp /etc/profile root@slave1:/etc/profile
在slave1虚拟机上,执行命令:source /etc/profile
,让环境配置生效
(三)在slave1虚拟机上让spark环境配置文件生效
在slave1虚拟机上,进入spark配置目录,执行命令:source spark-env.sh
六,在slave2虚拟机上安装配置Spark
(一)把master虚拟机上安装的spark分发给slave2虚拟机
执行命令:scp -r $SPARK_HOME root@slave2:$SPARK_HOME
(二)将master虚拟机上环境变量配置文件分发到slave2虚拟机
在master虚拟机上,执行命令:scp /etc/profile root@slave2:/etc/profile
在slave2虚拟机上,执行命令:source /etc/profile
,让环境配置生效
(三)在slave2虚拟机上让spark环境配置文件生效
在slave2虚拟机上,进入spark配置目录,执行命令:source spark-env.sh
七,启动Spark Standalone集群
Spark Standalone集群使用Spark自带的资源调度框架,但一般我们把数据保存在HDFS上,用HDFS做数据持久化,所以Hadoop还是需要配置,但是可以只配置HDFS相关的,而Hadoop YARN不需要配置。启动Spark Standalone集群,不需要启动YARN服务,因为Spark会使用自带的资源调度框架。
(一)启动hadoop的dfs服务
在master虚拟机上执行命令:start-dfs.sh
(二)启动Spark集群
执行命令:start-all.sh
查看start-all.sh的源码启动Master与Worker的命令
# Start Master
"${SPARK_HOME}/sbin"/start-master.sh
# Start Worker
s"${SPARK_HOME}/sbin"/start-slaves.sh
可以看到,当执行start-all.sh命令时,会分别执行start-master.sh命令启动Master,执行start-slaves.sh命令启动Worker。
注意:若spark-evn.sh中配置了SPARK_MASTER_HOST属性,则必须在该属性指定的主机上启动Spark集群,否则会启动不成功;若没有配置SPARK_MASTER_HOST属性,则可以在任意节点上启动Spark集群,当前执行启动命令的节点即为Master节点。
启动完毕后,分别在各节点执行jps命令,查看启动的进程。若在master节点存在Master进程,slave1节点存在Worker进程,slave2节点存在Worker进程,则说明集群启动成功。
查看master节点进程
查看slave1节点进程
查看slave2节点进程
八,访问Spark的WebUI
在浏览器里访问:http://master:8080
在浏览器访问:http://slave1:8081
在浏览器访问:http://slave2:8081
九,启动Scala版Spark Shell
执行命令:spark-shell --master spark://master:7077
(注意–master,两个-不能少)
在slave1的/Txt目录里执行命令:vim test.txt
hello hadoop world
hello spark world
hello java and scala
hello big data world
hello hadoop and spark
在HDFS上创建park目录,将test.txt上传到HDFS的/park目录
读取HDFS上的文件,创建RDD,执行命令:val rdd = sc.textFile("hdfs://master:9000/park/test.txt")
(说明:val rdd = sc.textFile(“/park/test.txt”)读取的依然是HDFS上的文件,绝对不是本地文件)
收集rdd的数据,执行命令:rdd.collect
进行词频统计,按单词个数降序排列,执行命令:val wordcount = rdd.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).sortBy(_._2, false)
与 wordcount.collect.foreach(println)