如何一步一步地在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 遠程調試./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