说明
- 本篇仅讨论运行在集群模式下的Spark。
- 本篇阅读时间在10min。
Spark在hadoop组件集的位置
Spark是大数据集群的一种计算框架,其在大数据组件的位置如下。
这里说明,Spark是对并行框架MapReduce的一种替换,而不是对整个hadoop的替换。
1. Spark架构图
Spark采用master-slave架构模式,实现了多集群运行模式。其架构如下:
与HDFS组件的NameNode,SecondaryNameNode,DataNode相似,运行Spark程序的集群节点也可以分为:
- Master节点,Master节点仅运行驱动器程序
- Worker节点,Woker节点仅运行执行器程序。
在相关节点的主机上使用命令jps可以查看到相关的进程。下面分别介绍各个部分含义。
2. 架构说明
Spark包含两类程序:
- 驱动器程序,有且仅有一个。
- 执行器程序,1个或多个。
从操作系统层面看,每个程序都是不同的进程,分别运行在不同的节点上。
2.1 驱动器程序(Driver)
驱动器程序包含应用的main函数,并且定义了集群上的分布式数据集,还对这些分布式数据集应用了相关操作。驱动器程序通过一个SparkContext对象来访问Spark,这个对象代表对计算集群的一个连接。
说明:启动Spark-Shell时已经自动创建了一个SparkContext对象,是一个叫sc的变量。所以看到别人使用的未手动实例化的sc变量也就不要见怪。
有了SparkContext(Spark上下文)后,就可以用来创新Spark核心类RDD。与此同时在群集模式下,驱动器程序还要管理多个执行器节点。所起驱动器程序两个主要的任务是:
- 把用户程序转为任务
- 为执行器程序调度任务
驱动器程序会将一些Spark应用的运行时的信息通过网页界面呈现出来,默认在端口4040上。比如在本地模式下访问http://localhost:4040就可以看到这个网页。
2.2 执行器程序(Executor)
执行器程序主要有两个任务:
- 负责运行驱动器程序发送过来的任务,并将执行结果返回给驱动器程序;
- 通过自身的块管理器(Block Manager)为用户程序中要求缓存的RDD提供内存式存储。
2.3 集群管理器
集群管理器负责管理执行器的声明周期。系统当前支持四种集群管理器:
- 本地集群管理器,driver和executor在同一台服务器,适合测试或者执行低复杂度的作业。
- Spark独立集群管理器,一种简单的Spark集群管理器,很容易建立集群
- Hadoop YARN,Hadoop v2资源管理器
- Apache Mesos,一种能够运行Haoop MapReduce和服务应用的集群管理器
如果在集群中仅有Spark程序,那么可以使用Spark独立的集群管理器。如果有其他的mapreduce程序,那么需要使用Yarn或者Mesos管理器。
2.3.1 本地集群管理器
本地集群管理仅有一个executor,调用方法:
# 使用一个线程
/usr/local/spark-2.1.1-bin-hadoop2.7/bin/pyspark --master local
# 使用两个线程执行
/usr/local/spark-2.1.1-bin-hadoop2.7/bin/pyspark --master local[2]
# 每个cpu执行一个线程
/usr/local/spark-2.1.1-bin-hadoop2.7/bin/pyspark --master local[*]
2.3.2 Spark独立集群管理器
启用独立的集群管理很简单,仅需要使用start-all脚本。
${Spark Dir}/sbin/start-all.sh
可以在http://masternode:8080看到集群管理器的网页用户界面,上面显示着所有的工作节点。当提交应用时可以配置执行器进程使用的内存量,以及所有执行器进程使用的CPU核心总数。默认情况下,集群管理器会选择合适的默认值自动为所有工作节点分配CPU核心与内存。
使用独立集群管理器
如果要使用独立的集群管理器仅需要在提交作业时指定提交的节点即可。
//提交应用
bin/spark-submit --master spark://masternode:7077 yourapp
//启动spark-shell时指定master,所有运行程序都将提交到集群中。
bin/spark-shell --master spark://masternode:7077
//启动pyspark
bin/pyspark --master spark://masternode:7077
独立集群管理器主要管理cpu和内存两大资源:
- 执行器进程内存,可以通过spark-submit的--executor-memory参数来配置此项。每个应用在每个工作节点上最多拥有一个执行器进程1,因此这个设置项能够控制执行器节点占用工作节点的多少内存,默认值是1G。
- 占用核心总数的最大值,这是一个应用中所有执行器进程所占用的核心总数,默认值是无限;也就是说应用可以在集群所有可用节点上启动执行器进程。对于多用户的工作负载来说应该要求用户限制他们的用量,可以通过spark-submit的--total-executorcores参数设置这个值。
2.3.3 Hadoop Yarn
Yarn是hadoop自带的集群管理器,默认情况下不用手动启动。使用Yarn作为集群管理器仅需要在提交任务时指定master为yarn即可。
/usr/local/spark-2.1.1-bin-hadoop2.7/bin/spark-submit \
--master yarn \
--deploy-mode client \
--name "Example Program" \
--num-executors 40 \
--executor-memory 10g \
my_script.py
相比于独立的集群管理,Yarn可以管理三项资源:
- --num-executors,Spark应用会使用固定数量的执行器节点,默认情况下,这个值仅为2;
- --executor-memory,设置每个执行器的内存用量;
- --executor-cores,设置每个执行器进程从YARN中占用的核心数目。
2.3.4 Apache Mesos
Mesos需要单独下载,https://open.mesosphere.com/d...。下载完后。指定使用Mesos方法是指定master:
./bin/spark-shell --master mesos://host:5050
2.4 部署模式
所有集群管理器均支持两种部署模式,在这两种模式中应用的驱动器程序运行在不同的地方:
- client,客户端模式,默认部署模式,驱动器程序会运行在你执行spark-submit的机器上,是spark-submit命令的一部分。这意味着你可以直接看到驱动器程序的输出,也可以直接输入数据进去(通过交互式shell)。
- cluster,集群模式,驱动器程序会作为某个工作节点上一个独立的进程运行在独立集群管理器内部,它也会连接主节点来申请执行器节点。
通过deploy-mode指定部署模式。
# 客户端模式,集群模式为cluster
/usr/local/spark-2.1.1-bin-hadoop2.7/bin/spark-submit \
--master yarn \
--deploy-mode client \
my_script.py
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。