Spark 的運行模式有 Local(也稱單節點模式),Standalone(集群模式),Spark on Yarn(運行在Yarn上),Mesos以及K8s等常用模式,本文介紹第一種模式。
1、Local模式
Local模式就是運行在一台計算機上的模式, 也稱單節點模式 。Local 模式是最簡單的一種Spark運行方式,它采用單節點多線程(CPU)方式運行, 通常就是用於在本機學習或者測試使用的,對新手比較友好。它可以通過以下的方式設置Master:
-
local:所有的計算都運行在一個線程中,沒有任何的並行計算。通常我們在學習和測試的時候都是使用這種模式;
-
local[K]:這種方式可以指定用幾個線程來計算,比如local[4],就是指定4個Worker線程。通常我們的CPU有幾個Core,就指定介個線程,最大化的利用CPU的計算能力;
-
local[*]:這種模式直接幫你按照CPU最多Core來設置線程數量了。
2、安裝使用
說了那么多,還沒見真章。那么接下來開始安裝使用一下~~
1)上傳並且解壓Spark安裝包
我使用的是spark-2.1.1-bin-hadoop2.7.tgz
[simon@hadoop102 sorfware]$ tar -zxvf spark-2.1.1-bin-hadoop2.7.tgz -C /opt/module/
[simon@hadoop102 module]$ mv spark-2.1.1-bin-hadoop2.7 spark
解壓完成之后看到目錄還是非常清晰的:

2)蒙特卡羅法求PI
這是一個官方小案例,看代碼
[simon@hadoop102 spark]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--executor-memory 1G \
--total-executor-cores 2 \
./examples/jars/spark-examples_2.11-2.1.1.jar \
100
解析一下上邊的語法:
- --master:指定Master的地址,默認為Local
- --class: 你的應用的啟動類 (如
org.apache.spark.examples.SparkPi
) - --deploy-mode: 是否發布你的驅動到worker節點(cluster) 或者作為一個本地客戶端 (client) (default: client)*
- --conf: 任意的Spark配置屬性, 格式key=value. 如果值包含空格,可以加引號“key=value”
- application-jar: 打包好的應用jar,包含依賴. 這個URL在集群中全局可見。 比如hdfs:// 共享存儲系統, 如果是 file:// path, 那么所有的節點的path都包含同樣的jar
- application-arguments: 傳給main()方法的參數
- --executor-memory 1G :指定每個executor可用內存為1G
- --total-executor-cores 2 :指定每個executor使用的cup核數為2個
這就是迭代100次的運算結果,運行速度還是非常快的:

再來一個小的WordCount的小案例演示,同樣也是很簡單的。
1)創建待輸入的文件
[simon@hadoop102 spark]$ mkdir input
#創建a.txt和b.txt,填寫如下內容:
hello simon
hello spark
我創建的過程和編寫的文件內容如下:

2)啟動spark-shell
[simon@hadoop102 spark]$ bin/spark-shell
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
....
#會打印一堆的啟動日志信息
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.1.1
/_/
Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_144)
Type in expressions to have them evaluated.
Type :help for more information.
scala>
在啟動日志中可以看到這么三行:

解釋一下這三個東西:
- Web UI : 可以在web頁面看到Spark集群的信息;
- Spark context ..sc:可以理解為
sc
是Spark Core的程序入口; - Spark session ..spark:可以理解為
spark
是Spark SQL程序的入口。
之后會用到,到時候再詳細解釋~~~
再起一個窗口,執行jps可以看到啟動了SparkSubmit進程,這樣就算是啟動成功了~~

3)運行WordCount程序
sc.textFile("./input").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
看運行結果,nice ~~

后邊我們會解釋這些代碼的含義。
可登錄hadoop102:4040查看程序運行,整個流程還是非常清晰的:

3、分析WordCount流程
直接看個圖吧:

那我們回過頭來解釋一下代碼吧,有scala語言基礎的話,看起來還不是太難:
- textFile("input"):讀取本地文件input文件夾數據;
- flatMap(_.split(" ")):壓平操作,按照空格分割符將一行數據映射成一個個單詞;
- map((__,1)):對每一個元素操作,將單詞映射為元組;
- reduceByKey(+):按照key將值進行聚合,相加;
- collect:將數據收集到Driver端展示。
我這樣語言組織起來比較費勁,先留個坑,過段時間回過頭來再補充流程分析。
文件是怎么被讀出、被分割、被統計展示的呢?還是看圖吧,等我組織好語言回來補充:

參考資料:
[1]李海波. 大數據技術之Spark