Intellij IDEA使用Maven搭建spark開發環境(scala)

如何一步一步地在Intellij IDEA使用Maven搭建spark開發環境,並基於scala編寫簡單的spark中wordcount實例。java

1.準備工做
首先須要在你電腦上安裝jdk和scala以及開發工具Intellij IDEA,本文中使用的是win7系統,環境配置以下:mysql

jdk1.7.0_15
scala2.10.4git

scala官網下載地址:http://www.scala-lang.org/download/
若是是windows請下載msi安裝包。github

這兩個能夠在官網上下載jdk和scala的安裝包就能夠直接雙擊安裝包運行安裝便可。注意:若是之後是在本地編寫好spark代碼而後上傳到spark集羣上去運行的話,請必定保持二者的開發環境一致,否則會出現不少錯誤。sql

Intellij IDEA
在官網上下載通常選擇右下角的Community版本,下載地址https://www.jetbrains.com/idea/download/#section=windowsapache

2.在Intellij IDEA中安裝scala插件
安裝好Intellij IDEA並進入idea的主界面
(1)找到右下角的Configure選項中Plugins並打開
這裏寫圖片描述windows

(2)點擊左下角Browse repositories…
這裏寫圖片描述數組

(3)在搜索框裏搜scala,出現相對於的Scala插件,這裏面個人已經安裝完成了,沒安裝的會顯示install的字樣以及相對於的版本,這裏面不建議在線安裝插件,建議根據Updated 2014/12/18去下載離線的scala插件,好比本文中的IDEA Updated日期是2014/12/18而後找到對應的插件版本是1.2.1,下載便可。下面是scala插件的離線下載地址。
這裏寫圖片描述ruby

scala插件離線下載地址:https://plugins.jetbrains.com/plugin/1347-scala
而後根據Update日期去找Intellij IDEA對應得scala插件,不一樣版本的IDEA對應的scala插件不同,請務必下載對應的scala插件不然沒法識別。
這裏寫圖片描述markdown

(4)離線插件下載完成後,將離線scala插件經過以下方式加入到IDEA中去:點擊Install plugin from disk…,而後找到你scala插件的zip文件的本機磁盤位置,點ok便可
這裏寫圖片描述

到這裏,在Intellij IDEA中安裝scala插件的步驟已經所有完成。接下來用IDEA來構建一個Maven工程,用來搭建spark開發環境。

3.Intellij IDEA經過Maven搭建spark環境
(1)打開IDEA新建一個maven項目,以下圖:
注意:按照我步驟順序便可。
注意:若是是第一次利用maven構建scala開發spark環境的話,這裏面的會有一個選擇scala SDK和Module SDK的步驟,這裏路徑選擇你安裝scala時候的路徑和jdk的路徑就能夠了。
這裏寫圖片描述

(2)填寫GroupId和ArtifactId這裏我就隨便寫了個名字,以下圖,點Next。
這裏寫圖片描述

(3)第三步很重要,首先是你的Intellij IDEA裏有Maven,通常的新版本都會自帶maven,並且maven的目錄在IDEA安裝路徑下plugins下就能找到,而後再Maven home directory地址中填寫maven相對應的路徑,本文中的IDEA版本比較老,是本身下的Maven安裝上的(不會的能夠百度下,很簡單,建議使用新的IDEA,不須要本身下載maven)。而後這裏面的User settings file是你maven路徑下conf裏面的settings.xml文件,勾選上override便可,這裏面的Local repository路徑能夠不用修改,默認就好,你也能夠新建一個目錄。點擊Next。
注意:截圖的時候忘了,把Local repository前面的override也勾選上,否則構建完會報錯,至少個人是這樣。
這裏寫圖片描述

(4)填寫本身的項目名,隨意便可。點擊finish。
這裏寫圖片描述

(5)到這裏整個流程已經結束,完成後會顯示以下界面:
右上角的import須要點擊一下便可。
這裏寫圖片描述

(6)接下來在pom.xml文件中加入spark環境所須要的一些依賴包。以代碼的方式給出,方便複製。
這裏是個人pom文件代碼,請各位自行按照本身的須要刪減或添加依賴包。
//注意這裏面的版本必定要對應好,我這裏的spark版本是1.6.0對應的scala是2.10,由於我是經過spark-core_${scala.version}是找spark依賴包的,前些日子有個同事按照這個去搭建,因爲版本的不同最後spark依賴包加載老是失敗。請你們自行檢查本身的版本

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xudong</groupId> <artifactId>xudong</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spark.version>1.6.0</spark.version> <scala.version>2.10</scala.version> <hadoop.version>2.6.0</hadoop.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-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-streaming_${scala.version}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming-kafka_${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> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.39</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> <!-- maven官方 http://repo1.maven.org/maven2/ 或 http://repo2.maven.org/maven2/ (延遲低一些) --> <repositories> <repository> <id>central</id> <name>Maven Repository Switchboard</name> <layout>default</layout> <url>http://repo2.maven.org/maven2</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <build> <sourceDirectory>src/main/scala</sourceDirectory> <testSourceDirectory>src/test/scala</testSourceDirectory> </build> </project>

這裏要注意下幾個小問題:
這裏面會有src/main/scala和src/test/scala須要你本身在對應項目目錄下構建這兩個文件夾路徑,若不構建會報錯。

這裏寫圖片描述

到這裏,基於scala的一個spark開發環境就基本結束了。接下來,用scala編寫一個spark的簡單示例,wordcount程序,若是有的同窗編寫過MapReduce必定會很熟悉。

若是不能建立scala文件則

仍是在Project Structure界面,操做以下。
而後咱們右鍵咱們添加的SDK選擇Copy to Project Libraries...OK確認。如圖

配置好後咱們就能夠建立工程文件了。

4.Spark簡單示例Wordcount
src/main/scala文件夾下,右鍵新建Package,輸入package的名字,我這裏是com.xudong而後新建Scala class, 而後輸入名字將類型改成object,以下圖:
這裏寫圖片描述

補充:
若是一開始沒有在項目中加入scala的SDK,這個時候,新建Scala class會發現沒有這個選項,這個時候你新建一個File文件,而後名字隨便取一個,後綴改爲 .scala* ,點ok後文件中空白區會顯示沒有scala的SDK,這個時候你點擊提示信息就能夠添加本地的scala SDK(提早你的電腦上已經安裝了scala,這個時候它會自動的去識別SDK),之後新建Scala class就有這個選項,直接新建便可。*

建立完而後編寫wordcount代碼,代碼以下(並註釋了相關的解釋):

package com.xudong

import org.apache.spark.mllib.linalg.{Matrices, Matrix}
import org.apache.spark.{SparkContext, SparkConf}

/**
 * Created by Administrator on 2017/4/20.
 * xudong
 */
object WordCountLocal {
  def main(args: Array[String]) {
    /**
     * SparkContext 的初始化須要一個SparkConf對象
     * SparkConf包含了Spark集羣的配置的各類參數
     */
    val conf=new SparkConf()
             .setMaster("local")//啓動本地化計算
             .setAppName("testRdd")//設置本程序名稱

    //Spark程序的編寫都是從SparkContext開始的
    val sc=new SparkContext(conf)
    //以上的語句等價與val sc=new SparkContext("local","testRdd")
    val data=sc.textFile("e://hello.txt")//讀取本地文件
    data.flatMap(_.split(" "))//下劃線是佔位符,flatMap是對行操做的方法,對讀入的數據進行分割
         .map((_,1))//將每一項轉換爲key-value,數據是key,value是1
         .reduceByKey(_+_)//將具備相同key的項相加合併成一個
         .collect()//將分佈式的RDD返回一個單機的scala array,在這個數組上運用scala的函數操做,並返回結果到驅動程序
         .foreach(println)//循環打印
  }
}

 


建立數據集hello.txt測試文檔以下:
這裏寫圖片描述

啓動本地spark程序,而後輸出結果,能夠在控制檯查看結果:
這裏寫圖片描述

若是能正確的打印出結果,說明spark示例運行成功。

到這裏,Intellij IDEA使用Maven構建spark開發環境已經徹底結束,若是有疑問或者本文檔有什麼錯誤,請指出,不甚感激。

spark 遠程調試
使用 setJars(List("D:\\IdeaProjects\\scalalearn\\out\\artifacts\\scalalearn\\scalalearn.jar"))這裏要說明下,就是當前工程編譯的jar包的
絕對路徑。 點擊File->Project Structure,彈出下面的對話框進行操做

 


 
若是沒有build on make選擇,則能夠手動build artifacts生成jar包
如今大功告成,設置Run 的Edit Configuration,點擊+,Application,設置MainClass,點擊OK!

點擊Run便可運行程序了,程序會在剛纔的路徑生成對應的jar,而後會啓動spark集羣,去運行該jar文件
 
若是spark history server沒有權限能夠運行
./hdfs dfs -chmod -R 755 /tmp
或者

在 hdfs-site.xml 總添加參數:

 

 <property>
        <name>dfs.permissions</name>
        <value>false</value>
  </property>  
</configuration>

改完後記得重啓HDFS

null\bin\winutils.exe,這個錯誤很簡單,是由於本win7壓根就沒裝hadoop系統,解決辦法是從集羣上覆制一份過來,放到F盤,而且配置好環境變量

HADOOP_HOME=F:\hadoop-2.6.0 Path=%HADOOP_HOME%\bin

   接下來下載對應的版本的winutils放到 F:\hadoop-2.6.0\bin 文件夾下,應該就解決了

下載地址:https://github.com/steveloughran/winutils

問題以下:

java.lang.ClassNotFoundException: com.csu.basemods.Program

個人出錯緣由是:打包jar時,將本地的Spark、Scala等library也添加進了jar裏,可能會致使jar默認使用jar包裏的library。使得Spark集羣的運行環境識別不到本身寫的代碼類,運行出錯。

1.解決方法其實就是在打包jar時,去除集羣環境中已有的library,如Spark、Scala等,只保留項目代碼和其它本身額外添加的jar包,就能夠了。

由於咱們只是在Spark上運行的,因此咱們要刪除下圖紅框裏多餘的部分,保留WordCount.jar以及‘WordCount’ compile output。小提示,這裏能夠利用Ctrl+A全選功能,選中所有選項,而後,配合Crtl+鼠標左鍵進行反選,也就是按住Ctrl鍵的同時用鼠標左鍵分別點擊WordCount.jar和‘WordCount’ compile output,從而不選中這兩項,最後,點擊頁面中的刪除按鈕(是一個減號圖標),這樣就把其餘選項都刪除,只保留了WordCount.jar以及‘WordCount’ compile output。

 

2.File=>Project Structure=>Modules 將該類所在的包設置爲Sources

相關文章
相關標籤/搜索