【原創】Helenykwang 于2018-01-13 18:10:18編寫
不用maven,不用sbt,只需三個庫
一、環境說明
集群:Spark 2.1.2 + hadoop2.3
開發機OS:win7
Jdk 1.8.0_151
下載jre即可 http://www.oracle.com/technetwork/java/javase/downloads/index.html
注:JDK是一個平臺特定的軟件,有針對Windows,Mac和Unix系統的不同的安裝包。 可以說JDK是JRE的超集,它包含了JRE的Java編譯器,調試器和核心類
scala 2.11.8 http://www.scala-lang.org/download/
IntelliJ IDEA 2017.3
spark 源碼spark-2.1.2-bin-hadoop2.3
二、環境搭建
1. 基本配置
安裝java、scala,配置環境變量JAVA_HOME、SCALA_HOME為對應安裝路徑
PATH后面添加%JAVA_HOME%\jre\bin; %SCALA_HOME%\bin
【WIN】%JAVA_HOME%
【Linux】$JAVA_HOME
注意:scala 安裝路徑不能有空格,否則會報錯
>>找不到或無法加載主類scala.tools.nsc.MainGenericRunner
檢驗標準
打開CMD,分別執行java、scala命令。
2. 安裝配置IntelliJ IDEA 2017.3
初始化后,在file –settings 中添加scala插件,重啟
三、開發示例
1. 新建工程
其實這里選個java工程就行了,不用搞那么復雜,記住關鍵是依賴庫java、scala、spark源碼庫添加好就行。
下圖展示了創建工程時添加java-sdk、scala-sdk的過程。
創建一些必需的目錄,我的demo的目錄樹如下:
在scala目錄右鍵mark Directory as -- Source Root
2. 添加spark源碼依賴
從File – Project Structure 進入,添加Lib,按下圖操作完畢后,點擊apply – ok
文件樹的外部庫會出現以下三個:分別是java、spark、scala【重點強調唷~ 三者必備,其他隨意】
3. 編寫程序
新建一個scala文件SparkDemo.scala,代碼如下:
package demo
importorg.apache.spark._
objectSparkDemo{
? def main(args: Array[String]): Unit = {
? ? ? ? val masterUrl = "local[1]"
? ? ? ? val sparkconf = newSparkConf().setAppName("helenApp").setMaster(masterUrl)
? ? ? ? //spark配置,建議保留setMaster(local)
? ? ? ? //調試的時候需要,在實際集群上跑的時候可在命令行自定義
? ? ? ? val sc = new SparkContext(sparkconf)
? ? ? ? val rdd=sc.parallelize(List(1,2,3,4,5,6)).map(_*3)? //將數組(1,2,3,4,5,6)分別乘3
? ? ? rdd.filter(_>10).collect().foreach(println)? //打印大于10的數字
? ? ? ? println(rdd.reduce(_+_))? //打印 和
? ? ? ? println("hello world")? // demo必備的一句代碼!!! [認真臉]
? }
}
此時,scala編輯界面可能出現這句話,點擊setup scala SDK就可以了。
依賴庫添加成功的檢驗標準是,import org.apache.spark._不報錯。
點擊綠色三角形,run~
在console界面正常輸出!(*^__^*)
4. 打包jar包
依舊是從老朋友File–Project Structure 進入,在Artifacts下添加jar。
注意:打包的jar包不需要把spark源碼也搞進去的,因為集群上本身就有spark代碼,所以就留下以下這兩個文件即可~~~ 點擊apply –ok
在主界面,Build—Build Artifacts。開始編譯~~~ 編譯OK后會多出一個out目錄,里面有最終jar包
查看主類,MANIFEST.MF文件內容如下:
Manifest-Version:1.0
Main-Class:demo.SparkDemo
5. 集群上運行jar包
Jar包放到/home/hadoop目錄下
>>spark-submit? --class demo.SparkDemo--master spark://:7077 project_name.jar
說明:--class <主類名> 最后跟的參數是我們的jar包。--master指定了集群master,中間還可以自定義一些spark配置參數,例如:
--num-executors 100 \
? ? ? --executor-memory6G \
? ? ? --executor-cores4 \
? ? ? --driver-memory1G \
? ? ? --confspark.default.parallelism=1000 \
? ? ? --confspark.storage.memoryFraction=0.5 \
? ? ? --confspark.shuffle.memoryFraction=0.3 \
集群上運行成功~~~
總結
其實看了很多什么maven工程、scala工程構建方法,其實大同小異,重點無非是java、spark、scala的依賴搞好,這才是核心問題。
注意版本一致性,包括:
· 開發機和集群的spark源碼版本一致
· 開發IDE中scala插件和系統安裝的scala和集群上scala版本一致
· scala 和spark 版本匹配。(spark2.x 相比 1.x 有很多不同,請使用scala 2.11+版本)
===================分割線=======================
踩過的坑 ~~~ (??д?)b,歡迎小伙伴們和我分享遇到的問題 (*^__^*) ~~~
錯誤集錦
出錯情況:
命令行運行scala時,找不到或無法加載主類scala.tools.nsc.MainGenericRunner
出錯原因:
scala安裝目錄出現了空格。
問題解決:
將Scala 移動到沒有空格的文件夾下。重新設置SCALA_HOME。文件解決。
出錯情況:
編寫程序時,調用rdd.saveAsTextFile 報錯NullPointerException
出錯原因:
和hadoop文件輸出配置有關,下個補丁,配置一下即可
解決方法:
1)下載文件winutils.exe
2) 將此文件放置在某個目錄下,比如D:\hadoop\bin\中。
3)在scala程序的一開始聲明:System.setProperty("hadoop.home.dir","D:\\hadoop\\")
出錯情況:
maven初始化工程時,連接https://repo.maven.apache.org/maven2超時失敗
出錯原因:
PC網絡自身的問題。不能訪問外網。
解決方法:
使用maven離線模式,手動把依賴庫導入 <用戶目錄>\\.m\\ repository
Q:什么時候需要maven離線模式呢?
A:沒有網絡,只有本地庫,又是用maven來管理項目,在編譯或者下載第三方Jar的時候,老是去中央倉庫上自動下載,導致出問題。
1)? ? 全局設置Work offline 如下圖所示
2)? ? 編輯 <用戶目錄>\\.m\\ settings.xml,寫一行:<offline> true</offline>