1. Spark架构

说明

  1. 本篇仅讨论运行在集群模式下的Spark。
  2. 本篇阅读时间在10min。

Spark在hadoop组件集的位置

Spark是大数据集群的一种计算框架,其在大数据组件的位置以下。
imagehtml

这里说明,Spark是对并行框架MapReduce的一种替换,而不是对整个hadoop的替换。

1. Spark架构图

Spark采用master-slave架构模式,实现了多集群运行模式。其架构以下:
Spark架构node

与HDFS组件的NameNode,SecondaryNameNode,DataNode类似,运行Spark程序的集群节点也能够分为:shell

  • Master节点,Master节点仅运行驱动器程序
  • Worker节点,Woker节点仅运行执行器程序。

在相关节点的主机上使用命令jps能够查看到相关的进程。下面分别介绍各个部分含义。apache

2. 架构说明

Spark包含两类程序:缓存

  • 驱动器程序,有且仅有一个。
  • 执行器程序,1个或多个。

从操做系统层面看,每一个程序都是不一样的进程,分别运行在不一样的节点上。服务器

2.1 驱动器程序(Driver)

驱动器程序包含应用的main函数,而且定义了集群上的分布式数据集,还对这些分布式数据集应用了相关操做。驱动器程序经过一个SparkContext对象来访问Spark,这个对象表明对计算集群的一个链接。架构

说明:启动Spark-Shell时已经自动建立了一个SparkContext对象,是一个叫sc的变量。因此看到别人使用的未手动实例化的sc变量也就不要见怪。

有了SparkContext(Spark上下文)后,就能够用来创新Spark核心类RDD。与此同时在群集模式下,驱动器程序还要管理多个执行器节点。所起驱动器程序两个主要的任务是:app

  • 把用户程序转为任务
  • 为执行器程序调度任务

驱动器程序会将一些Spark应用的运行时的信息经过网页界面呈现出来,默认在端口4040上。好比在本地模式下访问http://localhost:4040就能够看到这个网页。框架

2.2 执行器程序(Executor)

执行器程序主要有两个任务:分布式

  • 负责运行驱动器程序发送过来的任务,并将执行结果返回给驱动器程序;
  • 经过自身的块管理器(Block Manager)为用户程序中要求缓存的RDD提供内存式存储。

2.3 集群管理器

集群管理器负责管理执行器的声明周期。系统当前支持四种集群管理器:

  1. 本地集群管理器,driver和executor在同一台服务器,适合测试或者执行低复杂度的做业。
  2. Spark独立集群管理器,一种简单的Spark集群管理器,很容易创建集群
  3. Hadoop YARN,Hadoop v2资源管理器
  4. 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能够管理三项资源:

  1. --num-executors,Spark应用会使用固定数量的执行器节点,默认状况下,这个值仅为2;
  2. --executor-memory,设置每一个执行器的内存用量;
  3. --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 部署模式

全部集群管理器均支持两种部署模式,在这两种模式中应用的驱动器程序运行在不一样的地方:

  1. client,客户端模式,默认部署模式,驱动器程序会运行在你执行spark-submit的机器上,是spark-submit命令的一部分。这意味着你能够直接看到驱动器程序的输出,也能够直接输入数据进去(经过交互式shell)。
  2. cluster,集群模式,驱动器程序会做为某个工做节点上一个独立的进程运行在独立集群管理器内部,它也会链接主节点来申请执行器节点。

经过deploy-mode指定部署模式。

# 客户端模式,集群模式为cluster
/usr/local/spark-2.1.1-bin-hadoop2.7/bin/spark-submit \
    --master yarn \
    --deploy-mode client \
    my_script.py

引用

  1. Running Spark on Mesos
  2. Spark