利用Scala語言開發Spark應用程式

來源:互聯網
上載者:User
關鍵字 應用程式 dfs 語言開發 步驟 可以

利用Scala語言開發Spark應用程式[轉:董的博客 HTTP://www.dongxicheng.org]

Spark內核是由Scala語言開發的,因此使用Scala語言開發Spark應用程式是自然而然的事情。 如果你對Scala語言還不太熟悉,可以閱讀網路教程A Scala Tutorial for JAVA Programmers或者相關Scala書籍進行學習。

本文將介紹3個Scala Spark程式設計實例,分別是WordCount、TopK和SparkJoin,分別代表了Spark的三種典型應用。

1. WordCount程式設計實例

WordCount是一個最簡單的分散式應用實例,主要功能是統計輸入目錄中所有單詞出現的總次數,編寫步驟如下:

步驟1:

創建一個SparkCoNtext物件,該物件有四個參數:Spark master位置、應用程式名稱,Spark安裝目錄和jar存放位置,對於Spark On YARN而言,最重要的是前兩個參數,第一個參數指定為「 yarn-standalone」,第二個參數是自訂的字串,舉例如下:

val sc = new SparkCoNtext(args(0), 「WordCount」,

System.getenv(「SPARK_HOME」), Seq(System.getenv(「SPARK_TEST_JAR」)))

步驟2:

讀取輸入資料。 我們要從HDFS上讀取文本資料,可以使用SparkCoNtext中的textFile函數將輸入檔轉換為一個RDD,該函數採用的是Hadoop中的TextInputFormat解析輸入資料,舉例如下:

val textFile = sc.textFile(args(1))

當然,Spark允許你採用任何Hadoop InputFormat,比如二進位輸入格式SequenceFileInputFormat,此時你可以使用SparkCoNtext中的hadoopRDD函數,舉例如下:

val inputFormatClass = classOf[SequenceFileInputFormat[Text,Text]]

var hadoopRdd = sc.hadoopRDD(conf, inputFormatClass, classOf[Text], classOf[Text])

或者直接創建一個HadoopRDD物件:

var hadoopRdd = new HadoopRDD(sc, conf,

classOf[SequenceFileInputFormat[Text,Text, classOf[Text], classOf[Text])

步驟3:

通過RDD轉換運算元操作和轉換RDD,對於WordCount而言,首先需要從輸入資料中每行字串中解析出單詞,然後將相同單詞放到一個桶中,最後統計每個桶中每個單詞出現的頻率,舉例如下:

val result = hadoopRdd.flatMap{

case(key, value) => value.toString().split(「\\s+」);

}.map(word => (word, 1)). reduceByKey (_ + _)

其中,flatMap函數可以將一條記錄轉換成多條記錄(一對多關聯性),map函數將一條記錄轉換為另一條記錄(一對一關聯性),reduceByKey函數將key相同的資料劃分到一個桶中,並以key為單位分組進行計算, 這些函數的具體含義可參考:Spark Transformation。

步驟4:

將產生的RDD資料集保存到HDFS上。 可以使用SparkCoNtext中的saveAsTextFile哈數將資料集保存到HDFS目錄下,預設採用Hadoop提供的TextOutputFormat,每條記錄以「(key,value)」的形式列印輸出, 你也可以採用saveAsSequenceFile函數將資料保存為SequenceFile格式等,舉例如下:

result.saveAsSequenceFile(args(2))

當然,一般我們寫Spark程式時,需要包含以下兩個標頭檔:

import org.apache.spark._

import SparkCoNtext._

WordCount完整程式已在「Apache Spark學習:利用Eclipse構建Spark整合式開發環境」一文中進行了介紹,在次不贅述。

需要注意的是,指定輸入輸出檔案時,需要指定hdfs的URI,比如輸入目錄是hdfs://hadoop-test/tmp/input,輸出目錄是hdfs://hadoop-test/tmp/output,其中,「hdfs ://hadoop-test」是由Hadoop設定檔core-site.xml中參數fs.default.name指定的,具體替換成你的配置即可。

2. TopK程式設計實例

TopK程式的任務是對一堆文本進行詞頻統計,並返回出現頻率最高的K個詞。 如果採用MapReduce實現,則需要編寫兩個作業:WordCount和TopK,而使用Spark則只需一個作業,其中WordCount部分已由前面實現了,接下來順著前面的實現,找到Top K個詞。 注意,本文的實現並不是最優的,有很大改進空間。

步驟1:

首先需要對所有詞按照詞頻排序,如下:

val sorted = result.map {

case(key, value) => (value, key); exchange key and value

}.sortByKey(true, 1)

步驟2:返回前K個:

val topK = sorted.top(args(3).toInt)

步驟3:將K各詞列印出來:

topK.foreach(println)

注意,對於應用程式標準輸出的內容,YARN將保存到Container的stdout日誌中。 在YARN中,每個Container存在三個日誌檔,分別是stdout、stderr和syslog,前兩個保存的是標準輸出產生的內容,第三個保存的是log4j列印的日誌,通常只有第三個日誌中有內容。

本程式完整代碼、編譯好的jar包和運行腳本可以從這裡下載。 下載之後,按照「Apache Spark學習:利用Eclipse構建Spark整合式開發環境」一文操作流程運行即可。

3. SparkJoin程式設計實例

在推薦領域有一個著名的開放測試集是movielens給的,下載連結是:HTTP://grouplens.org/datasets/movielens/,該測試集包含三個檔,分別是ratings.dat、sers.dat 、movies.dat,具體介紹可閱讀:README.txt,本節給出的SparkJoin實例則通過連接ratings.dat和movies.dat兩個檔得到平均得分超過4.0的電影清單,採用的資料集是:ml-1m。 程式碼如下:

import org.apache.spark._

import SparkCoNtext._

object SparkJoin {

def main(args: Array[String]) {

if (args.length != 4 ){

println(「usage is org.test.WordCount 」)

return

}

val sc = new SparkCoNtext(args(0), 「WordCount」,

System.getenv(「SPARK_HOME」), Seq(System.getenv(「SPARK_TEST_JAR」)))

Read rating from HDFS file

val textFile = sc.textFile(args(1))

extract (movieid, rating)

val rating = textFile.map(line => {

val fileds = line.split(「::」)

(fileds(1).toInt, fileds(2).toDouble)

})

val movieScores = rating

.groupByKey()

.map(data => {

val avg = data._2.sum / data._2.size

(data._1, avg)

})

Read movie from HDFS file

val movies = sc.textFile(args(2))

val movieskey = movies.map(line => {

val fileds = line.split(「::」)

(fileds(0).toInt, fileds(1))

}).keyBy(tup => tup._1)

by join, we get <movie, moviename="" averagerating,="">

val result = movieScores

.keyBy(tup => tup._1)

.join(movieskey)

.filter(f => f._2._1._2 > 4.0)

.map(f => (f._1, f._2._1._2, f._2._2._2))

result.saveAsTextFile(args(3))

}

}

你可以從這裡下載代碼、編譯好的jar包和運行腳本。

這個程式直接使用Spark編寫有些麻煩,可以直接在Shark上編寫HQL實現,Shark是基於Spark的類似Hive的互動式查詢引擎,具體可參考:Shark。

4. 總結

Spark 程式設計對Scala語言的要求不高,正如Hadoop程式設計對JAVA語言要求不高一樣,只要掌握了最基本的語法就能編寫程式,且常見的語法和表達方式是很少的。 通常,剛開始仿照官方實例編寫程式,包括Scala、JAVA和Python三種語言實例。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.