本文演示spark源碼在idea編輯器上編譯和提交任務
1、從網站上下載spark源碼,在idea中 點擊 VCS->CheckOut form Version Control->Git 把代碼下載到本地
https://github.com/apache/spark
2、爲了能讓本地編譯更快一些,設置父pom.xml 中加上oschina的maven源
<repository>
<id>nexus</id>
<name>local private nexus</name>
<url>http://maven.oschina.net/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
3、執行 mvn clean idea:idea 順便說一下本地的mvn環境要在3.3.x以上
4、打開idea,點擊菜單 File->Open-> 在彈出窗口中找spark源碼然後打開
5、找到Master.scala然後點擊運行;
然後在瀏覽器中查看是否運行成功
6、接着運行worker,找到Worker.scala,右鍵運行,但是這裏需要做點設置,在Program arguments:加上參數 --webui-port 8081 spark://192.168.3.107:7077 (注:有時候localhost不是很管用,要看系統的設置,最好使用ip)
這時候刷新瀏覽器會發現worker 已經被註冊進來了
8、我們寫個spark程序提交執行試試看,新建一個scala maven工程,用於統計用戶信息,工程下載見附件,核心代碼如下:
package com.zhanjun.spark.learn
import org.apache.spark.{SparkConf, SparkContext}
object UserInfoCount {
def main(args: Array[String]) {
if (args.length == 0) {
System.err.println("Usage: UserInfoCount <file1> <file2>")
System.exit(1)
}
val conf = new SparkConf().setAppName("UserInfoCount")
val sc = new SparkContext(conf)
// 讀取數據源,以“,”號分隔數據,過濾每行數據爲8個字段
val userInfoRDD = sc.textFile(args(0)).map(_.split(",")).filter(_.length == 8)
// 按照地區進行統計,其中地區字段爲第4個字段,合計後按照統計量進行排序
val blockCountRDD = userInfoRDD.map(x => (x(3), 1)).reduceByKey(_ + _).map(x => (x._2, x._1)).sortByKey(false).map(x => (x._2, x._1))
// 按手機號照前三位號碼進行統計,其中手機號爲第3個字段,合計後按照手機號碼前三位數字排序(從小到大)
val phoneCountRDD = userInfoRDD.map(x => (x(2).substring(0, 3), 1)).reduceByKey(_ + _).sortByKey(true)
// 對兩部分數據進行合併,然後輸出到HDFS
val unionRDD = blockCountRDD.union(phoneCountRDD)
//repartition設置RDD中partition數量
unionRDD.repartition(1).saveAsTextFile(args(1))
sc.stop()
}
}
通過 mvn clean package 對工程打包,把users_txt.zip解壓到相應的目錄中。
9、我們回到spark源碼的idea,通過idea提交job試試 找到org.apache.spark.deploy.SparkSubmit,右鍵運行,然後設置對應的參數
--class com.zhanjun.spark.learn.UserInfoCount --master local /home/admin/workspace/spark-work/UserInfoCount/target/UserInfoCount-1.0-SNAPSHOT.jar file:///home/admin/temp/users.txt file:///home/admin/temp/output/
我們可以發現 /home/admin/temp/output目錄下面會生成對應的計算結果.
過程中使用了spark官網下載的源碼 在sparksubmit時一直報錯貌似是akka的初始化失敗,後然從git上下載代碼一切沒有問題