從零開始學(xué)習(xí)Spark(一)環(huán)境配置吸占,實(shí)現(xiàn)WordCount

環(huán)境配置凿宾,Spark實(shí)現(xiàn)WordCount

本人準(zhǔn)備參加騰訊實(shí)習(xí)菌湃,有關(guān)大數(shù)據(jù)與機(jī)器學(xué)習(xí)惧所。由于本人對(duì)大數(shù)據(jù)一無(wú)所知下愈,因此準(zhǔn)備由Spark作為切入口開始自學(xué)势似,一步步完成機(jī)器學(xué)習(xí)各個(gè)算法在Spark上的應(yīng)用履因。自學(xué)過程中的點(diǎn)點(diǎn)滴滴都會(huì)記錄在簡(jiǎn)書上栅迄,希望可以與大家交流毅舆,共同學(xué)習(xí)。

配環(huán)境永遠(yuǎn)是開始學(xué)習(xí)一個(gè)新領(lǐng)域最難的一部分岂津,我花了兩天時(shí)間配置成功了MacOS下的Spark開發(fā)環(huán)境吮成,實(shí)現(xiàn)了基于Scala與sbt的WordCount粱甫,下面來(lái)一步步把步驟記錄下來(lái)魔种。

第1步:配置sbt在IntelliJ下編程環(huán)境

打開terminal

查看java版本节预,由于MacOS自帶java安拟,因此無(wú)需安裝

$ java -version

安裝sbt糠赦,這是編譯scala的工具

$ brew install sbt

查看sbt與scala信息

$ sbt about

下載安裝IntelliJ

安裝Scala Plugin:打開IntelliJ锅棕,在選擇項(xiàng)目界面,選擇Configure → Plugins → Install JetBrains Plugins顾瞻,搜索Scala并安裝

選擇默認(rèn)SDK:Configure → Project defaults → Project structure荷荤,SDK選擇Java1.8

至此scala在IntelliJ下的開發(fā)環(huán)境配置完畢

第2步:配置Spark工具包

下載Spark:下載地址会油,注意如果已經(jīng)安裝了Hadoop的話要下載對(duì)應(yīng)的版本古毛,下面的命令可以查看Hadoop版本

$ hadoop version

下載完畢后解壓并將其放在一個(gè)目錄下,假設(shè)放在/usr/shar/spark-2.1.0-bin-hadoop2.7喇潘,那么我們往環(huán)境變量中添加Spark方便以后使用

$ vim .bash_profile

加入一行体斩,保存后重啟terminal即可

export SPARK_HOME=/usr/shar/spark-2.1.0-bin-hadoop2.7

至此,Spark環(huán)境配置完畢颖低,是不是非常方便

第3步:命令行形式操控Spark

(1) Python Spark

terminal中執(zhí)行命令

$ $SPARK_HOME/bin/pyspark

看到帥氣的Spark logo就表示已經(jīng)成功了

美中不足的是自帶的python shell沒有自動(dòng)補(bǔ)全等功能絮吵,使用ipython可以完美解決

首先,安裝ipython

$ pip install ipython

運(yùn)行Spark

$ PYSPARK_DRIVER_PYTHON=ipython $SPARK_HOME/bin/pyspark

讓我們來(lái)使用一些Spark的API來(lái)嘗試一些命令

>>> lines = sc.textFile("README.md") # 創(chuàng)建一個(gè)名為lines的RDD
>>> lines.count() # 統(tǒng)計(jì)RDD中的元素個(gè)數(shù) 
127
>>> lines.first()

(2) Scala Spark Shell

$ $SPARK_HOME/bin/spark-shell

同樣完成一下行數(shù)統(tǒng)計(jì)的小應(yīng)用

scala> val lines = sc.textFile("README.md") // 創(chuàng)建一個(gè)名為lines的RDD
lines: spark.RDD[String] = MappedRDD[...]
scala> lines.count() // 統(tǒng)計(jì)RDD中的元素個(gè)數(shù) 
res0: Long = 127
scala> lines.first() // 這個(gè)RDD中的第一個(gè)元素忱屑,也就是README.md的第一行 
res1: String = # Apache Spark

第4步:構(gòu)建Spark獨(dú)立應(yīng)用蹬敲,WordCount

上面的是shell形式下調(diào)用Spark,而現(xiàn)在進(jìn)入更為重要的建立獨(dú)立項(xiàng)目莺戒,我看了很多教程伴嗡,但是每個(gè)教程都有一步兩步講的含糊不清,或者就是版本太老从铲,留下了許多坑。現(xiàn)在我總結(jié)了一個(gè)可以跑通的例子麻惶。

首先静稻,IntelliJ下創(chuàng)建sbt項(xiàng)目:打開IntelliJ → Create New Project → Scala → sbt → ProjectName = wordcount → Create

修改build.sbt,在最后加入一行Spark的包。注意scalaVersion一定要改成2.11嗅回,因?yàn)镾park2.1.0是基于Scala2.11的娃豹,默認(rèn)的2.12會(huì)報(bào)錯(cuò)躯畴!

name := "wordcount"
version := "1.0"
scalaVersion := "2.11.7"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.1.0"

讓我們先來(lái)看一下sbt項(xiàng)目的目錄結(jié)構(gòu)

├── build.sbt
├── project
│   ├── build.properties
│   ├── plugins.sbt
│   ├── project
│   └── target
├── src
│   ├── main
│   │   ├── java
│   │   ├── resources
│   │   ├── scala
│   │   └── scala-2.12
│   └── test
│       ├── java
│       ├── resources
│       ├── scala
│       └── scala-2.12
└── target
    ├── resolution-cache
    ├── scala-2.12
    └── streams

我們需要寫的代碼主要放在/src/main/scala里面

下一步嚷缭,我們開始寫我們的代碼优床,具體細(xì)節(jié)不用深究,本章節(jié)只是為了配通環(huán)境

新建目錄/src/main/scala/com/oreilly/learningsparkexamples/mini/scala

添加第一個(gè)文件/src/main/scala/com/oreilly/learningsparkexamples/mini/scala/BasicMap.scala

/**
 * Illustrates a simple map in Scala
 */
package com.oreilly.learningsparkexamples.scala

import org.apache.spark._

object BasicMap {
    def main(args: Array[String]) {
      val master = args.length match {
        case x: Int if x > 0 => args(0)
        case _ => "local"
      }
      val sc = new SparkContext(master, "BasicMap", System.getenv("SPARK_HOME"))
      val input = sc.parallelize(List(1,2,3,4))
      val result = input.map(x => x*x)
      println(result.collect().mkString(","))
    }
}

添加第二個(gè)文件/src/main/scala/com/oreilly/learningsparkexamples/mini/scala/WordCount.scala

/**
 * Illustrates flatMap + countByValue for wordcount.
 */
package com.oreilly.learningsparkexamples.mini.scala

import org.apache.spark._
import org.apache.spark.SparkContext._

object WordCount {
    def main(args: Array[String]) {
      val inputFile = args(0)
      val outputFile = args(1)
      val conf = new SparkConf().setAppName("wordCount")
      // Create a Scala Spark Context.
      val sc = new SparkContext(conf)
      // Load our input data.
      val input =  sc.textFile(inputFile)
      // Split up into words.
      val words = input.flatMap(line => line.split(" "))
      // Transform into word and count.
      val counts = words.map(word => (word, 1)).reduceByKey{case (x, y) => x + y}
      // Save the word count back out to a text file, causing evaluation.
      counts.saveAsTextFile(outputFile)
    }
}

點(diǎn)擊右上角的Build Project圖標(biāo)就編譯成功了频蛔,如果沒有報(bào)錯(cuò)瀑粥,那么恭喜你舟肉,環(huán)境配置成功了。

第5步:使用spark-submit來(lái)運(yùn)行應(yīng)用

spark-submit腳本可以為我們配置 Spark 所要用到的一系列環(huán)境變量院领。

首先需要將我們編譯好的項(xiàng)目打包强法,最方便的方式就是進(jìn)入wordcount目錄下,輸入

$ sbt package

打包好的文件就在/wordcount/target/scala-2.11/wordcount_2.11-1.0.jar

接下來(lái)就是利用Spark為我們提供的spark-submit來(lái)運(yùn)行應(yīng)用了,進(jìn)入wordcount目錄下

$ $SPARK_HOME/bin/spark-submit \
--class com.oreilly.learningsparkexamples.mini.scala.WordCount  \
./target/scala-2.11/wc_2.11-1.0.jar \
./input.txt ./wordcounts

下面來(lái)簡(jiǎn)單解釋一下上面的命令贪壳,--class為使用的Class钻注,后面為jar包的路徑识埋,最后兩個(gè)為wordcount的兩個(gè)參數(shù)系忙,分別為輸入文件热监,和輸出文件路徑

我們的輸入文件\wordcount\input.txt是這樣的

one two three four
four five six
one five six
one one three

運(yùn)行后,如果成功會(huì)在\wordcount\wordcounts\part-00000中看到

(two,1)
(one,4)
(six,2)
(three,2)
(five,2)
(four,2)

至此香浩,我們的整個(gè)環(huán)境都配置成功啦,有問題請(qǐng)留言

參考資料

Spark官方文檔Quick-start

用SBT編譯Spark的WordCount程序

Big Data Analysis with Scala and Spark 洛桑聯(lián)邦理工學(xué)院 - Coursera

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狂魔,一起剝皮案震驚了整個(gè)濱河市籽孙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌犹菇,老刑警劉巖芽卿,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姑原,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡般婆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門器仗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人威鹿,你說我怎么就攤上這事忽你。” “怎么了糟秘?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵球散,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我吼畏,道長(zhǎng),這世上最難降的妖魔是什么躲舌? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮约计,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尉桩。我一直安慰自己,他們只是感情好贪庙,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布这橙。 她就那樣靜靜地躺著盛卡,像睡著了一般滑沧。 火紅的嫁衣襯著肌膚如雪滓技。 梳的紋絲不亂的頭發(fā)上膝昆,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音收叶,去河邊找鬼蜓萄。 笑死俏竞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疚漆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼娶聘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼闻镶!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起丸升,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤铆农,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后狡耻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墩剖,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年夷狰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了岭皂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沼头,死狀恐怖爷绘,靈堂內(nèi)的尸體忽然破棺而出书劝,到底是詐尸還是另有隱情,我是刑警寧澤土至,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布购对,位于F島的核電站,受9級(jí)特大地震影響陶因,放射性物質(zhì)發(fā)生泄漏骡苞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一坑赡、第九天 我趴在偏房一處隱蔽的房頂上張望烙如。 院中可真熱鬧,春花似錦毅否、人聲如沸亚铁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)徘溢。三九已至,卻和暖如春捆探,著一層夾襖步出監(jiān)牢的瞬間然爆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工黍图, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留曾雕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓助被,卻偏偏與公主長(zhǎng)得像剖张,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子揩环,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容