本文主要記錄 CDH5 叢集中 Spark 叢集模式的安裝過程配置過程并測試 Spark 的一些基本使用方法。
安裝環境如下:
作業系統:CentOs 6.5
Hadoop 版本:<code>cdh-5.4.0</code>
Spark 版本:<code>cdh5-1.3.0_5.4.0</code>
首先檢視 Spark 相關的包有哪些:
以上包作用如下:
<code>spark-core</code>: spark 核心功能
<code>spark-worker</code>: spark-worker 初始化腳本
<code>spark-master</code>: spark-master 初始化腳本
<code>spark-python</code>: spark 的 Python 用戶端
<code>hue-spark</code>: spark 和 hue 內建包
<code>spark-history-server</code>
在已經存在的 Hadoop 叢集中,選擇一個節點來安裝 Spark Master,其餘節點安裝 Spark worker ,例如:在 cdh1 上安裝 master,在 cdh1、cdh2、cdh3 上安裝 worker:
安裝成功後,我的叢集各節點部署如下:
設定環境變量,在 <code>.bashrc</code> 或者 <code>/etc/profile</code> 中加入下面一行,并使其生效:
可以修改配置檔案 <code>/etc/spark/conf/spark-env.sh</code>,其内容如下,你可以根據需要做一些修改,例如,修改 master 的主機名稱為cdh1。
設定 shuffle 和 RDD 資料存儲路徑,該值預設為<code>/tmp</code>。使用預設值,可能會出現<code>No space left on device</code>的異常,建議修改為空間較大的分區中的一個目錄。
如果你和我一樣使用的是虛拟機運作 spark,則你可能需要修改 spark 程序使用的 jvm 大小(關于 jvm 大小設定的相關邏輯見 <code>/usr/lib/spark/bin/spark-class</code>):
在運作Spark應用程式的時候,driver會提供一個webUI給出應用程式的運作資訊,但是該webUI随着應用程式的完成而關閉端口,也就是說,Spark應用程式運作完後,将無法檢視應用程式的曆史記錄。Spark history server就是為了應對這種情況而産生的,通過配置,Spark應用程式在運作完應用程式之後,将應用程式的運作資訊寫入指定目錄,而Spark history server可以将這些運作資訊裝載并以web的方式供使用者浏覽。
建立 <code>/etc/spark/conf/spark-defaults.conf</code>:
添加下面配置:
如果你是在hdfs上運作Spark,則執行下面指令建立<code>/user/spark/applicationHistory</code>目錄:
設定 <code>spark.history.fs.logDirectory</code> 參數:
建立 /tmp/spark 目錄:
如果叢集配置了 kerberos ,則添加下面配置:
Spark和hive內建,最好是将hive的配置檔案連結到Spark的配置檔案目錄:
修改完 cdh1 節點上的配置檔案之後,需要同步到其他節點:
啟動腳本:
停止腳本:
當然,你還可以設定開機啟動:
另外,你也可以使用 Spark 自帶的腳本來啟動和停止,這些腳本在 <code>/usr/lib/spark/sbin</code> 目錄下:
在master節點修改 <code>/etc/spark/conf/slaves</code> 檔案添加worker節點的主機名稱,并且還需要在master和worker節點之間配置無密碼登陸。
然後,你也可以通過下面腳本啟動 master 和 worker:
當然,你也可以通過<code>spark-class</code>腳本來啟動,例如,下面腳本以standalone模式啟動worker:
通路Spark History Server頁面:http://cdh1:18082/。
注意:我這裡使用的是CDH版本的 Spark,Spark master UI的端口為<code>18080</code>,不是 Apache Spark 的 <code>8080</code> 端口。CDH發行版中Spark使用的端口清單如下:
<code>7077</code> – Default Master RPC port
<code>7078</code> – Default Worker RPC port
<code>18080</code> – Default Master web UI port
<code>18081</code> – Default Worker web UI port
<code>18080</code> – Default HistoryServer web UI port
在叢集不是特别大,并且沒有 mapReduce 和 Spark 同時運作的需求的情況下,用 Standalone 模式效率最高。 Spark可以在應用間(通過叢集管理器)和應用中(如果一個 SparkContext 中有多項計算任務)進行資源排程。
該模式中,資源排程是Spark架構自己實作的,其節點類型分為Master和Worker節點,其中Driver節點運作在Master節點中,并且有常駐記憶體的Master程序守護,Worker節點上常駐Worker守護程序,負責與Master通信。
Standalone 模式是Master-Slaves架構的叢集模式,Master存在着單點故障問題,目前,Spark提供了兩種解決辦法:基于檔案系統的故障恢複模式,基于Zookeeper的HA方式。
Standalone 模式需要在每一個節點部署Spark應用,并按照實際情況配置故障恢複模式。
如果運作成功,可以打開浏覽器通路 http://cdh1:4040 檢視應用運作情況。
運作過程中,可能會出現下面的異常:
使用 spark-submit 以 Standalone 模式運作 SparkPi 程式的指令如下:
需要說明的是:<code>Standalone mode does not support talking to a kerberized HDFS</code>,如果你以 <code>spark-shell --master spark://cdh1:7077</code> 方式通路安裝有 kerberos 的 HDFS 叢集上通路資料時,會出現下面異常:
Spark on Yarn 模式同樣也支援兩種在 Yarn 上啟動 Spark 的方式,一種是 cluster 模式,Spark driver 在 Yarn 的 application master 程序中運作,用戶端在應用初始化完成之後就會退出;一種是 client 模式,Spark driver 運作在用戶端程序中。Spark on Yarn 模式是可以通路配置有 kerberos 的 HDFS 檔案的。
CDH Spark中,以 cluster 模式啟動,指令如下:
CDH Spark中,以 client 模式啟動,指令如下:
以SparkPi程式為例:
另外,運作在 YARN 叢集之上的時候,可以手動把 spark-assembly 相關的 jar 包拷貝到 hdfs 上去,然後設定 <code>SPARK_JAR</code> 環境變量:
Spark 安裝包中包括了 Spark-SQL ,運作 spark-sql 指令,在 cdh5.2 中會出現下面異常:
在 cdh5.4 中會出現下面異常:
從上可以知道 Spark-SQL 編譯時沒有內建 Hive,故需要重新編譯 spark 源代碼。
下載下傳cdh5-1.3.0_5.4.0分支的代碼:
使用maven 編譯,先修改根目錄下的 pom.xml,添加一行 <code><module>sql/hive-thriftserver</module></code>:
然後運作:
如果編譯成功之後, 會在 assembly/target/scala-2.10 目錄下生成:spark-assembly-1.3.0-cdh5.4.0.jar,在 examples/target/scala-2.10 目錄下生成:spark-examples-1.3.0-cdh5.4.0.jar,然後将 spark-assembly-1.3.0-cdh5.4.0.jar 拷貝到 /usr/lib/spark/lib 目錄,然後再來運作 spark-sql。
但是,經測試 cdh5.4.0 版本中的 spark 的 sql/hive-thriftserver 子產品存在編譯錯誤,最後無法編譯成功,故需要等到 cloudera 官方更新源代碼或者等待下一個 cdh 版本內建 spark-sql。
本文主要介紹了 CDH5 叢集中 Spark 的安裝過程以及三種叢集運作模式:
Standalone – <code>spark-shell --master spark://host:port</code>
Apache Mesos – <code>spark-shell --master mesos://host:port</code>
Hadoop YARN – <code>spark-shell --master yarn</code>
如果以本地模式運作,則為 <code>spark-shell --master local</code>。