本文先敘述如何配置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,代碼如下:
- package test
- object test {
- def main(args : Array[String]) {
- println("hello world")
- }
- }
最終如圖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。
- <dependency>
- <groupId>org.apache.spark</groupId>
- <artifactId>spark-core_2.11</artifactId>
- <version>1.2.1</version>
- </dependency>
在default package中添加scala object – SimpleApp。代碼如下:
- /* SimpleApp.scala */
- import org.apache.spark.SparkContext
- import org.apache.spark.SparkContext._
- import org.apache.spark.SparkConf
- object SimpleApp {
- def main(args: Array[String]) {
- val logFile = "test.txt" // Should be some file on your system
- val conf = new SparkConf().setAppName("Simple Application").setMaster("local[2]")
- val sc = new SparkContext(conf)
- val logData = sc.textFile(logFile, 2).cache()
- val numAs = logData.filter(line => line.contains("a")).count()
- val numBs = logData.filter(line => line.contains("b")).count()
- println("Lines with a: %s, Lines with b: %s".format(numAs, numBs))
- }
- }
此時,編譯已經通過了,但是如果Run as–> Scala Application的話,會有ClassDefNotFound的異常。
這是因為spark-core其實需要依賴很多其他的jar包來運行,但這些包在spark-core包中並沒有,並且在我們的classpath中也沒有。
我們可以方便的從在線maven庫里找到spark-core包。
圖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文件
文件內容如下:
- a
- b
- c
- ab
- abab
- d
右鍵SimpleApp.scala,Run as -> Scala Application,發現打了很多日志。
我也只明白最后一行。
Lineswith a: 3, Lines with b: 3
是spark程序運行的正確輸出。
但是可以看到日志中還是有一條異常。
圖9-hadoop異常
這條異常似乎並不影響程序的正確運行,不過還是先考慮將該異常解決掉。
有關這個異常可以參考
這個網頁的主體內容很簡短,意思就是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的異常。