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)傳送給各個執行器去執行。
這個架構中有幾個值得注意的地方:
- 每個Spark應用程式都有其對應的多個執行器程序,執行器程序在整個應用程式生命週期內,都保持執行狀態,並以多執行緒方式執行所收到的任務。這樣的好處是,可以隔離各個Spark應用,從排程角度來看,每個驅動器可以獨立排程本應用程式內部的任務,從執行器角度來看,不同的Spark應用對應的任務將會在不同的JVM中執行。然而這種架構同樣也有其劣勢,多個Spark應用程式之間無法共享資料,除非把資料寫到外部儲存中。
- Spark對底層的叢集管理器一無所知。只要Spark能申請到執行器程序,並且能與之通訊即可。這種實現方式可以使Spark相對比較容易在一個支援多種應用的叢集管理器上執行(如:Mesos或YARN)
- 因為叢集上的任務是由驅動器來排程的,所以驅動器應該和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節點:
啟動之後。Master命令列會打印出:spark://HOST:PORT,你可以使用該URL資訊將Worker與Master連線,./sbin/start-master.sh
或以‘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 itsspark.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).