[Spark07]Spark运行模式及集群架构

1、spark的运行模式:local/yarn/standalone/k8s/mesos

2、spark核心配置文件:spark-defaults.conf、spark-env.sh

3、spark的jars目录:在saprk1.x中该目录下只有一个大的包,所有jar包都在这个包里面。在spark2.x该jars目录下就有很多的小的jar包。这儿有一个spark的优化点,以后再说。

4、执行spark的启动命令时,出现问题现有的打印在屏幕上的日志可能太少不便于debug,此时可进入spark的conf目录下,该目录下有一个log4j.properties.template文件,拷贝一份,将其中“log4j.rootCategory=INFO,console”中的"INFO"改成"DEBUG"即可。

####补充一下日志输出级别:

其中 [level] 是日志输出级别,共有5级:

[Spark07]Spark运行模式及集群架构 FATAL      0  
[Spark07]Spark运行模式及集群架构ERROR     
 3 
  为严重错误 主要是程序的错误
[Spark07]Spark运行模式及集群架构WARN      
 4 
  为一般警告,比如session丢失
[Spark07]Spark运行模式及集群架构INFO      
 6 
  为一般要显示的信息,比如登录登出
[Spark07]Spark运行模式及集群架构DEBUG     
 7  为程序的调试信息

5、local模式:

    配置:编译好spark,将JAVA_HOME加入spark_env.sh文件即可。

    启动方式:在${SPARK_HOME}/bin下执行./spark-shell --master local[n] 

            ####n代表该作业所需要消耗的core的数量

可以将SPARK_HOME加入系统环境变量哦

6、yarn模式:

    此时的spark只是作为一个提交作业的客户端,这种模式不会起任何spark的进程。

    1)配置:基于local模式下,将hadoop配置文件目录加入spark的环境变量中。

        vi spark-env.sh

            HADOOP_CONF_DIR=/home/hadoop/apps/hadoop/etc/hadoop

    2)建议:将hive-site.xml加入spark配置文件目录

        这个在同时执行多个作业时可以避免一些问题,具体什么问题大佬们自己测试哦。

    3)启动方式:在${SPARK_HOME}/bin下执行"./spark-shell --master yarn --jars mysql驱动包绝对路径"即可

        #yarn要先启动哦

可以将SPARK_HOME加入系统环境变量哦,并且建议将SPARK_CONF_DIR配置在系统环境变量中。

7、standalone模式(自带的spark集群模式):

        主节点Master,从节点Worker。

    1) 配置:

    vi spark-env.sh 添加

        SPARK_MASTER_HOST=192.168.149.141 ##配置Master节点

        SPARK_WORKER_CORES=2 ##配置应用程序允许使用的核数(默认是所有的core)

        SPARK_WORKER_MEMORY=2g  ##配置应用程序允许使用的内存(默认是一个G)

    vi slaves 添加

    192.168.149.142

     192.168.149.143

##slaves配置spark集群的Worker节点,Master节点也可以配置一个Worker节点

可以将SPARK_HOME加入系统环境变量哦

2)启动spark集群:./sbin/start-all.sh

3)网页UI在ip:8080上

4)提交作业:./bin/spark-shell --master spark://${Master的ip或主机名}:7077

    提交一个作业会默认占光所有的core,该作业未完成重新开启一个作业,新作业则没有core

其实对于standalone模式和Mesos模式 ,我们执行作业时可以通过参数控制作业所消耗的core数量,例如,我们可以使用命令“./bin/spark-shell --master spark://${Master的ip或主机名}:7077 --total-excutor-cores 1”来指定该spark-shell作业占用的core数为1。一个core默认占用一个G的内存。

8、spark核心概念

1)Application:用户基于spark的代码,由一个Driver和多个Excutor组成。

2)Application jar:将用户基于spark的代码打包成的jar包

3)Driver program:一个运行Main方法的进程,负责创建SparkContext。

4)Cluster Manager:负责获取集群资源的外部服务(如standalone模式的Master和yarn模式的RM)

5)Deploy mode:运行模式,如standalone模式,yarn模式,local模式,mesos模式

6)Excutor:在工作节点(如standalone模式的Worker和yarn模式的NM)起的进程,可以运行task,也可以将数据保存在内存和磁盘中。每个应用程序都有自己的Excutor。

7)Task:最小的工作单元。

8)Job:一个Job有许许多多的Task,每一个Action操作都会触发一个Job

9)Stage:一个job被拆分成许多的Stage,一个Stage包含多个Task,Stage是提交作业的最小单位,Stage之间彼此依赖。

 

一个application包括一个driver和多个executor,driver是一个进程,运行main方法,创建SparkContext,executor也是进程,用来处理task和将数据保存在内存或磁盘中,task是最小的工作单元,一个job可能产生多个stage,每个stage包含多个task,提交作业时以stage为单位提交到executor上执行,executor运行在worker节点或NM中。

9、sparkStandalone模式架构

[Spark07]Spark运行模式及集群架构

在Spark的standalone模式中,应用程序作为彼此独立的一组进程运行,这组进程受到SparkContext的管理。

集体来说,运行一个集群,首先SparkContext连接到cluster manager(负责在应用程序间分配资源),一旦连接成功,SparkContext就会获取集群的Worker Node的信息,并将作业信息提交给Worker Node执行。


关于这个体系结构,有几个值得注意的地方:

1、每个Application获取专属的executor进程,该进程在Application期间一直驻留,并以多线程方式运行Task。这种Application隔离机制是有优势的,无论是从调度角度看(每个Driver调度他自己的任务),还是从运行角度看(来自不同Application的Task运行在不同JVM中),当然这样意味着Spark Application不能跨应用程序共享数据,除非将数据写入外部存储系统(在一些场景中是需要跨应用程序共享数据的,我们可以用Alluxio实现)

2、Spark与底层的资源管理器无关,只要能够获取executor进程,并能保持相互通信就可以了。

3、在整个作业生命周期内,driver负责监听和接受来自excutor的请求,请保证它们之间可以相互通信。

4、driver将作业发送到工作节点,所以driver和工作节点最好近一些。