Scala实践Spark(五)Spark集群运行

运行架构

Spark运行,一个节点负责中央协调,调度各个分布式工作节点,称为Driver,与之对应的工作节点称为执行器节点。Spark可以通过自带的集群管理器运行,称为独立集群管理器,也可以在Yarn和Mesos上运行

Driver

驱动器执行程序的main(),主要包含两个职责:

  • 把用户程序转为多个物理执行的单元,称为task。Spark程序隐式创建出了一个由操作组成的逻辑上的有向无环图,当Driver程序运行,它会将这个逻辑图转为物理执行计划。task是最小的工作单元。
  • 为执行器调度任务,有了物理计划后,Spark驱动程序必须在各执行器进程间协调任务的调度。执行器进程启动后,会向驱动器进程注册自己。每个执行器节点代表一个能够处理任务和存储RDD数据的进程。
    Spark会根据当前的执行器节点集合,尝试把所有任务基于数据所在位置分配各合适的执行器进程。任务执行时,执行器进程会把缓存数据存储起来,而驱动器进程同样会跟踪缓存数据的位置,并利用这些位置信息调度以后的任务,以减少网络传输。

Executor

执行器节点是一种工作进程,负责在Spark作业运行任务,相互独立。Spark应用启动,执行器节点同时启动,伴随整个Spark应用的生命周期。如果有执行器节点崩溃或异常,Spark应用可以继续执行。执行程序有两大作用:

  • 运行组成Spark应用的任务,将结果返回驱动器进程
  • 通过自身的块管理器(Block Manager)为用户程序中要求缓存的RDD提供内存式存储,RDD是直接缓存在执行器进程内的,任务可以充分利用缓存数据加速运算。

集群管理器

Spark依赖集群管理器启动执行器节点,某些情况也依赖集群管理器启动驱动器节点。集群管理器是Spark中的可拔插式组件。
注意:Spark使用驱动器节点和执行器节点描述执行Spark应用的进程。而主节点和工作节点表示集群管理器的中心化部分和分布式的部分。这两个概念很容易混淆。Yarn会启动一个资源管理器的主节点守护进程,以及一系列节点管理器的工作节点守护进程。在Yarn的工作节点上,Spark不仅可以运行执行器进程,还可以运行驱动器进程。

启动程序

不管哪一种集群管理器,都可以使用Spark提供的spark-submit将应用提交到集群管理器上,通过不同的配置选项可以连接相应的集群管理器、控制使用的资源数量,在Yarn的工作节点也可以运行驱动器节点,也就是集群内部运行驱动器节点,而对于其他的集群管理器,驱动器节点只能被运行在本地机器上。
回顾下集群运行Spark应用的详细过程:

  • 1.用户通过spark-submit脚本提交应用
  • 2.spark-submit脚本启动驱动器程序,调用用户定义的main()方法
  • 3.驱动器程序与集群管理器通信,申请程序以启动执行器节点
  • 4.集群管理器为驱动器程序启动执行器节点
  • 5.驱动器进程执行用户应用的操作,根据程序所定义的对RDD的转化操作和行动操作,驱动器节点把工作已任务的形式发送到执行器进程
  • 6.任务在执行器程序中进行计算并保存结果
  • 7.如果驱动器程序的main()方法退出,或者调用了SparkContext.stop(),驱动器程序会终止执行器进程,并通过集群管理器释放资源。

spark-submit部署应用

贴个官网文档比较清晰 Submitting Application

打包代码与依赖

我们可以通过–jars提交单独的jar依赖,但常规的做法是构建工具生成单个大JAR包,包含应用所需的所有依赖常用的构建工具是Maven和sbt。
Maven的pom.xml文件,包含工程的相关信息、引用的spark依赖、构建大JAR的插件
sbt目录结构与Maven相似,在工程的根目录,创建一个叫build.sbt的构建文件,源码放在src/main/scala,在build.sbt还需要引用一个插件来创建项目的组合JAR,要使用这个插件需要在project/目录创建一个小文件来列出对插件的依赖,如project/assembly.sbt

依赖冲突

当用户应用与Spark本身依赖同一个库可能发生依赖冲突导致程序崩溃。依赖冲突通常表现为Spark作业执行过程中抛出NoSuchMethodError、ClassNotFoundException或其他与类加载相关的JVM异常。对于这种问题,有两种解决方式:一是修改你的应用,使其使用的依赖库的版本与Spark所使用的相同,二是使用通常被称为"shading"的方式打包引用。

Spark应用内与应用间调度

在调度多用户集群时,Spark主要依赖集群管理器来在Spark应用间共享资源。当Spark应用向集群管理器申请执行器节点时,应用收到的执行器节点个数可能比它申请的更多或更少,这取决于集群的可用性与争用。许多集群支持队列,可以为队列定义不同优先级或容量限制。
Spark应用有一种特殊情况,就是那些长期运行的应用。Spark SQL中的JDBC服务器就是一个长期运行的Spark应用。当JDBC服务器启动后,它会从集群管理器获得一系列执行器节点,然后就成为用户提交SQL查询的永久入口。由于这个应用本身就是为多用户调度工作的,所以它需要一种细粒度的调度机制来强制共享资源。Spark提供了一种用来配置应用内调度策略的机制。Spark内部的公平调度器会让长期运行的应用定义调度任务的优先级队列。详细还是去了解官方文档

集群管理器

独立集群管理器

启动独立集群管理器,将配置好的Spark复制到所有机器的相同目录,并配置无密码登录,在主节点的conf/slaves文件填上所有工作节点的主机名。sbin/start-all.sh启动集群

提交应用spark-submit --master spark://masternode:7077 yourapp

独立集群管理器支持两种部署模式,在这两种模式中,Driver运行在不同的地方。在客户端模式中,驱动器程序会运行在你执行spark-submit的机器上,是spark-submit的一部分。这意味着你可以直接看到驱动器程序的输出,也可以直接输入数据进去(交互式的shell),但是这要求你提交应用的机器与工作节点间有很快的网速。相反,集群模式下,驱动器程序会作为某个工作节点上一个独立的进程运行在独立集群管理器内部。它也会连接主节点来申请执行器节点。这种模式下的spark-submit是“一劳永逸”型,你可以在应用运行时关闭电脑,还可以通过集群管理器的网页用户界面访问应用的日志,项spark-submit传递–deploy-mode cluster参数切换到集群模式
配置资源用量,多应用间共享Spark集群,你需要决定在执行器间分配资源。独立集群管理器使用基础的调度策略,允许限制各个应用的用量来让多个应用并发执行。Apache Mesos支持应用运行时的更动态的资源共享,Yarn有分级队列的概念,可以让你限制不同类别的应用的用量。
独立集群管理器,资源分配由下面两个设置:

  • 1.执行器进程内存--executor-memory 每个应用在每个工作节点最多拥有一个执行器进程(虽然一个从节点只能运行一个执行器进程,但一台机器可以运行多个从节点),这个配置项能够控制执行器节点占用工作节点的多少内存。默认1G,可能需要提高这个值充分利用机器。
  • 占用核心总数的最大值,一个应用所有执行器进程所占用的核心总数。默认是无限--total-executorcores参数设置这个值,或者在Spark配置文件设置spark.cores.max。我们可以从独立集群管理器的网页端查看资源分布情况(http://master:8080)

最后,独立集群管理器默认会为每个应用使用尽可能分散的执行器进程,例如,你有一个20个物理节点的集群,每个物理节点是一个四核的机器,然后你使用--executor-memory 1G和--total-executorcores 8提交应用,Spark就会在不同的机器上启动8个执行器进程,每个1GB内存。Spark默认这样做,以尽量实现对于运行在相同机器上的分布式文件系统(HDFS)的数据的本地化,因为这些文件系统通常也把数据分散到所有物理节点,我们可以设置spark.deploy.spreadOut为false要求Spark把执行器进程合并到尽量少的工作节点上,这样的情况下,之前的应用只会得到两个执行器节点,每个有1GB和4个核心。
高度可用性,当在生产环境运行,你会希望你的独立模式始终能够接收新的应用,哪怕当前集群所有的节点都崩溃了。独立模式能够很好的支持工作节点的故障。如果你想主节点也拥有高度可用性,Spark还支持使用Apache ZooKeeper维护多个备用的主节点,并在一个主节点失败切换到新的主节点。

Hadoop Yarn

Yarn是Hadoop2.0引入的集群管理器,可以让多种数据处理框架运行在一个共享的资源池,并且通常安装再与Hadoop HDFS相同的物理节点上。在这样配置的Yarn集群运行Spark很有意义,它可以让Spark在存储数据的物理节点上运行,以快速访问HDFS中的数据。
在Spark使用Yarn,设置指向你的Hadoop配置目录的环境变量,然后使用spark-submit向一个特殊的主节点URL提交作业即可。

export HADOOP_CONF_DIR="..."
spark-submit --master yarn yourapp

和独立集群一样,有两种将应用连接到集群的模式,客户端模式和集群模式,客户端模式应用的驱动器程序运行在提交应用的机器上,而集群模式驱动器程序运行在一个yarn内部,通过--deploy-mode参数设置不同的模式。
Spark的交互式shell以及pyspark也都可以运行在Yarn上,只要设置好HADOOP_CONF_DIR并对这些应用使用--master yarn即可。注意,这些应用从用户处获取输入,所以只能运行在客户端模式下。
配置资源用量,当在Yarn运行,根据你在spark-submit或spark-shell等脚本的--num-executors标记中设置执行器节点,设置--executor-memory设置每个执行器的内存用量,--executor-cores设置每个执行器进程从Yarn占用的核心数目。对于给定的硬件资源,Spark
通常在用量较大而总数较少的执行器组合表现更好,这样Spark可以优化各执行器进程的通信。然而一些集群限制了每个执行器进程的最大内存(默认8G),不让你使用更大的执行器进程。
某些Yarn集群被设置为将应用调度到多个队列中,使用--queue选项选择你的队列的名字。

Apache Mesos和Amazon EC2

这里暂时省略,用到再仔细看下

选择合适的集群管理器

  • 从零开始,可以先选择独立集群管理器,安装最简单,如果只使用Spark,独立集群管理器提供与其他集群管理器完全一样的全部功能。
  • 对于Hadoop发行版,Yarn已经预装好了。
  • Mesos相对于Yarn和独立模式的一大优点在于其细粒度共享的选项,该选项可以将类似Spark shell这样的交互式应用的不同命令分配到不同CPU上,这对于多用户同时运行交互式shell的用例更有用处。
  • 最好能把Spark运行在运行HDFS的节点上,这样可以快速访问存储,可以自行在同样的节点安装Mesos或独立集群管理器,如果使用Yarn,Yarn和HDFS通常安装再一起。

下一篇是关于Spark调优与调试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值