試用最強Spark IDE--IDEA
1、安裝IntelliJ IDEA
IDEA 全稱 IntelliJ IDEA,是java語言開發的集成環境,IntelliJ在業界被公認為最好的java開發工具之一,尤其在智能代碼助手、代碼自動提示、重構、J2EE支持、Ant、JUnit、CVS整合、代碼審查、創新的GUI設計等方面的功能可以說是超常的。IDEA是JetBrains公司的產品,這家公司總部位於捷克共和國的首都布拉格,開發人員以嚴謹著稱的東歐程序員為主。
IDEA每個版本提供Community和Ultimate兩個版本,如下圖所示,其中Community是完全免費的,而Ultimate版本可以使用30天,過這段時間後需要收費。從安裝後使用對比來看,下載一個Community版本足夠了。
1.1 安裝軟件
1.1.1 下載IDEA安裝文件
可以到Jetbrains官網http://www.jetbrains.com/idea/download/,選擇最新的安裝文件。由於以後的練習需要在Linux開發Scala應用程序,選擇Linux系統IntelliJ IDEA14,如下圖所示:
【註】在該系列配套資源的install目錄下分別提供了ideaIC-14.0.2.tar.gz(社區版)和ideaIU-14.0.2.tar.gz(正式版)安裝文件,對於Scala開發來說兩個版本區別不大
1.1.2 解壓縮並移動目錄
把下載的安裝文件上傳到目標機器,用如下命令解壓縮IntelliJ IDEA安裝文件,並遷移到/app目錄下:
cd /home/hadoop/upload
tar -zxf ideaIU-14.0.2.tar.gz
sudo mv idea-IU-139.659.2 /app/idea-IU
1.1.3配置/etc/profile環境變量
使用如下命令打開/etc/profile文件:
sudo vi /etc/profile
確認JDK配置變量正確配置(參見第2節《Spark編譯與部署》中關於基礎環境搭建介紹):
export JAVA_HOME=/usr/lib/java/jdk1.7.0_55
export PATH=$PATH:$JAVA_HOME
1.2 配置Scala環境
1.2.1
可以通過兩種方式啟動IntelliJ IDEA:
- 到IntelliJ IDEA安裝所在目錄下,進入bin目錄雙擊idea.sh啟動IntelliJ IDEA;
- 在命令行終端中,進入$IDEA_HOME/bin目錄,輸入./idea.sh進行啟動
IDEA初始啟動目錄如下,IDEA默認情況下並沒有安裝Scala插件,需要手動進行安裝,安裝過程並不復雜,下面將演示如何進行安裝。
1.2.2 下載Scala插件
參見上圖,在啟動界面上選擇“Configure-->Plugins"選項,然後彈出插件管理界面,在該界面上列出了所有安裝好的插件,由於Scala插件沒有安裝,需要點擊”Install JetBrains plugins"進行安裝,如下圖所示:
待安裝的插件很多,可以通過查詢或者字母順序找到Scala插件,選擇插件後在界面的右側出現該插件的詳細信息,點擊綠色按鈕"Install plugin”安裝插件,如下圖所示:
安裝過程將出現安裝進度界面,通過該界面了解插件安裝進度,如下圖所示:
安裝插件後,在啟動界面中選擇創建新項目,彈出的界面中將會出現"Scala"類型項目,選擇後將出現提示創建的項目是僅Scala代碼項目還是SBT代碼項目,如下圖所示:
1.2.3 設置界面主題
從IntelliJ IDEA12開始起推出了Darcula 主題的全新用戶界面,該界面以黑色為主題風格得到很多開發人員的喜愛,下面我們將介紹如何進行配置。在主界面中選擇File菜單,然後選擇Setting子菜單,如下圖所示:
在彈出的界面中選擇Appearance &Behavior中Appearance,其中Theme中選擇Darcula主題,如下圖所示:
保存該主題重新進入,可以看到如下圖樣式的開發工具,是不是很酷!
2 使用IDEA編寫例子
2.1 創建項目
2.1.1 設置項目基本信息
在IDEA菜單欄選擇File->New Project,出現如下界面,選擇創建Scala項目:
在項目的基本信息填寫項目名稱、項目所在位置、Project SDK和Scala SDK,在這裏設置項目名稱為class3,關於Scala SDK的安裝參見第2節《Spark編譯與部署》下Spark編譯安裝介紹:
2.1.2 設置Modules
創建該項目後,可以看到現在還沒有源文件,只有一個存放源文件的目錄src以及存放工程其他信息的雜項。通過雙擊src目錄或者點擊菜單上的項目結構圖標打開項目配置界面,如下圖所示:
在Modules設置界面中,src點擊右鍵選擇“新加文件夾”添加src->main->scala目錄:
在Modules設置界面中,分別設置main->scala目錄為Sources類型:
2.1.3 配置Library
選擇Library目錄,添加Scala SDK Library,這裏選擇scala-2.10.4版本
添加Java Library,這裏選擇的是在$SPARK_HOME/lib/spark-assembly-1.1.0-hadoop2.2.0.jar文件,添加完成的界面如下:
2.2 例子1:直接運行
《Spark編程模型(上)--概念及Shell試驗》中使用Spark-Shell進行了搜狗日誌的查詢,在這裏我們使用IDEA對Session查詢次數排行榜進行重新練習,可以發現借助專業的開發工具可以方便快捷許多。
2.2.1 編寫代碼
在src->main->scala下創建class3包,在該包中添加SogouResult對象文件,具體代碼如下:
1 package class3
2
3 import org.apache.spark.SparkContext._
4 import org.apache.spark.{SparkConf, SparkContext}
5
6 object SogouResult{
7 def main(args: Array[String]) {
8 if (args.length == 0) {
9 System.err.println("Usage: SogouResult <file1> <file2>")
10 System.exit(1)
11 }
12
13 val conf = new SparkConf().setAppName("SogouResult").setMaster("local")
14 val sc = new SparkContext(conf)
15
16 //session查詢次數排行榜
17 val rdd1 = sc.textFile(args(0)).map(_.split("\t")).filter(_.length==6)
18 val rdd2=rdd1.map(x=>(x(1),1)).reduceByKey(_+_).map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1))
19 rdd2.saveAsTextFile(args(1))
20 sc.stop()
21 }
22 }
2.2.2 編譯代碼
代碼在運行之前需要進行編譯,可以點擊菜單Build->Make Project或者Ctrl+F9對代碼進行編譯,編譯結果會在Event Log進行提示,如果出現異常可以根據提示進行修改
2.2.3 運行環境配置
SogouResult首次運行或點擊菜單Run->Edit Configurations打開"運行/調試 配置界面"
運行SogouResult時需要輸入搜狗日誌文件路徑和輸出結果路徑兩個參數,需要註意的是HDFS的路徑參數路徑需要全路徑,否則運行會報錯:
- 搜狗日誌文件路徑:使用上節上傳的搜狗查詢日誌文件hdfs://hadoop1:9000/sogou/SogouQ1.txt
- 輸出結果路徑:hdfs://hadoop1:9000/class3/output2
2.2.4 運行結果查看
啟動Spark集群,點擊菜單Run->Run或者Shift+F10運行SogouResult,在運行結果窗口可以運行情況。當然了如果需要觀察程序運行的詳細過程,可以加入斷點,使用調試模式根據程序運行過程。
使用如下命令查看運行結果,該結果和上節運行的結果一致
hadoop fs -ls /class3/output2
hadoop fs -cat /class3/output2/part-00000 | less
2.3 例子2:打包運行
上個例子使用了IDEA直接運行結果,在該例子中將使用IDEA打包程序進行執行
2.3.1 編寫代碼
在class3包中添加Join對象文件,具體代碼如下:
1 package class3
2
3 import org.apache.spark.SparkContext._
4 import org.apache.spark.{SparkConf, SparkContext}
5
6 object Join{
7 def main(args: Array[String]) {
8 if (args.length == 0) {
9 System.err.println("Usage: Join <file1> <file2>")
10 System.exit(1)
11 }
12
13 val conf = new SparkConf().setAppName("Join").setMaster("local")
14 val sc = new SparkContext(conf)
15
16 val format = new java.text.SimpleDateFormat("yyyy-MM-dd")
17 case class Register (d: java.util.Date, uuid: String, cust_id: String, lat: Float,lng: Float)
18 case class Click (d: java.util.Date, uuid: String, landing_page: Int)
19 val reg = sc.textFile(args(0)).map(_.split("\t")).map(r => (r(1), Register(format.parse(r(0)), r(1), r(2), r(3).toFloat, r(4).toFloat)))
20 val clk = sc.textFile(args(1)).map(_.split("\t")).map(c => (c(1), Click(format.parse(c(0)), c(1), c(2).trim.toInt)))
21 reg.join(clk).take(2).foreach(println)
22
23 sc.stop()
24 }
25 }
2.3.2 生成打包文件
第一步 配置打包信息
在項目結構界面中選擇"Artifacts",在右邊操作界面選擇綠色"+"號,選擇添加JAR包的"From modules with dependencies"方式,出現如下界面,在該界面中選擇主函數入口為Join:
第二步 填寫該JAR包名稱和調整輸出內容
【註意】的是默認情況下"Output Layout"會附帶Scala相關的類包,由於運行環境已經有Scala相關類包,所以在這裏去除這些包只保留項目的輸出內容
第三步 輸出打包文件
點擊菜單Build->Build Artifacts,彈出選擇動作,選擇Build或者Rebuild動作
第四步 復制打包文件到Spark根目錄下
cd /home/hadoop/IdeaProjects/out/artifacts/class3
cp LearnSpark.jar /app/hadoop/spark-1.1.0/
ls /app/hadoop/spark-1.1.0/
2.3.3 運行查看結果
通過如下命令調用打包中的Join方法,運行結果如下:
cd /app/hadoop/spark-1.1.0
bin/spark-submit --master spark://hadoop1:7077 --class class3.Join --executor-memory 1g LearnSpark.jar hdfs://hadoop1:9000/class3/join/reg.tsv hdfs://hadoop1:9000/class3/join/clk.tsv
3、問題解決
3.1 出現"*** is already defined as object ***"錯誤
編寫好SogouResult後進行編譯,出現"Sogou is already as object SogouResult"的錯誤,
出現這個錯誤很可能不是程序代碼的問題,很可能是使用Scala JDK版本問題,作者在使用scala-2.11.4遇到該問題,換成scala-2.10.4後重新編譯該問題得到解決,需要檢查兩個地方配置:Libraries和Global Libraries分別修改為scala-2.10.4
試用最強Spark IDE--IDEA