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