簡介
Spark是基于內(nèi)存計算的開源分布式大數(shù)據(jù)計算框架。為了更好欲低、更快地開發(fā)Spark應(yīng)用程序聪轿,開發(fā)者不僅要掌握Spark的理論基礎(chǔ)和實現(xiàn)原理,更需要掌握Spark應(yīng)用程序調(diào)試方式笛质。
Spark應(yīng)用程序調(diào)試方式有:本地調(diào)試模式、服務(wù)器調(diào)試模式骤星、遠(yuǎn)程調(diào)試模式经瓷。接下來本文會一一介紹這幾種調(diào)試方式的使用爆哑。
本地調(diào)試模式
1.
Spark本地開發(fā)工具推薦使用IntelliJ IDEA洞难。編譯工具推薦使用Maven或者IntelliJ IDEA自身編譯。IntelliJ IDEA開發(fā)Spark應(yīng)用程序和開發(fā)其他應(yīng)用程序一樣揭朝,可以進行debug調(diào)試队贱,輸出日志等等。
2.
安裝JDK和Scala潭袱。安裝版本請參考Spark官方網(wǎng)站說明柱嫌。如2.0.2版本官網(wǎng)描述Spark runs on Java 7+, Python2.6+/3.4+ and R 3.1+. For the Scala API, Spark 2.0.2 uses Scala 2.11. You willneed to use a compatible Scala version (2.11.x).
3.
安裝Spark,直接去Download Apache Spark屯换。有兩個步驟:
選擇好對應(yīng)Hadoop版本的Spark版本编丘,如下圖中所示;
然后點擊下圖中箭頭所指的spark-2.0.2-bin-hadoop2.7.tgz彤悔,等待下載結(jié)束即可嘉抓。
這里使用的是Pre-built的版本,意思就是已經(jīng)編譯了好了晕窑,下載來直接用就好抑片。Spark也有源碼可以下載,但是得自己去手動編譯之后才能使用杨赤。下載完成后將文件進行解壓(可能需要解壓兩次)敞斋,最好解壓到一個盤的根目錄下截汪,并重命名為Spark,簡單不易出錯植捎。并且需要注意的是衙解,在Spark的文件目錄路徑名中,不要出現(xiàn)空格焰枢,類似于“Program Files”這樣的文件夾名是不被允許的丢郊。
解壓后基本上就可以到cmd命令行下運行了。但這個時候每次運行spark-shell(Spark的命令行交互窗口)的時候医咨,都需要先cd到Spark的安裝目錄下枫匾,比較麻煩,因此可以將Spark的bin目錄添加到系統(tǒng)變量PATH中拟淮。例如我這里的Spark的bin目錄路徑為D:Sparkbin干茉,那么就把這個路徑名添加到系統(tǒng)變量的PATH中即可,方法和JDK安裝過程中的環(huán)境變量設(shè)置一致很泊。設(shè)置完系統(tǒng)變量后角虫,在任意目錄下的cmd命令行中,直接執(zhí)行spark-shell命令委造,即可開啟Spark的交互式命令行模式戳鹅。
4.
IntelliJ IDEA添加Spark發(fā)布的依賴包或者通過Maven配置Spark相關(guān)依賴。
5.
安裝Hadoop昏兆,系統(tǒng)變量設(shè)置后枫虏,就可以在任意當(dāng)前目錄下的cmd中運行spark-shell,但這個時候很有可能會碰到各種錯誤爬虱,這里主要是因為Spark是基于Hadoop的隶债,所以這里也有必要配置一個Hadoop的運行環(huán)境。在HadoopReleases里可以看到Hadoop的各個歷史版本跑筝,這里下載的Spark是基于Hadoop 2.6的(在Spark安裝的第一個步驟中死讹,我們選擇的是Pre-built for Hadoop2.6),所以這里選擇2.6.4版本曲梗。選擇好相應(yīng)版本并點擊后赞警,進入詳細(xì)的下載頁面,如下圖所示虏两,選擇圖中紅色標(biāo)記進行下載愧旦。
這里下載的是已經(jīng)編譯好的版本。下載并解壓到指定目錄碘举,然后到環(huán)境變量部分設(shè)置HADOOP_HOME為Hadoop的解壓目錄忘瓦,我這里是F:Program Fileshadoop,然后再設(shè)置該目錄下的bin目錄到系統(tǒng)變量的PATH下,我這里也就是F:Program Fileshadoopbin耕皮,如果已經(jīng)添加了HADOOP_HOME系統(tǒng)變量境蜕,也可以用%HADOOP_HOME%bin來指定bin文件夾路徑名。這兩個系統(tǒng)變量設(shè)置好后凌停,開啟一個新的cmd粱年,然后直接輸入spark-shell命令。
正常情況下是可以運行成功并進入到Spark的命令行環(huán)境下的罚拟,但是對于有些用戶可能會遇到空指針的錯誤台诗。這個時候,主要是因為Hadoop的bin目錄下沒有winutils.exe文件的原因造成的赐俗。這里的解決辦法是:
去https://github.com/steveloughran/winutils選擇你安裝的Hadoop版本號拉队,然后進入到bin目錄下,找到winutils.exe文件阻逮,下載方法是點擊winutils.exe文件粱快,進入之后在頁面的右上方部分有一個Download按鈕,點擊下載即可叔扼。
-
下載好winutils.exe后事哭,將這個文件放入到Hadoop的bin目錄下,我這里是F:Program Fileshadoopbin瓜富。在打開的cmd中輸入F:ProgramFileshadoopbinwinutils.exe chmod 777 /tmp/Hive
這個操作是用來修改權(quán)限的鳍咱。注意前面的F:Program Fileshadoopbin部分要對應(yīng)的替換成實際你所安裝的bin目錄所在位置。經(jīng)過這幾個步驟之后与柑,然后再次開啟一個新的cmd窗口谤辜,如果正常的話,應(yīng)該就可以通過直接輸入spark-shell來運行Spark了仅胞。
6.
熟練掌握Spark的API每辟。Spark的API支持Scala、Java干旧、R和Python語言。API包括常見的變化操作算子和行動操作算子妹蔽。
Spark 服務(wù)器調(diào)試模式
spark-submit提交jar包椎眯。
將本地應(yīng)用程序打成jar包放在服務(wù)器上,在該服務(wù)器上執(zhí)行spark-submit--class com.zte.spark.example.WordCount --executor-memory 1G --total-executor-cores 3 /home/mr/SparkTest.jar /tmp/test.txt
spark-shell可以直接調(diào)試代碼胳岂。
spark-sql可以直接調(diào)試SQL語句编整。
遠(yuǎn)程調(diào)試模式
Spark遠(yuǎn)程調(diào)試模式實際上利用的是JVM的遠(yuǎn)程debug調(diào)試。有時候Spark集群環(huán)境出現(xiàn)問題乳丰,當(dāng)查看日志和WEB UI無法解決問題的時候掌测,利用遠(yuǎn)程debug進行調(diào)試是一個十分快捷和有效的方式。
-Xdebug -Xrunjdwp:transport=dt_socket,address=5006,server=y,suspend=y
參數(shù)含義:
-Xdebug:告訴JVM運行在debug模式下
-Xrunjdwp:transport=dt_socket:指定連接方式(包括socket傳輸和內(nèi)存?zhèn)鬏攦煞N产园,其中內(nèi)存?zhèn)鬏斨恢С諻indows汞斧,而且內(nèi)存?zhèn)鬏敳恢С诌h(yuǎn)程調(diào)試)
address=5006:JVM在5006端口上監(jiān)聽請求夜郁。
server=y:y表示啟動的JVM是被調(diào)試者。如果為n粘勒,則表示啟動的JVM是調(diào)試器竞端。
suspend=y:y表示啟動的JVM會暫停等待,服務(wù)端被掛起庙睡,直到調(diào)試器連接上事富。n表示JVM不會暫停等待。
客戶端設(shè)置:
打開IntelliJIDEA工作臺
選擇“Run->Debug Configurations”菜單項
選擇“Remote”乘陪,在右鍵彈出菜單中選擇“New”
- 點擊OK即可统台,就可以用本地的Spark代碼調(diào)試Spark集群的功能。
服務(wù)器設(shè)置:
SPARK_MASTER_OPTS=-Xdebug-Xrunjdwp:transport=dt_socket,address=5006,server=y,suspend=n:調(diào)試Master的功能代碼啡邑。
SPARK_WORKER_OPTS=-Xdebug-Xrunjdwp:transport=dt_socket,address=5006,server=y,suspend=n:調(diào)試Worker的功能代碼饺谬。
SPARK_HISTORY_OPTS=-Xdebug-Xrunjdwp:transport=dt_socket,address=5006,server=y,suspend=n:調(diào)試History Server的功能代碼。
spark-submit谣拣、spark-sql募寨,spark-shell調(diào)試設(shè)置:
spark-submit、spark-sql森缠,spark-shell配合spark.driver.extraJavaOptions和spark.executor.extraJavaOptions參數(shù)使用拔鹰,可以遠(yuǎn)程調(diào)試Spark應(yīng)用程序和GUI命令程序。如下:
spark-submit --classcom.zte.spark.example.WordCount --driver-java-options'-Xdebug -Xrunjdwp:transport=dt_socket,address=5006,server=y,suspend=n'--executor-memory 1G --total-executor-cores 3 /home/mr/SparkTest.jar /tmp/test.txt
spark-sql --executor-memory 1Gexecutor-cores 1 --driver-java-options '-Xdebug-Xrunjdwp:transport=dt_socket,address=5006,server=y,suspend=n'
spark-shell --executor-memory 1Gexecutor-cores 1--driver-java-options '-Xdebug-Xrunjdwp:transport=dt_socket,address=5006,server=y,suspend=n'
總結(jié)
我們在日常開發(fā)中贵涵,上述幾種調(diào)試模式均需要熟練掌握并且合理使用列肢。本地調(diào)試方式適合日常開發(fā)人員在本地開發(fā),無需占用緊張的集群服務(wù)器環(huán)境宾茂,多個開發(fā)人員互不影響瓷马,本地調(diào)試在開發(fā)效率上也是最優(yōu)的。服務(wù)器調(diào)試模式適合多個應(yīng)用聯(lián)調(diào)測試和集成測試跨晴,適合做性能測試欧聘。遠(yuǎn)程調(diào)試模式主要是解決難以定位的故障,實際證明端盆,該方式也是定位問題最有效的手段之一