集群管理器
spark集群和Hadoop集群类似,采取主从结构,有两类节点:
集群管理者
Master节点(也叫驱动器(Driver)节点)。Master负责集群资源管理,接收spark job并分布到各个计算节点上进行计算。在集群中起到支配作用。一个集群中,活跃的Master只能有一个(HA部署下,可能有多个在热备)!
在Spark集群中,Master节点负责执行org.apache.spark.deploy.master.Master进程。Master会消耗少量内存,总体而言,对服务器性能要求不高。
集群工作者
Slave节点(也叫执行器(Executor)节点)。计算节点,负责执行计算任务,即实际的分布式计算,并将结果反馈给Master,由Master反馈给spark job调用者。Slave一般支持横向拓展,个数不限!
在Spark集群中,Slave节点负责执行
在Spark集群中,Slave节点负责执行org.apache.spark.deploy.worker.Worker进程。对Worker进程而言,CPU和内存分配越多越好!
Spark支持多种类型的集群管理器
Spark可以运行在多种集群管理器上,并通过集群管理器访问集群中的机器。这些集群管理器通常分为两大类:
独立集群管理器
集群中有一台Spark Master服务器,所有的Spark Slave服从Spark Master的管理。此时Spark Master就是集群管理器。Spark Master是Spark自带的集群管理器。
这种模式下,Spark集群的运行、管理、计算只依赖于Spark本身,不依赖于任何外部集群(可能Spark Master的HA依赖于Zookeeper)。
这种模式的Spark集群是单纯的Spark集群,其使用的计算数据多来自于本地磁盘文件系统(也可以在此模式下访问HDFS,不过此时要格外注意:Spark Slave节点需尽量靠近DataNode,避免过度的网络数据传输)。
共享集群管理器
Spark集群运行于其他集群的基础上。在这种集群中,Spark集群的管理就依赖于其他集群(如Hadoop YARN、Apache Mesos)。此时可以将Spark看作其他集群下的分布式应用层。
例如将Spark运行在YARN上,Spark集群此时就服从YARN的管理和调度,它可以让Spark在存储数据的物理节点上运行,以快速访问HDFS中的数据。
Spark集群部署
只有在Spark Standalone(独立集群管理器)模式下才需要事先部署集群。共享集群管理器时,由于Spark集群是由其他集群管理器(例如YARN)管理的,所以不需要单独再部署Spark集群,只需要在spark-submit --master yarn提交任务的时候,指定集群相关信息(如果环境变量HADOOP_CONF_DIR有效的话,会直接读HADOOP_CONF_DIR下hadoop集群相关信息)即可。
驱动器程序及其运行方式
驱动器程序
我们所编写的spark程序就是驱动器程序。驱动器程序包含一个main函数作为整个程序入口,通过一个SparkContext对象来访问Spark。
每个Spark应用都由一个驱动器程序来发起集群上的各种集群运算。SparkContext对象可以看作对Spark集群的一个连接。一旦获取了这个SparkContext对象,就可以通过它创建RDD,并在RDD上做各种转换/行动操作。这些计算任务在实际执行时,会被驱动器程序分发送到各个Spark计算节点(Salve节点)完成,然后在驱动器程序进行汇总,得到最终结果。
连接集群的方式
服务器模式:如果是独立Spark集群,那么Spark里面集群管理器就是Spark Master节点,两者是等同的。如果是共享集群,那么YARN会指定一个YARN节点(工作节点)作为Spark Master节点,运行org.apache.spark.deploy.master.Master进程,承担Spark集群的Master角色。不管怎么样,Spark集群里面必须由一个Spark Master节点,运行org.apache.spark.deploy.master.Master进程。服务器模式下,驱动器程序会被传输到Spark Master节点上,并运行在org.apache.spark.deploy.master.Master进程内部。这是生产环境常用的方式。
客户端模式:与服务器模式类似,集群中总有一个运行org.apache.spark.deploy.master.Master进程的节点,承担Spark集群的Master角色。但是此时驱动器程序是在本地运行(即运行spark-submit命令的机器),而非org.apache.spark.deploy.master.Master进程内部。驱动器程序可以运行在你的个人笔记本上,他通过与Spark Master节点(进程)通信,将计算任务分布到集群上。
spark-submit命令可以通过--deploy-mode参数指定运行方式,默认是客户端模式。
部署Spark Standalone集群
1、网络划分
192.168.186.241 sparkmaster
192.168.186.240 sparkslave1
192.168.186.237 sparkslave2
192.168.186.242 sparkslave3
2、修改各节点的/etc/hosts、/etc/hostname
$ sudo gedit /etc/hostname
sparkmaster
sparkslave1
sparkslave2
sparkslave3
$ sudo gedit /etc/hosts
192.168.186.241 sparkmaster
192.168.186.240 sparkslave1
192.168.186.237 sparkslave2
192.168.186.242 sparkslave3
安装ssh,使master可以免密登陆各个salve
####在master上
$ sudo apt-get install openssh-server
$ ssh-keygen -t rsa -N ""
$ ssh-copy-id -i ~/.ssh/id_rsa.pub yong@sparkmaster
$ ssh-copy-id -i ~/.ssh/id_rsa.pub yong@sparkslave1
$ ssh-copy-id -i ~/.ssh/id_rsa.pub yong@sparkslave2
$ ssh-copy-id -i ~/.ssh/id_rsa.pub yong@sparkslave3
3、在所有机器上下载、安装java环境,spark环境
$ gedit ~/.bashrc
export JAVA_HOME=/mnt/hgfs/java-env/jdk1.8.0_211
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
$ source ~/.bashrc
$ java -version
$ javac -version
$ tar xzf /mnt/hgfs/spark-cluster-env/spark-2.4.3-bin-hadoop2.7.tgz
$ gedit ~/.bashrc
export SPARK_HOME=/mnt/hgfs/spark-cluster-env/spark-2.4.3-bin-hadoop2.7
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
$ source ~/.bashrc
4、配置spark(所有机器配置都用一样,所以可以用同一份配置)
$ cp $SPARK_HOME/conf/slaves.template $SPARK_HOME/conf/slaves
$ gedit $SPARK_HOME/conf/slaves
sparkslave1
sparkslave2
sparkslave3
$ cp $SPARK_HOME/conf/spark-env.sh.template $SPARK_HOME/conf/spark-env.sh
$ gedit $SPARK_HOME/conf/spark-env.sh
export JAVA_HOME=/mnt/hgfs/java-env/jdk1.8.0_211
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=FILESYSTEM -Dspark.deploy.recoveryDirectory=/data/spark/recoveryDirectory"
export SPARK_MASTER_IP=sparkmaster
export SPARK_MASTER_PORT=7077
####all workers
$ sudo systemctl stop firewalld.service
$ sudo systemctl disable firewalld.service
5、启动集群
$ rm -rf $SPARK_HOME/logs/
$ rm -rf /tmp
$ rm -rf /data/spark/recoveryDirectory/
$ start-all.sh
#### http://sparkmaster:8080
#### if on worker ----> ERROR Worker: All masters are unresponsive! Giving up.
#export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=FILESYSTEM -Dspark.deploy.recoveryDirectory=/data/spark/recoveryDirectory"
6、访问web ui