Spark的安裝與啟動
前言:
在上一篇關於 使用java和scala編寫spark-WordCount示例 的部落格中,筆者直接使用eclipse工具開發了spark的wordCount示例
當然,這種方式可以使用在我們需要對scala程式碼進行本地測試的時候,在實際的生產環境,我們肯定不能這麼做,我們需要將專案提交到spark叢集來進行測試
本篇部落格就簡單介紹下,如何安裝、啟動、使用spark
準備工作:
讀者需要提前瞭解一下spark的相關功能,及執行方式
下面就來安裝一下spark
1.下載spark包
我們到spark的官網來下載,官網地址:http://spark.apache.org/downloads.html
注意:我們可以自己下載spark原始碼之後進行手動編譯,也可以使用spark編譯好的tar包(筆者使用spark編譯好的tar包)
由於spark需要關聯hadoop來使用,所以我們需要首先安裝hadoop,至於hadoop的安裝方式,讀者可參考筆者另一片部落格
筆者使用的hadoop版本為2.7.0,所以選擇spark版本為2.2.0版本,圖示如下:
點選下載對應的tgz包即可
2.安裝tgz包
將包放到Linux環境下/home/hxw/software路徑下,解壓縮到/opt/software路徑下
tar -zxf spark-2.2.0-bin-hadoop2.7.tgz -C /opt/software
3.配置spark(配置檔案在%SPARK_HOME%/conf路徑下)
* 修改spark-env.sh.template檔名稱修改為spark-env.sh,並配置以下內容
JAVA_HOME=/opt/software/jdk1.8.0_131 #請配置自己的JAVA_HOME
SCALA_HOME=/opt/software/scala-2.11.12
HADOOP_CONF_DIR=/opt/software/hadoop-2.7.0 #指向自己配置的hadoop地址
下面新增spark資訊
SPARK_MASTER_HOST=hadoop # 筆者已經配置當前hostname為hadoop
SPARK_MASTER_PORT=7077
SPARK_MASTER_WEBUI_PORT=8080
SPARK_WORKER_CORES=1
SPARK_WORKER_MEMORY=2g
SPARK_WORKER_PORT=7078
SPARK_WORKER_WEBUI_PORT=8081
* 修改slaves檔案
hadoop #將原本的localhost修改為當前hostname,筆者的為hadoop
* 修改spark-defaults.conf,新增以下內容
spark.master spark://hadoop:7077
4.使用local模式來啟動spark
[[email protected] spark-2.2.0]# ./bin/spark-shell --master local
看到以下內容說明啟動成功:
[[email protected] spark-2.2.0]# ./bin/spark-shell --master local
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
18/10/21 20:23:58 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
18/10/21 20:24:04 WARN ObjectStore: Failed to get database global_temp, returning NoSuchObjectException
Spark context Web UI available at http://192.168.146.128:4040
Spark context available as 'sc' (master = local, app id = local-1540178639774).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.2.0
/_/
Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_131)
Type in expressions to have them evaluated.
Type :help for more information.
scala>
這時,我們可以通過檢視程序(使用jps命令來檢視)的方式來看到,spark只啟動了一個SparkSubmit應用,而且通過UI介面(http://hadoop:8080/)也看不到對應的任務
5.使用standalone模式來啟動spark
standalone模式構建一個由Master+Slave構成的spark叢集,spark執行在叢集中
* 啟動Master、slaves
[[email protected] spark-2.2.0]# ./sbin/start-master.sh
[[email protected] spark-2.2.0]# ./sbin/start-slaves.sh
通過jps看到以下,說明啟動成功
[[email protected] hxw]# jps
4321 Worker
4232 Master
注意:文字使用hdfs上的文字,路徑為/user/hadoop/mapreduce/input/wordcount.txt
當然,需要使用者提前啟動hadoop的HDFS,可使用下面的命令來啟動
[[email protected] hadoop-2.7.0]# ./sbin/start-dfs.sh
通過jps檢視程序(可以看到namenode和DataNode已經啟動,也可通過http://192.168.241.133:50070 檢視 )
[[email protected] hadoop-2.7.0]# jps
4321 Worker
4513 NameNode
4820 SecondaryNameNode
4933 Jps
4232 Master
4618 DataNode
6.通過spark-shell來提交我們編寫的應用
主要是在spark standalone模式下,我們可以提交自己編寫的應用到叢集上
* 編寫WordCount程式,具體如下:
object WordCountScala {
def main(args: Array[String]): Unit = {
// 預設使用叢集模式,非local
val sparkConf = new SparkConf().setAppName("wordCount");
val sc = new SparkContext(sparkConf)
// 我們使用hdfs上的文字,使用者需要先建立該檔案並提交到hdfs上
val lines = sc.textFile("hdfs://hadoop:9000/user/spark.txt");
val words = lines.flatMap(line => line.split(" "))
val pairs = words.map(word => (word,1))
val wordCounts = pairs.reduceByKey((a,b) => (a+b))
// 執行成功之後,將結果儲存到該路徑
wordCounts.saveAsTextFile("/opt/software/spark-2.2.0/data/sparktest/output/")
}
}
* 將WordCountScala所在專案export為jar包,命名為spark-test
* 編寫shell檔案 startJar.sh,具體內容如下:
#!/bin/bash
/opt/software/spark-2.2.0/bin/spark-submit \
--class spark.demo.WordCountScala \
/opt/software/spark-2.2.0/data/sparktest/spark-study.jar
我們只需要指定好對應的class和jar路徑即可
* 執行startJar.sh
* 到我們指定的輸出路徑檢查結果是否正確