如何在本地調試你的 Spark Job

[](http://haipeng-openwrite.oss-...python

生產環境的 Spark Job 都是跑在集羣上的,畢竟 Spark 爲大數據而生,海量的數據處理必須依靠集羣。可是在開發Spark的的時候,不可避免咱們要在本地進行一些開發和測試工做,因此如何在本地用好Spark也十分重要,下面給你們分享一些經驗。shell

首先你須要在本機上安裝好了Java,Scala和Spark,並配置好了環境變量。詳情請參考官方文檔或其餘教程。

spark-shell

本地運行Spark最直接的方式就是在命令行裏面運行spark-shell,成功後你將看到以下信息:apache

spark-shell

首先能夠仔細閱讀一下命令行的提示信息,session

Picked up _JAVA_OPTIONS: -Xmx512M -Xms512M  // _JAVA_OPTIONS是我在系統環境變量裏面設置的值
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). // 如何調整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變量

能夠發現必要的信息都已經給咱們提示好了,不過不知道哪裏養成的壞習慣,程序的提示信息我一般都是跳過不看的,其實這樣很很差,但願你沒有這種壞習慣。app

咱們再仔細看一下 master = local[*] 這個配置,它告訴Spark在運行中能夠使用多少個核,詳細以下:工具

  • local: 全部計算都運行在一個線程當中,沒有任何並行計算。
  • local[n]: 指定使用n個線程來運行計算。
  • local[*]: 這種模式直接幫你按照cpu最多cores來設置線程數了。

你能夠在這個命令行像使用python解釋器同樣寫scala代碼,能夠及時看到程序的運行結果,這種模式一般在最初學習spark的時候使用,或者你想要驗證一些臨時、簡短的spark代碼,能夠使用這種方式。post

Spark Web UI

在你使用Spark 期間,能夠經過 http://localhost:4040 來訪問Web UI.
這是Spark提供的很是強大的一個工具,它能夠看到運行過程當中的豐富細節,網上有不少資料能夠參考,這裏不詳細介紹。Spark Web UI學習

值得一提的是,Web UI 只在你SparkSession活躍期間能夠訪問,當你的job完成時這個地址就關閉了。當你打開一個spark-shell的時候,你的spark session會一直活躍,因此能夠隨時訪問Web UI;當你關閉命令行的時候就不能夠了。 固然你也能夠經過修改配置保存這些信息,可讓你在程序退出後依然有辦法從Web UI查看,但操做起來有點複雜,而且通常用的頻率小,就不推薦了。測試

Jupyter Notebook

比spark-shell更好的一種方式是使用Notebook,Notebook。 首先你能夠在本機安裝Anaconda,安裝完以後自帶Jupyter Notebook,可是它默認只支持python 的kernel,也就是說只能寫python,爲了能寫spark job(其實是Scala腳本)須要再安裝一些插件,插件其實不少,我找到了一種很是簡便的方法,推薦給你們:大數據

spylon-kernel

按照上面的教程安裝完以後,你打開Notebook,再new 下面能夠看到一個新的kernel選項

scala kernel

新建以後就能夠寫spark job了。

顯然Notebook比命令行的方式好的多,不但能夠執行代碼,還能夠修改、保存、分享,本地調試一些小的程序時候或者演示、驗證一些新功能的時候首選這種方式。

第一次啓動scala解釋器的時候時間會比較久,請耐心等待。查看你的notebook命令行輸出,是否忘了配置 SPARK_HOME 環境變量?

成功運行以後你將看到以下信息:

notebook

一樣,在你的Notebook運行期間你也能夠到 http://localhost:4040 頁面查看Spark Web UI.

IDEA

固然,你也能夠在IDEA 中寫代碼並測試,這個更接近生產環境的工做,通常最後都要使用它寫好完整的代碼,編譯並打包爲jar. IDEA的介紹請參考 IDEA中運行Java/Scala/Spark程序.

寫代碼的過程再也不作介紹,在IDEA裏運行的時候一樣須要指定master爲本機,你有兩種方式能夠使用:一是在程序的代碼裏直接設置,另一種是在VM參數中添加。建議選擇後者。

Run -> Edit Configurations -> VM Options: -Dspark.master=local[6]

另外你還能夠增長一個命令行參數,例如: --local, 這樣你能夠在腳本中方便地輸出一些只有你在本地想看的信息。

// 檢查命令行參數,賦值給local變量,方便測試一些本地信息
if(arg.startsWith("--local"))
{
    local = true
}

最後,當你在IDEA裏面運行Spark Job的時候,運行結束以後Web UI的端口會自動關閉,因此若是你想要在程序運行完的一段時間內還能夠看到這些信息(一般都是須要的),你須要在程序結束的位置加上以下語句:

if(local)
{
    System.in.read
    spark.stop()
}
若是你喜歡個人文章,歡迎到個人 我的網站關注我,很是感謝!
相關文章
相關標籤/搜索