一、前言
本章的目的是提供指導,以便讀者熟悉獨立模式下安裝Apache Spark的過程及其依賴關係。 然後,我們將開始與Apache Spark的第一次交互,通過使用Spark CLI(稱爲REPL,REPL是Read-Evaluate-Print Loop(讀取-求值-打印 循環)的首字母縮寫。)進行一些練習。
/** The Scala interactive shell. It provides a read-eval-print loop
* around the Interpreter class.
* After instantiation, clients should call the main() method.
*
* If no in0 is specified, then input will come from the console, and
* the class will attempt to provide input editing feature such as
* input history.
*
* @author Moez A. Abdel-Gawad
* @author Lex Spoon
* @version 1.2
*/
class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter)
extends AnyRef
with LoopCommands
我們將繼續討論Spark組件以及與Spark相關的常用術語,然後討論集羣環境中Spark工作的生命週期。 我們還將從圖形意義上探索Spark作業的執行,從創建DAG到執行Spark Web UI中提供的實用程序的最小任務單元。
最後,我們將通過使用Spark-Submit工具和Rest API討論Spark Job配置和提交的不同方法來結束本章。
快速安裝單機模式spark:
1.下載scala:http://www.scala-lang.org/download/
2.安裝scala:rpm -ivh scala-2.12.4.rpm
3.設置scala環境變量:vim /etc/profile
export SCALA_HOME=/usr/share/scalaexport PATH=$SCALA_HOME/bin:$PATH
4.下載spark:http://spark.apache.org/downloads.html
5.解壓spark:tar -xvf /opt/spark-2.2.1-bin-hadoop2.7.tgz
6.配置spark環境變量:vim /etc/profile
export SPARK_HOME=/opt/spark/export PATH=$PATH:$SPARK_HOME/bin
大功告成!
通過下述命令啓動spark單機模式:
$SPARK_HOME/bin/spark-shell
如果Spark二進制文件已經被加入到環境變量PATH中,我們可以簡單地執行spark-shell命令即可。
可以在http://localhost:4040中獲取spark驅動器用戶界面。稍後會細講
二、開始Spark REPL
Spark REPL或Spark shell(也稱爲Spark CLI)是探索Spark編程的非常有用的工具。 REPL是Read-Evaluate-Print Loop(讀取-求值-打印 循環)的首字母縮寫。 它是程序員用來與框架進行交互的交互式shell。 Apache Spark也帶有REPL,初學者可以使用它來理解Spark編程模型。
2.1使用Spark shell進行一些基本練習
請注意,Spark shell僅在Scala語言中可用。 但是,我們已經讓Java開發人員很容易理解這些例子。
2.1.1確認Spark版本
使用spark shell,通過下面的命令來確認spark腳本:
2.1.2創建和過濾RDD
讓我們從創建一個string組成的RDD開始:
現在,我們來過濾這個RDD,使得其只留下以“j”開頭的字符串
filter將一個rdd轉化爲另一個rdd,因此filter是transformation操作。
現在,我們對filteredrdd執行一個action操作來看看它的元素。讓我們對filteredrdd執行collect操作:
collect操作返回了一個string類型的數組。因此,它是一個action操作。
2.1.3RDD中的word count
讓我們對前面的stringRdd運行word count問題。word count就是大數據領域的HelloWorld。word count意味着我們將計算RDD中每個元素出現的次數。
我們如下來創建pairRDD變量:
(map():map是對RDD中的每個元素都執行一個指定的函數來產生一個新的RDD。任何原RDD中的元素在新RDD中都有且只有一個元素與之對應。)
pairRDD由單詞和1(整型)構成的pair組成,其中單詞代表的就是stringRDD中的字符串。
現在,我們對這個RDD執行reduceByKey操作來計算每個單詞出現的次數。
(*注:reduceByKey就是對元素爲KV對的RDD中Key相同的元素的Value進行binary_function的reduce操作,因此,Key相同的多個元素的值被reduce爲一個值,然後與原RDD中的Key組成一個新的KV對。)
現在,我們對其進行collect操作來看看結果:
2.1.4查找整數RDD中所有偶數的和
讓我們創建一個整數RDD:
我們對這個RDD執行filter操作過濾出所有的偶數:
現在,我們把evenNumbersRDD中的所有元素加起來
2.1.5 計算文件中的單詞數量
我們來讀取位於$SPARK_HOME/examples/src/main/resources中的people.txt文件:
在REPL中,用textfile()讀取文件:
下一步是扁平化文件的內容,也就是說,我們將通過分割每一行來創建一個RDD,並將列表中的所有單詞拼合起來,如下所示:
(flatMap可以理解爲先map後flat(扁平化),如此例中可將元素用逗號分隔成兩個。而map一個元素只能映射到一個元素。)
flattenFile RDD的內容如下:
現在,我們可以計算這個RDD的所有單詞數量。
無論何時調用諸如count的action,Spark都會創建一個有向無環圖(DAG)來描述每個RDD的沿襲依賴關係。 Spark提供了調試方法toDebugString()來顯示RDD的這種沿襲依賴關係:
參考文獻:
Apache Spark 2.x for Java developers
S Gulati,S Kumar - 2017 - 被引量: 0
Gulati, Sourav; Kumar, Sumit