天天看點

如何使用IDEA加載已有Spark項目

背景是這樣的:手上有一個學長之前實作的Spark項目,使用到了GraphX,并且用的Scala編寫,現在需要再次運作這個項目,但如果直接在IDEA中打開項目,則由于各種錯誤會導緻運作失敗,這裡就記錄一下該如何使用IDEA來加載老舊的Spark項目。

注意:預設你的機器已有Scala環境,項目使用IDEA打開,對Sbt不做要求,因為這裡采用的是NoSbt方式添加依賴的。

确定項目的版本環境

這一步是非常重要的,很多情況下就是由于版本的不比對導緻代碼解析出現錯誤,主要的環境版本包括:

  • Java Version 1.8 必須
  • scala-sdk-x.xx.x
  • spark-assembly-x.x.x-hadoop.x.x.jar //注意這是在No-sbt模式下必須的,這個包很大,大概170M,導入後不用再添加其他依賴即可對Spark程式進行本地(Local)運作,其已包括GraphX子產品。

Java的版本

這裡由于要是用Scala是以必須使用 Version 1.8+,關于如何修改版本這裡不贅述。

Scala的版本

這裡可以通過右鍵項目名稱,進入項目設定頁面具體檢視原項目使用的版本:

如何使用IDEA加載已有Spark項目
如何使用IDEA加載已有Spark項目

之後可以添加相應的Scala版本支援,比如假設這裡需要 2.10.4 那麼直接勾選即可,但是如果本機沒有對應的版本,那麼可以點選下方的

New Liberay

選擇Scala SDK,進入如下頁面:

如何使用IDEA加載已有Spark項目

在上述頁面中你可以選擇更多版本的Scala環境,如果還是沒有你需要的版本,那麼點選下方的

Download

按鈕,可以進一步選擇你需要的版本(涵蓋所有版本),這是線上下載下傳的操作,是以可能時間會非常慢,非常慢!

Spark-assembly的版本

關于這個地方要特别注意版本的對應,老項目裡有代碼用到了 GraphX中 圖的 mapReduceTriplets ,這應該在Spark-2.x.x以後被取消了,是以如果下次再在網上看到使用mapReduceTriplets的代碼,複制到本地卻無法識别時,不要慌張,那是他們使用了老版本的Spark-GraphX。

在這裡,原項目使用的是 spark-assembly-1.4.1-hadoop2.6.0.jar 但是這個jar包早就不在項目檔案中了,然後在網上也沒有搜到完全比對的Jar包,但上文已說到,找個spark-1.x 版本的即可,是以在網上找了一個 spark-assembly-1.5.1-hadoop2.6.0.jar,同樣在 上圖 中的右側點選加号後選擇

JARS or direct..

添加到項目依賴中即可。

确定項目代碼的運作環境

在上一部分中對原項目的項目的所需依賴的版本進行了更正對應之後,可以發現原先滿屏飄紅的代碼已經沒有錯誤了,即這時IDEA已經具有了對于代碼的完全的解析能力,這時我們寫代碼調方法都可以自動補全等等。

雖然代碼無措,但是直接運作仍然是出不來結果的,因為原項目的代碼有原來的運作環境,可能是叢集環境或其他,另外,源代碼的執行也有可能需要傳入若幹參數,貿然運作當然就不會得到預期結果。

這部分的修改要具體情況具體分析,但大緻都有以下幾步:

  • 檢視Main函數的傳入參數,如果帶參數的,要明确參數的具體意義,一個是參數類型,一個是參數意義。比如疊代次數,或是檔案路徑。如果偷懶,可以去掉傳入參數,直接對相應變量指派,這樣就可以在IDE中直接運作調試了。
//諸如下面指派内容要搞清楚具體意義
if(args.length!=5){                                                                 
  printf("Please input right parameters <vertex path> <edges path> <output path> <deep> <time> ")
  return                                                                            
}      
//可以直接對變量指派,而不用輸入參數args(x)
val time=args(4).toInt                                                              
val vertexPath=args(0)                                                              
val edgesPath=args(1)                                                               
val outputPath=args(2)                                                              
val deep:Int=args(3).toInt           

複制

  • 叢集運作還是本地運作,這裡比較好改:
val conf = new SparkConf().setAppName("Proj_SIG") 
//如果是簡單調試,直接改為本地運作即可
val conf = new SparkConf().setAppName("Proj_SIG").setMaster("local")
           

複制

可能需要的Hadoop支援

如果出現錯誤:

Failed to locate the winutils binary in the hadoop binary path

那麼說明目前IDEA環境缺失hadoop的支援。

解決方案:

首先我們需要明白,hadoop隻能運作在linux環境下,如果我們在windows下用idea開發spark的時候底層比方說檔案系統這些方面調用hadoop的時候是沒法調用的,這也就是為什麼會提示這樣的錯誤。

當我們有這樣的錯誤的時候,其實還是可以使用spark計算架構的,不過當我們使用saveAsTextFile的時候會提示錯誤,這是因為spark使用了hadoop上hdfs那一段的程式,而我們windows環境下沒有hadoop,怎麼辦?

第一步: 官網下載下傳相應版本的hadoop。

第二步:解壓到你想要安裝的任何路徑,解壓過程會提示出現錯誤,不去管他,這是因為linux檔案不支援windows。

第三步:設定環境變量,在系統變量中添加HADOOP_HOME,指向你解壓的檔案路徑。然後再path中添加

%HADOOP_HOME%bin和%HADOOP_HOME%sbin

第四步:找一找可以使用的重新編譯的winutils相容工具插件包,這個可以在這裡下載下傳:

第五步:下載下傳完以後在我們hadoop檔案夾中替換下載下傳包中的兩個目錄。

回到idea會發現bug完美解決。

上述幾步修改完成後,原先的代碼基本就可以跑起來了,再次強調這裡使用了NoSBT的模式,手動添加了一個assembly包,再就是對應Scala-SDK的版本,最後對代碼内容上進行部分改動,使其可以在本地單機進行調試運作。