Spark的一大好處就是能夠經過增長機器數量並使用集羣模式運行,來擴展計算能力。Spark能夠在各類各樣的集羣管理器(Hadoop YARN , Apache Mesos , 還有Spark自帶的獨立集羣管理器)上運行,因此Spark應用既可以適應專用集羣,又能用於共享的雲計算環境。java
Spark在分佈式環境中的架構以下圖:python
在分佈式環境下,Spark集羣採用的是主/從結構。在Spark集羣,驅動器節點負責中央協調,調度各個分佈式工做節點。執行器節點是工做節點,做爲獨立的Java進行運行,能夠和大量的執行器節點進行通訊,做爲獨立的Java進程運行。驅動器節點和全部的執行器節點一塊兒被稱爲一個Spark應用。mysql
Spark應用經過一個叫作集羣管理器的外部服務在集羣上的機器上啓動。Spark自動的集羣管理器稱爲獨立集羣管理器。Spark也能運行在Hadoop YARN和Apache Mesos兩大開源集羣管理器上。sql
詳細說明驅動器節點和執行器節點的做用:apache
一、驅動器節點緩存
Spark驅動器是執行程序中main()方法的進程。它執行用戶編寫的用來建立SparkContext ,建立RDD,以及進行RDD轉化操做和行動操做的代碼。架構
驅動器進程在Spark應用中有如下兩個職責:app
Spark驅動器程序負責把用戶程序轉爲多個物理執行的單元,這些單元稱爲任務。任務是Spark中最小的工做單元,用戶程序一般要啓動成百上千的獨立任務。分佈式
Spark驅動器在各執行器進程間協調任務的調度,驅動器進程對應用中全部的執行器節點有完整的記錄。每一個執行器節點表明一個可以處理任務和存儲RDD數據的進程。oop
二、執行器節點
Spark執行器節點是一種工做進程,負責在Spark做業中運行任務,任務間相互獨立。執行器節點在Spark應用啓動時啓動,伴隨着整個Spark應用的生命週期而存在。
執行器節點負責運行組成Spark應用的任務,並將結果返回給驅動器進程。
執行器節點經過自身的塊管理器爲用戶程序中要求緩存的RDD提供內存式存儲。
使用Spark提供的統一腳本spark-submit將應用提交到集羣管理器上。
spark-submit提供了各類選項能夠控制應用每次運行的各項細節。這些選項分爲兩類:第一類是調度信息,好比你但願爲做業申請的資源量。第二類是應用的運行時依賴,好比須要部署到全部工做節點的庫和文件。
spark-submit的通常格式:
bin/spark-submit [options] <app jar | python file> [app options]
[options]是要傳給spark-submit的標記列表,運行spark-submit --help 能夠列出全部能夠接收的標記。
<app jar | python file>表示包含應用入口的JAR包或Python腳本。
[app options]是傳給應用的選項。
spark-submit一些經常使用的標記以下:
<properties> <scala.version>2.10.4</scala.version> <spark.version>1.6.3</spark.version> <hadoop.version>2.6.0</hadoop.version> </properties> <dependencies> <!-- scala --> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>${scala.version}</version> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-compiler</artifactId> <version>${scala.version}</version> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-reflect</artifactId> <version>${scala.version}</version> </dependency> <!-- spark --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.10</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-mllib_2.10</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.10</artifactId> <version>${spark.version}</version> </dependency> <!-- hive --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-hive_2.10</artifactId> <version>${spark.version}</version> </dependency> <!-- hadoop --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>${hadoop.version}</version> </dependency> <!-- JDBC --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.35</version> </dependency> </dependencies>
在調度多用戶集羣時,Spark主要依賴集羣管理器來在Saprk應用間共享資源。Spark內部的公平調度器會讓長期運行的應用定義調度任務的優先級隊列。