大數(shù)據(jù)服務(wù)上云的思考">大數(shù)據(jù)服務(wù)上云的思考
862
2025-04-04
為了從低信息密度的大批量文字中提取關(guān)鍵信息,或者為了展示文章的主題信息,我們往往會(huì)提取文檔的關(guān)鍵詞,并制作關(guān)鍵詞詞云。提取關(guān)鍵詞的關(guān)鍵步驟就是對(duì)給定預(yù)料集中出現(xiàn)的各單詞進(jìn)行詞頻統(tǒng)計(jì)。本文將利用Spark提供的并行計(jì)算API,完成對(duì)大批量文檔的詞頻統(tǒng)計(jì)。在正式編碼之前,我們先看看Spark提供的大規(guī)模分布式運(yùn)算API抽象:
RDD/SparkContext與Datasets/SparkSession
1.?RDD與SparkContext
Spark以彈性分布式數(shù)據(jù)集(Resilient?Distributed?Dataset,?RDD)這一核心概念,提供了對(duì)物理上分散的大規(guī)模數(shù)據(jù)集的統(tǒng)一抽象,并基于這一統(tǒng)一數(shù)據(jù)抽象,實(shí)現(xiàn)了map、filter、groupByKey、join等一系列數(shù)據(jù)分布式運(yùn)算算子。而Spark應(yīng)用,就是基于這一系列運(yùn)算算子及其組合實(shí)現(xiàn)業(yè)務(wù)邏輯。
而對(duì)于RDD這一抽象,Spark又是以SparkContext為主要入口對(duì)外呈現(xiàn)的。因而,如下圖1所示,用戶Spark應(yīng)用的main方法邏輯一般會(huì)先引入SparkContext,然后通過它生成輸入數(shù)據(jù)的RDD抽象,然后進(jìn)一步基于RDD算子,實(shí)現(xiàn)到集群的分布式運(yùn)行。SparkContext作為Spark計(jì)算引擎的主要功能入口,除了生成RDD之外,還提供了包括集群配置、作業(yè)提交及注冊(cè)-等大量接口,用于實(shí)現(xiàn)用戶應(yīng)用程序與集群的交互。更為詳細(xì)的API介紹可參考:?RDD?Programming?Guide。
圖1?Spark架構(gòu)圖
2.?Datasets與SparkSession
Spark?1.6版本SQL模塊在RDD基礎(chǔ)之上,引入額外的結(jié)構(gòu)化信息,提供了Dataset/DataFrames這一新的結(jié)構(gòu)化數(shù)據(jù)抽象,并基于此提供了一套分布式數(shù)據(jù)運(yùn)算算子。由于包含額外的結(jié)構(gòu)化信息,Spark引擎得以對(duì)運(yùn)算進(jìn)行進(jìn)一步的優(yōu)化,因而具有更好的運(yùn)算性能。與SparkContext相對(duì)應(yīng)地,Spark在2.0版本中,提供了SparkSession這一Datasets?API的編程入口。更為詳細(xì)的API介紹可參考:?Spark?SQL,?DataFrames?and?Datasets?Guide。
對(duì)于上述兩套接口,本文以RDD/SparkContext為例,采用Scala語(yǔ)言和sbt構(gòu)建工具,介紹詞頻統(tǒng)計(jì)應(yīng)用的實(shí)現(xiàn)。而詞頻統(tǒng)計(jì)Datasets/SparkSession版本的實(shí)現(xiàn)可參見:?Spark?Session?API和Dataset?API。
引入Spark依賴
我們的WordCount應(yīng)用依賴于RDD/SparkContext提供的API,而RDD/SparkContext是在core模塊提供的,所以在?build.sbt?中引入spark-core依賴:
//?build.sbt name?:=?"Spark?Word?Count?Project" version?:=?"1.0" scalaVersion?:=?"2.11.8" libraryDependencies?+=?"org.apache.spark"?%%?"spark-core"?%?"2.3.0"
編寫代碼
Spark應(yīng)用通常包括以下步驟:
1.?創(chuàng)建SparkContext ??2.?調(diào)用SparkContext接口,生成輸入數(shù)據(jù)集的RDD ??3.?對(duì)輸入數(shù)據(jù)集RDD,調(diào)用RDD轉(zhuǎn)換算子,構(gòu)造數(shù)據(jù)處理的DAG執(zhí)行圖 ??4.?調(diào)用RDD?action算子,啟動(dòng)數(shù)據(jù)處理,完成數(shù)據(jù)集的分布式運(yùn)算并輸出結(jié)果 ??5.?Stop?SparkContext
基于此,詞頻統(tǒng)計(jì)應(yīng)用可實(shí)現(xiàn)如下:
/*?WordCount.scala?*/ import?org.apache.spark.{SparkConf,?SparkContext} object?WordCount?{ ??def?main(args:?Array[String])?{ ????//?1.?Create?[[SparkContext]]?instance ????val?conf:?SparkConf?=?new?SparkConf().setAppName("Word?Count") ????val?sparkContext:?SparkContext?=?new?SparkContext(conf) ??????? ????val?inputFilePath?=?args(0) ????val?outputFilePath?=?args(1) ???? ????//?2.?Generate?RDD ????val?lines?=?sparkContext.textFile(inputFilePath) ???? ????//?3.?RDD?transformations ????val?wordCounts?=?lines.flatMap(line?=>?line.split("\\s+")).map(word?=>?(word,?1)).reduceByKey(_?+?_) ???? ????//?4.?RDD?action,?start?to?process ????wordCounts.saveAsTextFile(outputFilePath) ???? ????//?5.?Stop ????sparkContext.stop() ??} }
應(yīng)用構(gòu)建及本地驗(yàn)證
應(yīng)用構(gòu)建
1.?生成符合sbt構(gòu)建工具要求的項(xiàng)目目錄:
#?Your?directory?layout?should?look?like?this $?find?. . ./build.sbt ./src ./src/main ./src/main/scala ./src/main/scala/WordCount.scala
2.?調(diào)用?sbt?package?命令,構(gòu)建應(yīng)用:
#?Package?a?jar?containing?your?application $?sbt?package ... [info]?Packaging?./target/scala-2.11/spark-word-count-project_2.11-1.0.jar ...
本地驗(yàn)證
在部署應(yīng)用到生產(chǎn)集群之前,可先進(jìn)行本地驗(yàn)證,本地驗(yàn)證可調(diào)用?spark-submit?腳本,以local模式運(yùn)行:
$?YOUR_SPARK_HOME/bin/spark-submit?\ ??--class?"WordCount"?\ ??--master?local[*]?\ ??target/scala-2.11/spark-word-count-project_2.11-1.0.jar ??doucments_test??#?Input?path?argument ??words_count_results_test??#?Output?path?argument
生產(chǎn)部署
本地驗(yàn)證通過后,便可以將應(yīng)用正式部署到生產(chǎn)集群。不過,Spark生產(chǎn)集群的部署運(yùn)維又是一個(gè)讓人頭疼的事情。華為云數(shù)據(jù)湖探索(Data?Lake?Insight,?DLI)基于Apache?Spark/Flink生態(tài),提供了完全托管的大數(shù)據(jù)處理分析服務(wù)。借助DLI服務(wù),你只需要關(guān)注應(yīng)用的處理邏輯,提供構(gòu)建好的應(yīng)用程序包,就可以輕松完成你的大規(guī)模數(shù)據(jù)處理分析任務(wù),即開即用,按需計(jì)費(fèi)。具體部署操作可參考:數(shù)據(jù)湖探索服務(wù)?用戶指南。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。