生產(chǎn)環(huán)境的 Spark Job 都是跑在集群上的,畢竟 Spark 為大數(shù)據(jù)而生,海量的數(shù)據(jù)處理必須依靠集群。但是在開發(fā)Spark的的時候,不可避免我們要在本地進(jìn)行一些開發(fā)和測試工作,所以如何在本地用好Spark也十分重要,下面給大家分享一些經(jīng)驗(yàn)。
首先你需要在本機(jī)上安裝好了Java,Scala和Spark,并配置好了環(huán)境變量。詳情請參考官方文檔或其他教程。
spark-shell
本地運(yùn)行Spark最直接的方式就是在命令行里面運(yùn)行spark-shell,成功后你將看到如下信息:

首先可以仔細(xì)閱讀一下命令行的提示信息,
Picked up _JAVA_OPTIONS: -Xmx512M -Xms512M // _JAVA_OPTIONS是我在系統(tǒng)環(huán)境變量里面設(shè)置的值
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties // 告訴你log4j使用配置
Setting default log level to "WARN". // log級別
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel). // 如何調(diào)整log級別
Spark context Web UI available at http://localhost:4040 // 本地訪問Web UI的地方,很重要
Spark context available as 'sc' (master = local[*], app id = local-1590066004392). // master配置和 sc變量
Spark session available as 'spark'. // spark變量
可以發(fā)現(xiàn)必要的信息都已經(jīng)給我們提示好了,不過不知道哪里養(yǎng)成的壞習(xí)慣,程序的提示信息我通常都是跳過不看的,其實(shí)這樣很不好,希望你沒有這種壞習(xí)慣。
我們再仔細(xì)看一下 master = local[*] 這個配置,它告訴Spark在運(yùn)行中可以使用多少個核,詳細(xì)如下:
- local: 所有計算都運(yùn)行在一個線程當(dāng)中,沒有任何并行計算。
- local[n]: 指定使用n個線程來運(yùn)行計算。
- local[*]: 這種模式直接幫你按照cpu最多cores來設(shè)置線程數(shù)了。
你可以在這個命令行像使用python解釋器一樣寫scala代碼,可以及時看到程序的運(yùn)行結(jié)果,這種模式通常在最初學(xué)習(xí)spark的時候使用,或者你想要驗(yàn)證一些臨時、簡短的spark代碼,可以使用這種方式。
Spark Web UI
在你使用Spark 期間,可以通過 http://localhost:4040 來訪問Web UI.
這是Spark提供的非常強(qiáng)大的一個工具,它可以看到運(yùn)行過程中的豐富細(xì)節(jié),網(wǎng)上有很多資料可以參考,這里不詳細(xì)介紹。Spark Web UI
值得一提的是,Web UI 只在你SparkSession活躍期間可以訪問,當(dāng)你的job完成時這個地址就關(guān)閉了。當(dāng)你打開一個spark-shell的時候,你的spark session會一直活躍,所以可以隨時訪問Web UI;當(dāng)你關(guān)閉命令行的時候就不可以了。 當(dāng)然你也可以通過修改配置保存這些信息,可以讓你在程序退出后依然有辦法從Web UI查看,但操作起來有點(diǎn)復(fù)雜,并且一般用的頻率小,就不推薦了。
Jupyter Notebook
比spark-shell更好的一種方式是使用Notebook,Notebook。 首先你可以在本機(jī)安裝Anaconda,安裝完之后自帶Jupyter Notebook,但是它默認(rèn)只支持python 的kernel,也就是說只能寫python,為了能寫spark job(實(shí)際上是Scala腳本)需要再安裝一些插件,插件其實(shí)很多,我找到了一種非常簡便的方法,推薦給大家:
按照上面的教程安裝完之后,你打開Notebook,再new 下面可以看到一個新的kernel選項

新建之后就可以寫spark job了。
顯然Notebook比命令行的方式好的多,不但可以執(zhí)行代碼,還可以修改、保存、分享,本地調(diào)試一些小的程序時候或者演示、驗(yàn)證一些新功能的時候首選這種方式。
第一次啟動scala解釋器的時候時間會比較久,請耐心等待。查看你的notebook命令行輸出,是否忘了配置 SPARK_HOME 環(huán)境變量?
成功運(yùn)行之后你將看到如下信息:

同樣,在你的Notebook運(yùn)行期間你也可以到 http://localhost:4040 頁面查看Spark Web UI.
IDEA
當(dāng)然,你也可以在IDEA 中寫代碼并測試,這個更接近生產(chǎn)環(huán)境的工作,一般最后都要使用它寫好完整的代碼,編譯并打包為jar. IDEA的介紹請參考 IDEA中運(yùn)行Java/Scala/Spark程序.
寫代碼的過程不再做介紹,在IDEA里運(yùn)行的時候同樣需要指定master為本機(jī),你有兩種方式可以使用:一是在程序的代碼里直接設(shè)置,另外一種是在VM參數(shù)中添加。建議選擇后者。
Run -> Edit Configurations -> VM Options: -Dspark.master=local[6]
另外你還可以增加一個命令行參數(shù),例如: --local, 這樣你可以在腳本中方便地輸出一些只有你在本地想看的信息。
// 檢查命令行參數(shù),賦值給local變量,方便測試一些本地信息
if(arg.startsWith("--local"))
{
local = true
}
最后,當(dāng)你在IDEA里面運(yùn)行Spark Job的時候,運(yùn)行結(jié)束之后Web UI的端口會自動關(guān)閉,所以如果你想要在程序運(yùn)行完的一段時間內(nèi)還可以看到這些信息(通常都是需要的),你需要在程序結(jié)束的位置加上如下語句:
if(local)
{
System.in.read
spark.stop()
}
如果你喜歡我的文章,歡迎到我的個人網(wǎng)站關(guān)注我,非常感謝!