使用maven+eclipse構建spark項目

1、構建spark項目html

maven構建scala項目java

1.參考以前構建scala項目的步驟,先構建一個scala項目。linux

2.而後再加入spark版本的依賴。apache

  <dependency>

     <groupId>org.apache.spark</groupId>

     <artifactId>spark-core_2.10</artifactId>

     <version>1.5.0</version>

 </dependency>

注意spark版本要和集羣上spark版本對應。spark-core_2.10不能寫成spark-core_2.11,後面的2.10是和你的scala版本對應上的。若是spark的版本是從scala2.11編譯的,則要寫2.11。編程

3.把jdk和scala版本改爲spark依賴的版本windows

<properties>

    <maven.compiler.source>1.7</maven.compiler.source>

    <maven.compiler.target>1.7</maven.compiler.target>

    <encoding>UTF-8</encoding>

    <scala.version>2.10.4</scala.version>

    <scala.compat.version>2.10</scala.compat.version>

  </properties>

注意scala.version和scala.compat.version版本要改爲相同的,不然maven編譯會報錯,編譯不過去。api

4.spark程序代碼以下:app

object SparkMain {

  def main(args : Array[String]) {

    var sparkConf = new SparkConf();

    sparkConf.setAppName("sparkTest").setMaster("spark://bigdata1:7077,bigdata2:7077");

    val sc = new SparkContext(sparkConf);

    sc.addJar("D:\\programs\\scala-SDK-4.1.1-vfinal-2.11-win32.win32.x86_64\\workspace\\SparkTest\\target\\SparkTest-0.0.1-SNAPSHOT.jar");

    val hdfsRdd = sc.textFile("hdfs://bigdata1:9000/data/stbcontent/0");

    val mapRdd = hdfsRdd.flatMap(mySplit);

    var result = hdfsRdd.flatMap(mySplit).count();
    
    mapRdd.saveAsTextFile("hdfs://bigdata1:9000/data/stbformat1");

    println(result);

    sc.stop();

  }

}

注意此處的drivering program就是安裝eclipse的這臺機器了,因此路徑都是針對eclipse。若是打包到集羣上跑,那麼路徑就變成了linux那臺機器了。因此咱們查看4044端口的時候,就是window這臺機器的ip了。eclipse

若是直接跑在本地windows下,須要添加hadoop的環境,添加完了以後,你就能夠在windows上直接跑spark程序了,則spark代碼以下:maven

object SeeSource {
  def main(args: Array[String]): Unit = {
    var sparkConf = new SparkConf();
    sparkConf.setAppName("seeSource").setMaster("local[2]");
    val sc = new SparkContext(sparkConf);
    println("aa");
    sc.stop();
  }
}

參考:在Eclipse上運行Spark(Standalone,Yarn-Client)

2、問題彙總

1.java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@d919109 rejected from java.util.concurrent.ThreadPoolExecutor@7b42ce0a

將sparkConf.setMaster裏面master ip改爲hostName,這樣就不會出現這個錯誤了,以下:

sparkConf.setMaster("spark://bigdata1:7077,bigdata2:7077");

參考: java遠程調用 spark服務出錯

2.java.lang.NoClassDefFoundError: scala/collection/GenTraversableOnce$class

scala ide編譯spark程序使用的scala版本和spark集羣上的scala版本不一致。解決方法就是更改scala ide所使用的scala 版本

首先新增符合要求的scala版本,以下:

而後項目右鍵,選擇scala compiler,選擇剛剛新增的scala版本

參考:運行第一個SparkStreaming程序(及過程當中問題解決)

3.java.lang.ClassNotFoundException: com.bigdata.test22.SparkTest$$anonfun$1

出現這個錯誤是spark standalone集羣中,咱們運行的類在worker節點沒有,因此worker節點就會報找不到類這個錯誤,須要將咱們的spark程序打包放到集羣的每一個節點上,而後在sparkConf加上以下代碼:

sparkConf.addJar("D:\\programs\\scala-SDK-4.1.1-vfinal-2.11-win32.win32.x86_64\\workspace\\SparkTest\\target\\SparkTest-0.0.1-SNAPSHOT.jar"); 

注意,通常咱們使用ide來測試spark的話,若是是在linux編程,ide和spark在同一個節點上,那麼使用sparkConf.setMaster("local[2]"),只在一臺機器上跑,就不存在找不到類的問題了。

spark java api經過run as java application運行的方法

相關文章
相關標籤/搜索