eclipse構建maven+scala+spark工程


本文先敘述如何配置eclipse中maven+scala的開發環境,之后,敘述如何實現spark的本地運行。最后,成功運行scala編寫的spark程序。

 

剛開始我的eclipse+maven環境是配置好的。

系統:win7

eclipse版本:Luna Release(4.4.0)

maven是從EclipseMarket中安裝的,如圖1。

當初構建eclipse+maven環境時,僅僅安裝了第一個。

這里可以先不用急着安裝maven,下面在安裝maven for scala時,也提供了maven for eclipse。

 

圖1-eclipse安裝的m2e插件

 

一、配置eclipse + maven + scala環境

 

1. 在Eclipse Market中安裝Scala IDE

圖2-eclipse安裝Scala IDE

 

2. 安裝m2e-scala

如圖3,圖中的url是:http://alchim31.free.fr/m2e-scala/update-site/

從圖3中搜索到的插件名稱中可以看到,這里同時也配置了m2e,也即eclipse需要的maven插件。如果eclipse沒有eclipse插件,則可以全部選中安裝;若已經有了可以單獨安裝第三個Maven Integration for Scala IDE。

安裝完成了MavenIntegration for Scala IDE之后,再輸入上面的url,可安裝列表里就沒有Maven Integration for Scala IDE這一項了。

(PS:此處我是將MavenIntegration for Scala IDE卸載了之后重新截圖的)

(PS:如果再看圖1,除了第一個MavenIntegration for Eclipse(Luna and newer)1.5之外,還有一個MavenIntegration for Eclipse(Luna)1.5.0,。這是我在使用上述 url安裝m2e-scala時,沒有注意其中還包含了MavenIntegration for Eclipse,導致安裝了兩個版本的Maven Integration for Eclipse)

(PS:雖然我已經安裝上述url中的MavenIntegration for Eclipse,並且並沒有卸載,而圖3中依然顯示了Maven Integration for Eclipse的選項,是因為其版本有了更新。可以從其中看到其最新的版本是1.5.1,此時若繼續安裝該Maven Integration for Eclipse,則是對版本進行更新。)

(PS:圖1中還有一個MavenIntegration for Eclipse WTP(Juno)1.0.1暫時不知道是怎么安裝上去的)

 

圖3-安裝m2e-scala

 

二、測試eclipse+maven+scala的運行環境

 

1. 先來簡單測試一下eclipse+scala

新建一個名為Scala Project,右鍵工程添加一個名為test的Scala Object,代碼如下:

 

[java]  view plain  copy
 
  1. package test  
  2.   
  3. object test {  
  4.   def main(args : Array[String]) {  
  5.     println("hello world")  
  6.   }  
  7. }  

 

最終如圖4、5所示。

圖4-新建scalaproject

 

圖5-scala工程目錄

        

         右鍵test.scala,Run as…-> Scala Application,在終端成功輸出了hello world。

         從圖5中可以看到,我們安裝的ScalaIDE中自帶的scala版本是2.11.5的。

        

         (PS:如果不在終端以命令行的形式使用scala的話,似乎可以不用單獨下載scala包並設置環境變量)

2. 再來測試一下ecliipse+scala+maven

本來新建一個scala+maven的流程可以是這樣的,如圖6所示。

新建maven工程,不勾選Createa simple project,選擇與scala有關的archetype。

eclipse的archetype是一種模板,給人的感覺就是其中的目錄架構及相關文件(比如說pom.xml)都是按照某種模式(如scala maven)構造好的。如果選擇如圖6中的1.2版本的scala相關archetype,則新建的maven工程就有了scala maven工程的目錄結構,pom.xml也是配置好的,並且還有幾個scala的代碼文件。

但是,有一些錯誤,編譯無法通過。我想,這主要是因為scala的版本問題,從工程中的pom.xml中可以看到,這個模板是基於scala 2.7.0構建的。而我們安裝的scala IDE是基於scala 2.11.5。

圖6-新建scala maven工程

 

scala的新版本對老版本的兼容似乎並不好。這里可以自己修正pom.xml文件,不過估計代碼可能也要修改。

我這里是從git上下載了一個現成的基於scala2.11.5的maven工程。

git網址:https://github.com/scala/scala-module-dependency-sample

使用git clone下來之后,在eclipse中導入maven工程(maven-sample)。

         從其pom.xml中可以看到,是基於scala-2.11.5的。其中只有一個代碼文件,即是XMLHelloWorld.scala。只要能夠順利的拉取到pom.xml中的依賴包,就可以直接右鍵XMLHelloWorld.scala, Run as -> Scala Application。

         至此,ecipse+scala+maven就搭建好了。接下來配置spark的本地運行環境。

三、配置spark的本地運行

 

1. 配置所需依賴包

         這里我是在maven-sample工程的基礎上配置spark的。

         在pom.xml中添加spark-core。

 

[html]  view plain  copy
 
  1. <dependency>  
  2.     <groupId>org.apache.spark</groupId>  
  3.     <artifactId>spark-core_2.11</artifactId>  
  4.     <version>1.2.1</version>  
  5. </dependency>  

 

 

在default package中添加scala object – SimpleApp。代碼如下:

 

[java]  view plain  copy
 
  1. /* SimpleApp.scala */  
  2. import org.apache.spark.SparkContext  
  3. import org.apache.spark.SparkContext._  
  4. import org.apache.spark.SparkConf  
  5.   
  6. object SimpleApp {  
  7.   def main(args: Array[String]) {  
  8.     val logFile = "test.txt" // Should be some file on your system  
  9.     val conf = new SparkConf().setAppName("Simple Application").setMaster("local[2]")  
  10.     val sc = new SparkContext(conf)  
  11.     val logData = sc.textFile(logFile, 2).cache()  
  12.     val numAs = logData.filter(line => line.contains("a")).count()  
  13.     val numBs = logData.filter(line => line.contains("b")).count()  
  14.     println("Lines with a: %s, Lines with b: %s".format(numAs, numBs))  
  15.   }  
  16. }  

 

 

此時,編譯已經通過了,但是如果Run as–> Scala Application的話,會有ClassDefNotFound的異常。

這是因為spark-core其實需要依賴很多其他的jar包來運行,但這些包在spark-core包中並沒有,並且在我們的classpath中也沒有。

我們可以方便的從在線maven庫里找到spark-core包。

網址:http://search.maven.org/

 

圖7-spark-core

 

我們點擊后面的pom鏈接,可以看到spark-core的pom.xml文件,其中依賴的包很多。

將其中所有的dependency拷貝到我們的maven-sample工程的pom.xml中。重新build工程的時候,需要下載很多包,可能需要很長時間。

(PS:從spark-core的pom.xml文件中可以很直觀看到的是,其中org.scala-lang.scala-library組件我們原本已經有了,不過版本稍有不同,可以刪掉,也可不刪。)

其實,也可自己根據ClassDefNotFound的提示一步步自己添加依賴包,不過,需要添加的可不少。

並且,因為spark-core依賴的眾多包,又依賴了其他的包。所以,你可能在根據ClassDefNotFound異常添加依賴包的過程中,發現一些Class所依賴的包在spark-core的pom.xml文件中並未看到。這是因為它們存在於spark-core的依賴包的依賴包中。而且,spark-core的依賴包所依賴的包,還有些版本的沖突,手動添加的過程中,可能還會遇到MethodNotFound的錯誤。

最簡單的方法就是將所有的依賴拷貝過來。

2. 測試運行

現在,我們先在工程目錄下配置test.txt文件。

圖8-添加test.txt文件

文件內容如下:

 

[java]  view plain  copy
 
  1. a  
  2. b  
  3. c  
  4. ab  
  5. abab  
  6. d  

 

 

右鍵SimpleApp.scala,Run as -> Scala Application,發現打了很多日志。

我也只明白最后一行。

Lineswith a: 3, Lines with b: 3

是spark程序運行的正確輸出。

但是可以看到日志中還是有一條異常。

 

圖9-hadoop異常

 

這條異常似乎並不影響程序的正確運行,不過還是先考慮將該異常解決掉。

有關這個異常可以參考

http://www.srccodes.com/p/article/39/error-util-shell-failed-locate-winutils-binary-hadoop-binary-path

這個網頁的主體內容很簡短,意思就是hadoop2.2.0的發布版本對windows的支持並不好。網頁中提供了“Build, Install, Configure and Run Apache Hadoop 2.2.0 in MicrosoftWindows OS”的鏈接,也提供了現成的編譯好的包。

         我是直接將包下載下來,在工程目錄下按照異常提示建立了null/bin目錄,並將下載包中的所有文件拷貝進了null/bin目錄。

 

圖10-bin目錄

 

接下來,再運行SimpleApp程序,就沒有異常了。

但是,這種方法是否本質上解決了該異常就不知道了。因為我發現,即使手動隨便建一個null/bin/winutils.exe文件,只要路徑及文件名相同,也可以消除上述有關hadoop2.2.0的異常。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM