1spark 运行时的架构:
spark集群采用主从结构,中央协调节点称为驱动器节点 driver node,与之对应工作节点称为执行器节点 executor。驱动节点和大量的执行器节点进行通信。spark通过集群管理器cluster manager的外部服务在集群中的及其上启动分配调度
spark驱动器是执行程序中main方法,执行用户编写的用来创建sparkcontext,创建RDD,进行RDD转化和行动操作的代码。驱动器程序主要有两个职责:把用户程序转化为任务;为执行节点调度任务,驱动器程序会根据当前的执行器节点集合,尝试把所有任务基于数据所在位置分配给和是的执行器进程。
执行器集诶但负责运行组成spark应用的任务,并将家国返回给驱动器进行,通过自身的块管理器为用户程序中要求缓存的RDD提供内存式存储。
在集群上运行spark应用的过程:
(1) 用户通过 spark-submit 脚本提交应用。
(2) spark-submit 脚本启动驱动器程序,调用用户定义的 main() 方法。
(3) 驱动器程序与集群管理器通信,申请资源以启动执行器节点。
(4) 集群管理器为驱动器程序启动执行器节点。
(5) 驱动器进程执行用户应用中的操作。根据程序中所定义的对 RDD 的转化操作和行动操
作,驱动器节点把工作以任务的形式发送到执行器进程。
(6) 任务在执行器程序中进行计算并保存结果。
(7) 如果驱动器程序的 main() 方法退出,或者调用了 SparkContext.stop() ,驱动器程序会
终止执行器进程,并且通过集群管理器释放资源。
2 使用spark-sumit部署应用
一般格式
spark-submit [options] <app jar|python file> [app options]
options 是传给spark-submit的标记列表 包括 master class name jars executor-memory等
3 打包代码和依赖
当程序中引入了第三方库时,需要确保所有的依赖在该spark应用运行是能被找到;
对于python用户而言,可以通过标准的python包管理器如pip等直接在集群中的所有机器上安装所依赖的库;
对于java和scala用户而言常规方法是使用构建工具,生成单个的大jar包,包含应用的所有传递依赖。
java一般使用maven构建jar,在maven的pom.xml中定义依赖库
scala一般采用sbt构建
4 spark 应用内和应用间调度 集群管理器
当调度多用户集群时,spark主要依赖集群管理器在spark间共享资源,许多集群管理器支持队列,可以为队列定义不同的优先级或容量限制;
如果只在自己的机器集群上运行spark,那么自带的独立模式是部署该集群最简单的方法。如果需要与别的分布式应用共享的集群,spark可以运行在两个广泛使用的集群管理器hadoop yarn和apache mesos上。当把spark部署在amazon EC2上时,spark自带的脚本可以启动独立模式集群和相关服务。
独立集群管理器
可以使用spark 的sbin目录下的启动脚本来实现,需要预先设置SSH无密码访问。 start-all.sh
独立集群管理器支持两种部署模式: 在客户端模式中,驱动器程序运行在执行spark-submit的机器上,在集群模式下,驱动器程序会作为某个工作节点上的一个独立的进程运行在独立集群管理器内部
Hadoop YARN
需要设置指向年的hadoop配置目录的环境变量 HADOOP-CONF_DIR
spark-submit --master yarn yourapp
同样支持客户端和集群模式
amazon EC2
spark自带一个可以在EC2上启动集群的脚本(spark安装目录下的ec2文件夹内spark-ec2),这个脚本会启动一些节点,并在他们上面安装独立集群管理器
# 启动包含5个m3.xlarge类型的工作节点的集群
./spark-ec2 -k mykeypair -i mykeypair.pem -s 5 -t m3.xlarge launch mycluster
./spark-ec2 -k mykeypair -i mykeypair.pem login mycluster
ssh -i keypair.pem root@masternode