1. 程式人生 > >Spark安裝及部署

Spark安裝及部署

1、安裝Spark

1.1、 配置Java環境:

<1>下載Java SE

選擇合適的壓縮包下載

<2>配置Java環境

開啟profile檔案: ~$ sudo vim /etc/profile

在檔案結尾加上Java配置語句:

export JAVA_HOME=$YOUR_PATH #$YOUR_PATH為實際的Java包路徑,如:/home/jj/java/jdk1.8.0_144

export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

1.2、 下載、編譯Spark

<1>下載

Spark下載步驟:

1) 選擇Spark發行版本,目前最新版本為2.2.0

2) 選擇發行包型別,可以選擇Source Code、Pre-built for Apache Hadoop 2.7 and later等

3) 選擇下載方式

4) 點選Download Spark:spark-2.2.0.tgz進行下載

<2>編譯

可以使用Maven或SBT(Simple Build Tool,簡單編譯工具)進行編譯,以下介紹Maven編譯流程:

1) Maven下載: 

2) Maven配置:

~$ export M2_HOME=$your_path;export PATH=$M2_HOME/bin:$PATH

上述命令中的your_path為Maven所在的目錄

3)Maven編譯Spark

在Spark原始碼目錄(如spark-2.2.0)下,編譯Spark執行環境,命令如下:

~/spark-2.2.0$ export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"

~/spark-2.2.0$ mvn -Pyarn -phadoop-2.6 -Dhadoop.version=2.6.0 -DskipTests clean package

第一條命令中:

-Xmx為Java虛擬機器堆記憶體最大允許值,

-XX:MaxPermSize為最大允許的非堆記憶體大小,

-XX:ReservedCodeCaheSize為快取大小。

編譯過程較為漫長。

2、Spark叢集部署

Spark應用在叢集上執行時,包括了多個獨立的程序,這些程序之間通過你的主程式(也叫作驅動器,即:driver)中的SparkContext物件來進行協調。

特別要指出的是:SparkContext物件能與多種叢集管理器進行通訊(包括:Spark獨立部署時自帶的叢集管理器,Mesos或者YARN)。一旦連線上叢集管理器,Spark會為該應用在各個叢集節點上申請執行器(executor),用於執行計算任務和儲存資料。接下來,Spark將應用程式程式碼(JAR包或者Python檔案)傳送給所申請到的執行器。最後SparkContext將分割出的任務(task)傳送給各個執行器去執行。

 這個架構中有幾個值得注意的地方:

  1. 每個Spark應用程式都有其對應的多個執行器程序,執行器程序在整個應用程式生命週期內,都保持執行狀態,並以多執行緒方式執行所收到的任務。這樣的好處是,可以隔離各個Spark應用,從排程角度來看,每個驅動器可以獨立排程本應用程式內部的任務,從執行器角度來看,不同的Spark應用對應的任務將會在不同的JVM中執行。然而這種架構同樣也有其劣勢,多個Spark應用程式之間無法共享資料,除非把資料寫到外部儲存中。
  2. Spark對底層的叢集管理器一無所知。只要Spark能申請到執行器程序,並且能與之通訊即可。這種實現方式可以使Spark相對比較容易在一個支援多種應用的叢集管理器上執行(如:Mesos或YARN)
  3. 因為叢集上的任務是由驅動器來排程的,所以驅動器應該和worker節點距離近一些,最好在同一個本地區域網中。如果你需要遠端對叢集發起請求,最好還是在驅動器節點上啟動RPC服務,來響應這些遠端請求,同時把驅動器本身放在叢集worker節點比較近的機器上。

<2>叢集管理器型別

Spark支援以下3中叢集管理器:

  • Standalone – Spark自帶的一個簡單的叢集管理器,這使得啟動一個Spark叢集變得非常簡單。
  • Apache Mesos – 一種可以執行Hadoop MapReduce或者服務型應用的通用叢集管理器。
  • Hadoop YARN – Hadoop 2的叢集管理器。

另外,使用Spark的EC2 launch scripts可以輕鬆地在Amazon EC2上啟動一個獨立叢集。

<3> 提交Spark應用

利用spark-submit指令碼,可以向Spark所支援的任意一種叢集提交應用。詳見:application submission guide

<4> 監控

每一個驅動器(driver)都有其對應的web UI,預設會繫結4040埠(多個並存會按順序繫結4041、4042…),這個web UI會展示該Spark應用正在執行的任務(task)、執行器(executor)以及所使用的儲存資訊。只需在瀏覽器種開啟http://<driver-node>:4040即可訪問。monitoring guide 詳細描述了其他監控選項。

<5> 作業排程

Spark可以在應用程式之間(叢集管理器這一層面)和之內(如:同一個SparkContext物件運行了多個計算作業)控制資源分配。job scheduling overview 描述了更詳細的資訊。

<6> 概念和術語

下表簡要說明了叢集模式下的一些概念和術語:

術語 含義
Application(應用) Spark上執行的應用。包含了驅動器(driver)程序(一個)和叢集上的執行器(executor)程序(多個)
Application jar(應用jar包) 包含Spark應用程式的jar包。有時候,使用者會想要把應用程式程式碼及其依賴打到一起,形成一個“uber jar”(包含自身以及所有依賴庫的jar包),注意這時候不要把Spark或Hadoop的庫打進來,這些庫會在執行時載入
Driver program(驅動器) 驅動程式,執行main函式並建立SparkContext的程序。
Cluster manager(叢集管理器) 用於在叢集上申請資源的 外部服務(如:獨立部署的叢集管理器、Mesos或者YARN)
Deploy mode(部署模式) 用於區分驅動器程序在哪裡執行。在”cluster”模式下,驅動器將執行在叢集上某個節點;在”client“模式下,驅動器在叢集之外的客戶端執行。
Worker node(工作節點) 叢集上執行應用程式程式碼的任意一個節點。
Executor(執行器) 在叢集工作節點上,為某個應用啟動的工作程序;專門用於執行計算任務,並在記憶體或磁碟上儲存資料。每個應用都獨享其對應的多個執行器。
Task(任務) 下發給執行器Executor的工作單元。
Job(作業) 一個平行計算作業,由一組任務(Task)組成,並由Spark的行動(action)運算元(如:save、collect)觸發啟動;你會在驅動器日誌中看到這個術語。
Stage(步驟) 每個作業(Job)可以劃分為更小的任務(Task)集合,這就是步驟(Stage),這些步驟彼此依賴形成一個有向無環圖(類似於MapReduce中的map和reduce);你會在驅動器日誌中看到這個術語。
RDD 彈性分散式資料集
Operation 作用於RDD的各種操作,分為Transformation和Action
DAG 有向無環圖,反映RDD的依賴關係
Narrow dependency 窄依賴,子RDD依賴父RDD中固定的資料分割槽
Wide dependency 寬依賴,子RDD對父RDD中的所有資料分割槽都有依賴
Caching management 快取管理,對RDD的中間計算結果進行快取管理,以加快整體的處理速度

2.2 Spark部署

<1>Local模式部署

Local模式下部署Spark應用程式比較簡單,可用於檢測Spark是否編譯安裝成功,需要配置Java環境變數和設定主節點。

主節點設定步驟如下:

1)進入Spark主程式的conf目錄,即spark-2.2.0/conf

2)以spark-env.sh.template檔案為模板建立spark-env.sh檔案

3)修改spark-env.sh配置檔案

vim spark-env.sh

export SPARK_MASTER_IP=$YOUR_MASTER_IP

export JAVA_NAME=$YOUR_JAVA_HOME

4)版本驗證,在任意目錄下執行spark-shell命令即可進入Spark命令列模式。此時會顯示版本資訊:

Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.2.0
      /_/
         
Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_144)

<2> Standalone模式部署

部署步驟如下

1)修改spark-env.sh配置檔案(參考Local部署模式)

vim spark-env.sh

export SPARK_MASTER_IP=$YOUR_MASTER_IP

export JAVA_NAME=$YOUR_JAVA_HOME

2)在Spark目錄下建立一個名為conf/slaves的檔案。

該檔案需要包含所有將要啟動Spark Workers的機器的hostname(主機名),每行一個

vim slaves

# A Spark Worker will be started on each of the machines listed below.

slave01

slava02

.....

3)傳送配置檔案Spark-env.sh和Slaves到所有Worker節點,以slave02為例:

scp -r $SPARK_HOME/conf/spark-env.sh slave02:/$SPARK_HOME/conf

scp -r $SPARK_HOME/conf/slaves  slave02:$SPARK_HOME/conf

4)配置Master無金鑰登入Slaves節點。

1.在Master節點和所有Slave節點上安裝openssh-server:

sudo apt-get install openssh-server

2. 建立SSH KEY:

ssh-keygen -t rsa -P ""

3.在Master節點上啟用SSH KEY(authorized__keys許可權644):

cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys

sudo /etc/init.d/ssh reload

4. 驗證SSH的配置:

 ssh localhost

5.將Master節點的authorized_keys傳送到所有Slaves節點並登入驗證。

5)部署完畢,可以手動啟動和指令碼啟動叢集的Master和Worker。

1.手動啟動:

可以通過執行下述命令啟動Standalone的Master節點:

./sbin/start-master.sh
啟動之後。Master命令列會打印出:spark://HOST:PORT,你可以使用該URL資訊將Worker與Master連線,

或以‘master’引數的形式傳遞給SparkContext物件。也可以在Master的web UI中找到這個URL,預設訪問地址是http://localhost:8080。

支援啟動一個或更多的Worker,然後通過下面的指令與Master連線:

./bin/spark-class org.apache.spark.deploy.worker.Worker park://IP:PORT

一旦啟動了一個Worker節點,在Master的WebUI中(預設http://localhost:8080),你會看到新增的Worker節點,以及CPU數目、記憶體大小(減去留給系統的1GB)在列表中呈現。

2.指令碼啟動叢集

使用指令碼啟動Spark standalone cluster時,你應先在你的SPARK資料夾下建立conf/slaves檔案,這個檔案包含所有你想要執行Spark workers的機器的hostname,一個一行。如果這個檔案不再,指令碼預設會使用一臺機器(localhost),這是用來測試用的。

當建立了這個檔案,就可以通過下面的shell指令碼在Master節點上啟動或終止你的叢集:

SPARK_HOME/sbin:

  • sbin/start-master.sh - 在指令碼執行的機器上啟動一個Master 例項。
  • sbin/start-slaves.sh - 在conf/slaves 檔案指定的所有機器上執行一個Slave例項。
  • sbin/start-slave.sh - 在指令碼執行的機器上啟動一個Slave例項。
  • sbin/start-all.sh - 以上面所述的方式啟動一個Master例項和多個Slave例項。
  • sbin/stop-master.sh -停止使用 sbin/start-master.sh 指令碼啟動的Master例項。
  • sbin/stop-slaves.sh - 停止所有 conf/slaves 檔案指定的Slava 例項。
  • sbin/stop-all.sh -停止當前的Master例項和Slave例項。

執行jps命令可以檢視當前伺服器正在執行的程序,如果是主節點,可以看到Master程序;如果是子程序,可以看到Worker程序。這樣就表示Spark在伺服器上全部部署完畢。

可以通過設定spark-env.sh中的環境變數進一步配置叢集,並複製到所有的Worker機器上以使設定生效,可配值的spark-env.sh中的環境變數如下:

Environment Variable Meaning
SPARK_MASTER_HOST Bind the master to a specific hostname or IP address, for example a public one.
SPARK_MASTER_PORT Start the master on a different port (default: 7077).
SPARK_MASTER_WEBUI_PORT Port for the master web UI (default: 8080).
SPARK_MASTER_OPTS Configuration properties that apply only to the master in the form "-Dx=y" (default: none). See below for a list of possible options.
SPARK_LOCAL_DIRS Directory to use for "scratch" space in Spark, including map output files and RDDs that get stored on disk. This should be on a fast, local disk in your system. It can also be a comma-separated list of multiple directories on different disks.
SPARK_WORKER_CORES Total number of cores to allow Spark applications to use on the machine (default: all available cores).
SPARK_WORKER_MEMORY Total amount of memory to allow Spark applications to use on the machine, e.g.1000m, 2g (default: total memory minus 1 GB); note that each application'sindividual memory is configured using its spark.executor.memory property.
SPARK_WORKER_PORT Start the Spark worker on a specific port (default: random).
SPARK_WORKER_WEBUI_PORT Port for the worker web UI (default: 8081).
SPARK_WORKER_DIR Directory to run applications in, which will include both logs and scratch space (default: SPARK_HOME/work).
SPARK_WORKER_OPTS Configuration properties that apply only to the worker in the form "-Dx=y" (default: none). See below for a list of possible options.
SPARK_DAEMON_MEMORY Memory to allocate to the Spark master and worker daemons themselves (default: 1g).
SPARK_DAEMON_JAVA_OPTS JVM options for the Spark master and worker daemons themselves in the form "-Dx=y" (default: none).
SPARK_PUBLIC_DNS The public DNS name of the Spark master and workers (default: none).