天天看點

Spark叢集安裝和使用1. 安裝2. 配置3. 啟動和停止4. 測試5. Spark-SQL6. 總結

本文主要記錄 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>&lt;module&gt;sql/hive-thriftserver&lt;/module&gt;</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>。

繼續閱讀