1. 程式人生 > >使用idea和maven開發和打包scala和spark程式

使用idea和maven開發和打包scala和spark程式

使用idea構建maven管理的scala和spark程式,預設已經裝好了idea、scala並在idea中安裝了scala外掛。

一、新建Maven專案

開啟idea,點選File—New—Project,彈出如下介面,選擇Maven專案,檢視是否是正確的JDK配置項正常來說這一欄會自動填充的(如果這裡沒有正常顯示JDK的話,可以點選右側的New…按鈕,然後指定JDK安裝路徑的根目錄即可)。在介面上也提供了"create from archetype"一些現成的模板,此處我們不使用模板,所以不勾選。點選Next。


來到Maven專案最重要三個引數的設定頁面,這三個引數分別為:GroupId, ArtifactId和Version。GroupId一般為公司網址的反寫+專案名  ArtifactId一般為專案名-模組名  Version=版本號,一般為1.0-SNAPSHOT即可。步驟如下圖所示:


點選Next,進入下一步頁面,可以設定專案名稱和專案儲存路徑。


點選Finish,專案建立完成,進入到專案介面,點選右下角的Enable Auto-Import,這樣會自動匯入pom檔案裡的依賴。

二、Hello world

  1.  將Scala的框架新增到這個專案中,方法是在左側欄中的專案名稱上右鍵選單中點選Add Framework Support…,然後在開啟的對話方塊左側邊欄中,勾選Scala前面的複選框,然後點選確定即可(前提是上文中所述步驟都已正確走通,否則你很有可能看不到Scala這個選項的);

  2. 在main資料夾中建立一個名為 scala 的資料夾,並右鍵點選 scala 資料夾,選擇 Make Directory as,然後選擇Sources Root ,這裡主要意思是將 scala 資料夾標記為一個原始檔的根目錄,然後在其內的所有程式碼中的 package ,其路徑就從這個根目錄下開始算起;

  3. 在已經標記好為原始檔根目錄的 scala 資料夾 上,右鍵選擇 New,然後選擇 Scala Class,隨後設定好程式的名稱,並且記得將其設定為一個 Object(類似於Java中含有靜態成員的靜態類),正常的話,將會開啟這個 Object 程式碼介面,並且可以看到IntelliJ IDEA自動添加了一些最基本的資訊。

在建立的 Object 中輸入如下語句:

def main(args: Array[String]):Unit = {
    println("Hello World!")
}

      4.在程式介面的任意位置,右鍵單擊後選擇 Run '你的程式名稱',靜待程式的編譯和執行,然後在下方自動開啟的視窗中,你就可以看到振奮人心的 Hello World!了

三、匯入Spark依賴

此時你已經可以成功的執行一個Scala 專案了。想要執行在spark 上則還需要匯入相關依賴。開啟pom.xml檔案新增如下依賴。

<properties>
        <spark.version>2.0.2</spark.version>
        <scala.version>2.11</scala.version>
    </properties>


    <dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_${scala.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming_${scala.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_${scala.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-hive_${scala.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-mllib_${scala.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>

            <plugin>
                <groupId>org.scala-tools</groupId>
                <artifactId>maven-scala-plugin</artifactId>
                <version>2.15.2</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19</version>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>

        </plugins>
    </build>
新增完成後,等待idea完成依賴包的自動匯入(idea右下方可以看到是否匯入完成)。

四、編寫Spark程式碼

import org.apache.spark.{SparkConf, SparkContext}

  object MySpark {

    def main(args: Array[String]) {
      val conf = new SparkConf().setAppName("mySpark")
      //setMaster("local") 本機的spark就用local,遠端的就寫ip
      //如果是打成jar包執行則需要去掉 setMaster("local")因為在引數中會指定。
      conf.setMaster("local")
      val sc = new SparkContext(conf)
      val rdd = sc.parallelize(List(1, 2, 3, 4, 5, 6)).map(_ * 3)
      val mappedRDD = rdd.filter(_ > 10).collect()
      //對集合求和
      println(rdd.reduce(_ + _))
      //輸出大於10的元素
      for (arg <- mappedRDD)
        print(arg + " ")
      println()
      println("math is work")
    }
  }

五、打包jar

選擇File-Project Structure,在下圖中選擇箭頭所指選項


在彈出對話方塊中繼續選擇如下圖所示的配置。


由於我們的jar包實在spark 上執行的,所可以刪除其他不需要的依賴包,如下圖所示,刪除其他不需要的包,只留下紅色矩形中的兩個。

注意:output directory 的路徑。此處是你匯出 jar 的路徑


六、到伺服器Spark執行

執行命令為:

spark-submit --class MySpark SparkTest.jar

稍等片刻,執行結果為:

63                                                                              
12 15 18 
math is work

參考部落格:https://blog.csdn.net/u012373815/article/details/53266301