小白学习Spark03-在集群上运行Spark

3.1 Spark运行架构

  • Spark可以通过增加机器数量并使用集群模式运行,来扩展程序的计算能力
  • 在分布式环境中,Spark集群采用的是主/从结构
    • 驱动器(Driver)节点:在一个Spark集群中,驱动器节点负责中央协调,调度各个分布式工作节点。
    • 执行器(executor)节点\工作节点
    • 驱动器节点可以跟大量的执行器节点进行通信,它们都作为独立的Java进程运行。
    • Spark应用(application):驱动器节点和所有的执行器节点组成的应用
      在这里插入图片描述
    • Spark应用通过集群管理器(Cluster Manager)的外部服务在集群中的机器上启动。
    • 集群管理器:独立集群管理器(Spark自带)、Hadoop YARN、Apache Mesos
3.1.1 驱动器节点
  • Spark驱动器是执行程序中main()方法的进程,它执行用户编写的用来创建SparkContext、创建RDD、以及进行RDD转化操作和行动操作的代码。
  • 当驱动器程序终止,则Spark应用也就结束了。
  • 驱动器程序在Spark应用中的职责
    • 把用户程序转为任务(task)
      • Spark程序其实是隐式地创建出一个由操作组成的逻辑上的有向无环图(DAG),当驱动器程序执行时,它会将这个逻辑图转为物理执行计划。
      • Spark会对逻辑执行计划做某些优化:比如 将连续的映射转为流水线化执行、 将多个操作合并到一个步骤中。
      • Spark将逻辑计划转为一系列步骤(Stage)、而每个步骤由多个任务组成,这些任务会被打包并送到集群中。
      • 任务(task)是Spark中最小的工作单元。
    • 为执行器节点调度任务
      • 有物理执行计划后,则Spark驱动器程序必须在各执行器进程间协调任务的调度。执行器进程启动后,会向驱动器进程注册自己。因此,驱动器进程 始终对应用中所有的执行器节点有完整的记录,而每个 执行器节点 都代表一个能够处理任务和存储RDD数据的进程。
      • Spark驱动器程序会根据当前的执行器节点集合,尝试把所有任务基于数据所在位置分配给合适的执行器进程。
      • 当任务开始执行时,执行器进程会把缓存数据存储起来,而驱动器进程 会跟踪这些缓存数据的位置,并且利用这些位置信息来调度以后的任务,以尽量减少数据的网络传输。
3.1.2 执行器节点
  • Spark执行器节点时一种工作进程,负责在Spark作业中运行任务,任务间相互独立。
  • Spark应用启动时,执行器节点会被同时启动,并且始终伴随整个Spark应用的生命周期而存在。
  • 执行器进程两大作用
    • 它们负责运行Spark应用的任务,并将结果返回给驱动器进程。
    • 它们都是通过自身的块管理器(Block Manager)为用户程序中要求缓存的RDD提供内存式存储
  • RDD是直接缓存在执行器进程内的,因此任务可以再运行时充分利用缓存数据加速运算。
  • 在本地模式下,Spark驱动器程序和各执行器程序都在同一个Java进程中执行。
3.1.3 集群管理器
  • 集群管理器是Spark中的可插拔式组件。
  • Spark依赖于集群管理器来启动执行器节点,在某些特殊情况下,也可以依赖集群管理器去启动驱动器节点。
  • Spark中的进程节点是 驱动器节点(Driver)+执行器节点(executor)、而集群管理器的进程节点时 主节点(master)+工作节点(worker):分别用来表述集群管理器的中心化部分和分布式部分。
3.1.4 启动Spark程序
  • spark-submit 将应用提交到集群管理器。
3.1.5 小结
  • 用户通过spark-submit脚本提交应用
  • spark-submit 脚本启动 驱动器 程序,调用用户定义的main()方法
  • 驱动器 程序与集群管理器通信,申请资源以启动 执行器节点
  • 集群管理器 为 驱动器程序 启动 执行器节点
  • 驱动器进程执行用户应用中的操作。根据程序中所定义的对RDD的转化操作和行动操作,驱动器节点 把 工作以任务 的形式发送到 执行器进程。
  • 任务 在 执行器程序 中进行计算并保存结果
  • 如果驱动器程序的main()方法退出,或者调用了 SparkContext.stop(),驱动器程序会终止执行器进程,并且通过集群管理器释放资源。
3.2 使用spark-submit部署应用
  • Spark为各种集群管理器提供了统一的工具(spark-submit)来提交作业。
  • spark-submit提供两类选项:1)调度信息 2)应用的运行时依赖
  • spark-submit的–master标记可以接收的值
    在这里插入图片描述
 	//spark-submit的一般格式
 	//[options]:需要传给spark-submit的标记列表。
 	//<app jar | python File> 表示包含应用入口的JAR包或Python脚本
 	//[app options] 是传给你的应用的选项
 	bin/spark-submit [options] <app jar | python file> [app options]
  • spark-submit的一些常见标记
    在这里插入图片描述
  • spark-submit 允许通过 --conf prop=value 标记设置任意的SparkConf配置选项,也可以适用 --properties-File 指定一个包含键值对的属性文件。
3.3 打包代码与依赖
  • 若你的程序引入了任何既不在org.apache.spark 包内也不属于语言运行时的库的依赖,你就需要确保所有的依赖在该Spark应用运行时都能被找到
  • 提交应用时,绝不要把Spark本身放在提交的依赖中,spark-submit会自动确保Spark在你的程序的运行路径中。
  • python用户安装第三方库
    • 通过标准的python包管理器直接在集群中的所有机器上安装所依赖的库
    • 把依赖手动安装到Python安装目录下的site-packages目录中
    • 可以使用spark-submit的 --py-Files 参数提交独立的库,这样它们也会添加到python解释器的路径中
  • java和Scala用户
    • 由于Java和Scala的工程会依赖很多个库,因此需要借助构建工具去生成一个单个大JAR包(超级(uber)JAR/ 组合(assembly)JAR):包含应用所有的传递依赖。
3.3.1 使用Maven构建的用JAVA编写的Spark应用
  • Maven 中默认的用户代码在工程根目录(该目录应包含pom.xml文件)下的src/main/java 目录中。
  • 使用maven-shade-plugin插件来创建出包含所有依赖的超级JAR包。
3.3.2 使用sbt构建的用Scala编写的Spark应用
  • 在工程的根目录中,需要创建出一个叫做build.sbt的构建文件,源代码则应该放在src/main/scala中。
  • sbt构建文件是用配置语言写成的,在这个文件中我们把值赋给一个特定的键,用来定义工程的构建。
  • 具体构建方法 谷歌/百度。
3.3.2 依赖冲突
  • 当用户应用于Spark本身依赖同一个库时可能会发生依赖冲突,导致程序崩溃。
  • 依赖冲突表现为Spark作业执行过程中抛出NoSuchMethodError、ClassNotFoundException,或其他与类加载相关的JVM异常。
  • 两种解决方式
    • 修改你的应用,使其使用的依赖库的版本与Spark所使用的相同
    • 使用通常被称为"shading"的方式打包你的应用。
    • shading 能够让你以另一个命名空间保留冲突的包,并自动重写应用的代码使得它们使用重名后的版本。
3.4 Spark应用内与应用间调度
  • 在现实应用中,许多集群是在多个用户间共享的,Spark有一系列调度策略来保障资源不会被过度使用,还允许工作负载设置优先级。
  • 在调用多用户集群时,Spark主要依赖集群管理器来在Spark应用间共享资源。
  • 当Spark应用向集群管理器申请执行器节点时,应用收到的执行器节点个数可能比其申请的更多或更少,这取决于集群的 可用性 与 争用。况且有许多集群管理器支持队列,这可以为队列定义不同的优先级或容量限制,至此spark就可以把作业提交到相应的队列中。
  • 对长期运行(long lived)的应用,比如JDBC服务器(当JDBC启动后,它会从集群管理器获得一系列执行器节点,然后就称为用户提交SQL查询的永久入口),因为这种应用本身就是为多用户调度工作的,因此它需要一种 细粒度的调度机制来强制共享资源。
  • Spark提供一种用来配置应用内调度策略的机制,Spark内部的公平调度器(Fair Scheduler)会让长期运行的应用定义调度任务的优先级队列。
3.5 集群管理器
  • Spark能够运行在各种集群管理器上,并通过集群管理器访问集群中的机器。
  • 三种集群管理:1)自带的独立模式 2)Hadoop YARN 3)Apache Mesos
3.5.1 独立集群管理器
  • Spark独立集群管理器是由一个 主节点 和几个工作节点 组成的,各自都分配有一定了的内存和CPU核心。当提交应用时,你可以配置执行器进程使用的内存量,以及所有执行器进程使用的CPU核心总数。
  • 启动独立集群管理器
    • 通过Spark的sbin目录中的启动脚本来启动独立集群管理器,前提是要设置机器间的SSH免密访问(这个在我博客的另一篇文章有介绍 小白学习Spark01-配置环境)
  • 提交应用
    • spark-submit --master **
    • 常见陷阱:执行器进程申请的内存(–executor-memory)超过了集群所能提供的内存重量,独立集群管理器无法为应用分配执行器节点,会阻碍应用的运行。
  • 独立集群管理器支持两种部署模式
    • 客户端模式(默认),驱动器程序会运行在你执行spark-submit的机器上,是spark-submit命令的一部分
    • 集群模式,驱动器程序会作为某个工作节点上的一个独立的进程运行在独立集群管理器内部,它也会连接主节点来申请执行器节点
    • 通过向spark-submit 传递 --deploy-mode cluster 参数能够切换到集群模式。
  • 配置资源用量
    • 独立集群管理器使用基础的调度策略,允许限制各个应用的用量来让多个应用并发执行。
    • 资源分配的两个设置
      • 执行器进程内存:–executor-memory,默认是 1GB。 控制执行器节点占用工作节点有多少内存。
      • 占用核心总数的最大值:–total-executorcores 。一个Spark应用所有执行进程所占用的核心总数
    • 独立集群管理器会在默认情况下为每个应用试验可能分散的执行器进程。
  • 高度可用性(这个在我博客的另一篇文章有介绍 小白学习Spark01-配置环境)
    • 利用zookeeper(一个分布式协调系统)去维护多个备用的主节点,并在一个主节点失败时切换到新的主节点上。
3.5.2 Hadoop YARN
  • Yarn 可以让多种数据处理框架运行在一个共享的资源池中,并且通过安装在于Hadoop文件系统(HDFS)相同的物理节点上。这能狗让Spark在存储数据的物理节点上运行,以快速访问HDFS中的数据。
  • Spark中使用YARN
    • 设置指向Hadoop配置目录的环境变量
      • 找到Hadoop配置目录,并将其设为环境变量HADOOP_CONF_DIR,z这个目录包含yarn-site.xml 和其他配置文件
    • 使用spark-submit向一个特殊的主节点URL提交作业
 	export HADOOP_CONF_DIR="..."
 	spark-submit --master yarn yourapp
  • 连接到集群的两种模式
    • 客户端模式:该模式下的应用的驱动器程序运行在提交应用的机器上
    • 集群模式:驱动器程序也运行在一个YARN容器内部。
  • 配置资源用量
    • –num-executors:执行器节点的数量
    • –executor-memory:每个执行器的内存用量
    • –executor-cores:每个执行器进程从YARN中占用的核心数目
3.5.2 Apache Mesos
  • Apache Mesos 是一个通用集群管理器,既可以运行分析型工作负载又可以运行长期运行的服务
	spark-submit --master mesos://masternode:5050 yourapp
  • Mesos通过两种调度模式来在一个集群内的执行器进程间共享资源
    • “细粒度”模式(默认),执行器进程占用的CPU核心数会在它们执行任务时动态变化,因此一台运行了多个执行器进程的机器可以动态共享CPU资源
    • “粗粒度”模式:Spark提前为每个执行器进程分配固定数量的CPU数目,并且在应用结束前绝不释放这些资源
    • 通过spark.mesos.coarse=true打开“粗粒度”模式。
    • 细粒度模式下调度任务会带来比较多的延迟,但是当在多用户共享的集群中运行shell这样的交互式的工作负载时会非常合适。
  • 客户端和集群模式
    • 目前,在Mesos上的Spark只支持以客户端的部署模式运行应用
  • 配置资源用量
    • –executor-memory:每个执行器的内存用量
    • –executor-cores:每个执行器进程从YARN中占用的核心数目
3.6 选择合适的集群管理器
  • 小白/初学者 使用独立集群管理器
  • 若需要在使用Spark的同时使用其他应用或者是用到更加丰富的资源调度功能(如队列),则选择Yarn和Mesos,至于这两者,Mesos相对的优势就是细粒度共享的选项,该选项可以将类似Spark shell这样的交互式应用中的不同命令分配到不同的CPU中。
  • 任何时候都需要将Spark运行在运行HDFS的节点上。





  • 关注「一个热爱学习的计算机小白」公众号 ,对作者的小小鼓励,后续更多资源敬请关注。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值