小白学习Spark03-在集群上运行Spark
03 在集群上运行Spark
- 3.1 Spark运行架构
- 3.1.1 驱动器节点
- 3.1.2 执行器节点
- 3.1.3 集群管理器
- 3.1.4 启动Spark程序
- 3.1.5 小结
- 3.2 使用spark-submit部署应用
- 3.3 打包代码与依赖
- 3.3.1 使用Maven构建的用JAVA编写的Spark应用
- 3.3.2 使用sbt构建的用Scala编写的Spark应用
- 3.3.2 依赖冲突
- 3.4 Spark应用内与应用间调度
- 3.5 集群管理器
- 3.5.1 独立集群管理器
- 3.5.2 Hadoop YARN
- 3.5.2 Apache Mesos
- 3.6 选择合适的集群管理器
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驱动器程序会根据当前的执行器节点集合,尝试把所有任务基于数据所在位置分配给合适的执行器进程。
- 当任务开始执行时,执行器进程会把缓存数据存储起来,而驱动器进程 会跟踪这些缓存数据的位置,并且利用这些位置信息来调度以后的任务,以尽量减少数据的网络传输。
- 把用户程序转为任务(task)
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提交作业
- 设置指向Hadoop配置目录的环境变量
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的节点上。
- 关注「一个热爱学习的计算机小白」公众号 ,对作者的小小鼓励,后续更多资源敬请关注。
小白学习Spark03-在集群上运行Spark相关推荐
- Spark学习笔记——在集群上运行Spark
Spark运行的时候,采用的是主从结构,有一个节点负责中央协调, 调度各个分布式工作节点.这个中央协调节点被称为驱动器( Driver) 节点.与之对应的工作节点被称为执行器( executor) 节 ...
- 在local模式下的spark程序打包到集群上运行
一.前期准备 前期的环境准备,在Linux系统下要有Hadoop系统,spark伪分布式或者分布式,具体的教程可以查阅我的这两篇博客: Hadoop2.0伪分布式平台环境搭建 Spark2.4.0伪分 ...
- 在阿里云Serverless K8S集群上部署Spark任务并连接OSS(详细步骤)
在阿里云ASK集群上部署Spark任务并连接OSS 简介 ASK是阿里云的一个产品,属于Serverless Kubernetes 集群,这次实验是要在ASK集群上运行Spark计算任务(以WordC ...
- 如何在集群上运行Shark
如何在集群上运行Shark 本文介绍在计算机集群上如何启动和运行Shark.如果对Amazon EC2上运行Shark感兴趣,请点击这里查看如何使用EC2脚本快速启动预先配置好的集群. 依赖: 注意: ...
- 在生产集群上运行topology
2019独角兽企业重金招聘Python工程师标准>>> 在生产集群上运行topology 博客分类: 分布式计算 在生产集群上运行topology跟本地模式差不多.下面是步骤: 1) ...
- pythonspark集群模式运行_有关python numpy pandas scipy 等 能在YARN集群上 运行PySpark
有关这个问题,似乎这个在某些时候,用python写好,且spark没有响应的算法支持, 能否能在YARN集群上 运行PySpark方式, 将python分析程序提交上去? Spark Applicat ...
- 从认证到调度,K8s 集群上运行的小程序到底经历了什么?
作者 | 声东 阿里云售后技术专家 导读:不知道大家有没有意识到一个现实:大部分时候,我们已经不像以前一样,通过命令行,或者可视窗口来使用一个系统了. 前言 现在我们上微博.或者网购,操作的其实不是 ...
- spark在集群上运行
1.spark在集群上运行应用的详细过程 (1)用户通过spark-submit脚本提交应用 (2)spark-submit脚本启动驱动器程序,调用用户定义的main()方法 (3)驱动器程序与集群管 ...
- anaconda3环境整体打包放在Spark集群上运行
一.将虚拟Python环境打包 创建好环境后,进入到环境所在的文件夹,例如环境是/home/hadoop/anaconda3/envs, cd到envs下,使用打包命令将当前目录下的文件打成zip包: ...
最新文章
- 9.2 图像类型(灰度图像、彩色图像、二值图像以及图像间的转换)
- shell softech 面料_求高人指点 猛犸象的SOFTECH面料和GTX PROSHELL面料哪个好
- 使用“即时消息服务框架”(iMSF)实现分布式事务的三阶段提交协议(电商创建订单的示例)...
- Docker logs 命令——查看docker容器日志
- 数据结构(线性表)——神奇的幻方
- 节点操作大全(二)~操作节点的属性
- 运维学python哪部分_初入运维的小伙伴,别再问需不需要学Python了
- macos 升级后 从前的 apachectl 错误, php 错误
- python如何执行代码_在Python中重新运行代码块
- 算法学习:01背包问题求具体方案
- 手机网站制作html5,【怎么样制作手机网站】如何使用dreamweavercs6建立手机网站?织梦手机WAP浏览模块如何制作手机网站?如何制作html5手机页面?...
- 服务器系统怎么安装网卡驱动,Windows7系统怎么安装8139网卡驱动
- Java动态读取map里面的key值
- 排序算法系列:归并排序算法
- 复合型人才八种能力_刚毕业在设计院做结构设计,感觉自己对很多东西都没有判断的能力,工作之外如何提升自己在结构方面的知识?...
- 可变参数传递与不可变参数传递
- VMware设置共享文件夹之后/mnt/hgfs里面什么也没有
- 时间的格局:让每一分钟为未来增值
- linux的crontab定时任务完整配置和定时任务不执行分析
- Autojs : 使用 html css js 作为软件的界面