Spark快速入门指南 – Spark安装与基础使用
本文轉(zhuǎn)載自Spark快速入門指南 – Spark安裝與基礎(chǔ)使用
Apache Spark 是一個(gè)新興的大數(shù)據(jù)處理通用引擎,提供了分布式的內(nèi)存抽象。Spark 正如其名,最大的特點(diǎn)就是快(Lightning-fast),可比 Hadoop MapReduce 的處理速度快 100 倍。此外,Spark 提供了簡(jiǎn)單易用的 API,幾行代碼就能實(shí)現(xiàn) WordCount。本教程主要參考官網(wǎng)快速入門教程,介紹了 Spark 的安裝,Spark shell 、RDD、Spark SQL、Spark Streaming 等的基本使用。
本教程的具體運(yùn)行環(huán)境如下:
- CentOS 6.4
- Spark 1.6
- Hadoop 2.6.0
- Java JDK 1.7
- Scala 2.10.5
準(zhǔn)備工作
運(yùn)行 Spark 需要 Java JDK 1.7,CentOS 6.x 系統(tǒng)默認(rèn)只安裝了 Java JRE,還需要安裝 Java JDK,并配置好 JAVA_HOME 變量。此外,Spark 會(huì)用到 HDFS 與 YARN,因此請(qǐng)先安裝 Hadoop,具體請(qǐng)瀏覽Hadoop安裝教程,在此就不再?gòu)?fù)述。
安裝 Spark
待 Hadoop 安裝好之后,我們?cè)匍_(kāi)始安裝 Spark。
官網(wǎng)下載地址:http://spark.apache.org/downloads.html
本教程選擇的是 Spark 1.6.0 版本,選擇 package type 為 “Pre-build with user-provided Hadoop [can use with most Hadoop distributions]”,再點(diǎn)擊給出的下載連接?http://www.apache.org/dyn/closer.lua/spark/spark-1.6.0/spark-1.6.0-bin-without-hadoop.tgz?就可以下載了,如下圖所示:
從官網(wǎng)下載 Spark
Package type- Source code: Spark 源碼,需要編譯才能使用,另外 Scala 2.11 需要使用源碼編譯才可使用
- Pre-build with user-provided Hadoop: “Hadoop free” 版,可應(yīng)用到任意 Hadoop 版本
- Pre-build for Hadoop 2.6 and later: 基于 Hadoop 2.6 的預(yù)先編譯版,需要與本機(jī)安裝的 Hadoop 版本對(duì)應(yīng)。可選的還有 Hadoop 2.4 and later、Hadoop 2.3、Hadoop 1.x,以及 CDH 4。
為方便,本教程選擇的是 Pre-build with user-provided Hadoop,簡(jiǎn)單配置后可應(yīng)用到任意 Hadoop 版本。
下載后,執(zhí)行如下命令進(jìn)行安裝:
安裝后,需要在 ./conf/spark-env.sh 中修改 Spark 的 Classpath,執(zhí)行如下命令拷貝一個(gè)配置文件:
編輯 ./conf/spark-env.sh(vim ./conf/spark-env.sh) ,在最后面加上如下一行:
export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)保存后,Spark 就可以啟動(dòng)、運(yùn)行了。
運(yùn)行 Spark 示例
注意,必須安裝 Hadoop 才能使用 Spark,但如果使用 Spark 過(guò)程中沒(méi)用到 HDFS,不啟動(dòng) Hadoop 也是可以的。此外,接下來(lái)教程中出現(xiàn)的命令、目錄,若無(wú)說(shuō)明,則一般以 Spark 的安裝目錄(/usr/local/spark)為當(dāng)前路徑,請(qǐng)注意區(qū)分。
在 ./examples/src/main 目錄下有一些 Spark 的示例程序,有 Scala、Java、Python、R 等語(yǔ)言的版本。我們可以先運(yùn)行一個(gè)示例程序 SparkPi(即計(jì)算 π 的近似值),執(zhí)行如下命令:
執(zhí)行時(shí)會(huì)輸出非常多的運(yùn)行信息,輸出結(jié)果不容易找到,可以通過(guò)?grep?命令進(jìn)行過(guò)濾(命令中的?2>&1?可以將所有的信息都輸出到 stdout 中,否則由于輸出日志的性質(zhì),還是會(huì)輸出到屏幕中):
過(guò)濾后的運(yùn)行結(jié)果如下圖所示,可以得到 π 的 5 位小數(shù)近似值 :
從官網(wǎng)下載 Spark
Python 版本的 SparkPi 則需要通過(guò) spark-submit 運(yùn)行:
通過(guò) Spark Shell 進(jìn)行交互分析
Spark shell 提供了簡(jiǎn)單的方式來(lái)學(xué)習(xí) API,也提供了交互的方式來(lái)分析數(shù)據(jù)。Spark Shell 支持 Scala 和 Python,本教程選擇使用 Scala 來(lái)進(jìn)行介紹。
ScalaScala 是一門現(xiàn)代的多范式編程語(yǔ)言,志在以簡(jiǎn)練、優(yōu)雅及類型安全的方式來(lái)表達(dá)常用編程模式。它平滑地集成了面向?qū)ο蠛秃瘮?shù)語(yǔ)言的特性。Scala 運(yùn)行于 Java 平臺(tái)(JVM,Java 虛擬機(jī)),并兼容現(xiàn)有的 Java 程序。
Scala 是 Spark 的主要編程語(yǔ)言,如果僅僅是寫 Spark 應(yīng)用,并非一定要用 Scala,用 Java、Python 都是可以的。使用 Scala 的優(yōu)勢(shì)是開(kāi)發(fā)效率更高,代碼更精簡(jiǎn),并且可以通過(guò) Spark Shell 進(jìn)行交互式實(shí)時(shí)查詢,方便排查問(wèn)題。
執(zhí)行如下命令啟動(dòng) Spark Shell:
啟動(dòng)成功后如圖所示,會(huì)有 “scala >” 的命令提示符。
成功啟動(dòng)Spark Shell
基礎(chǔ)操作
Spark 的主要抽象是分布式的元素集合(distributed collection of items),稱為RDD(Resilient Distributed Dataset,彈性分布式數(shù)據(jù)集),它可被分發(fā)到集群各個(gè)節(jié)點(diǎn)上,進(jìn)行并行操作。RDDs 可以通過(guò) Hadoop InputFormats 創(chuàng)建(如 HDFS),或者從其他 RDDs 轉(zhuǎn)化而來(lái)。
我們從 ./README 文件新建一個(gè) RDD,代碼如下(本文出現(xiàn)的 Spark 交互式命令代碼中,與位于同一行的注釋內(nèi)容為該命令的說(shuō)明,命令之后的注釋內(nèi)容表示交互式輸出結(jié)果):
代碼中通過(guò) “file://” 前綴指定讀取本地文件。Spark shell 默認(rèn)是讀取 HDFS 中的文件,需要先上傳文件到 HDFS 中,否則會(huì)有“org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://localhost:9000/user/hadoop/README.md”的錯(cuò)誤。
上述命令的輸出結(jié)果如下圖所示:
新建RDD
RDDs 支持兩種類型的操作
- actions: 在數(shù)據(jù)集上運(yùn)行計(jì)算后返回值
- transformations: 轉(zhuǎn)換, 從現(xiàn)有數(shù)據(jù)集創(chuàng)建一個(gè)新的數(shù)據(jù)集
下面我們就來(lái)演示 count() 和 first() 操作:
接著演示 transformation,通過(guò) filter transformation 來(lái)返回一個(gè)新的 RDD,代碼如下:
可以看到一共有 17 行內(nèi)容包含 Spark,這與通過(guò) Linux 命令?cat ./README.md | grep "Spark" -c?得到的結(jié)果一致,說(shuō)明是正確的。action 和 transformation 可以用鏈?zhǔn)讲僮鞯姆绞浇Y(jié)合使用,使代碼更為簡(jiǎn)潔:
RDD的更多操作
RDD 的 actions 和 transformations 可用在更復(fù)雜的計(jì)算中,例如通過(guò)如下代碼可以找到包含單詞最多的那一行內(nèi)容共有幾個(gè)單詞:
代碼首先將每一行內(nèi)容 map 為一個(gè)整數(shù),這將創(chuàng)建一個(gè)新的 RDD,并在這個(gè) RDD 中執(zhí)行 reduce 操作,找到最大的數(shù)。map()、reduce() 中的參數(shù)是 Scala 的函數(shù)字面量(function literals,也稱為閉包 closures),并且可以使用語(yǔ)言特征或 Scala/Java 的庫(kù)。例如,通過(guò)使用 Math.max() 函數(shù)(需要導(dǎo)入 Java 的 Math 庫(kù)),可以使上述代碼更容易理解:
Hadoop MapReduce 是常見(jiàn)的數(shù)據(jù)流模式,在 Spark 中同樣可以實(shí)現(xiàn)(下面這個(gè)例子也就是 WordCount):
緩存
Spark 支持在集群范圍內(nèi)將數(shù)據(jù)集緩存至每一個(gè)節(jié)點(diǎn)的內(nèi)存中,可避免數(shù)據(jù)傳輸,當(dāng)數(shù)據(jù)需要重復(fù)訪問(wèn)時(shí)這個(gè)特征非常有用,例如查詢體積小的“熱”數(shù)據(jù)集,或是運(yùn)行如 PageRank 的迭代算法。調(diào)用 cache(),就可以將數(shù)據(jù)集進(jìn)行緩存:
Spark SQL 和 DataFrames
Spark SQL 是 Spark 內(nèi)嵌的模塊,用于結(jié)構(gòu)化數(shù)據(jù)。在 Spark 程序中可以使用 SQL 查詢語(yǔ)句或?DataFrame API。DataFrames 和 SQL 提供了通用的方式來(lái)連接多種數(shù)據(jù)源,支持 Hive、Avro、Parquet、ORC、JSON、和 JDBC,并且可以在多種數(shù)據(jù)源之間執(zhí)行 join 操作。
下面仍在 Spark shell 中演示一下 Spark SQL 的基本操作,該部分內(nèi)容主要參考了?Spark SQL、DataFrames 和 Datasets 指南。
Spark SQL 的功能是通過(guò) SQLContext 類來(lái)使用的,而創(chuàng)建 SQLContext 是通過(guò) SparkContext 創(chuàng)建的。在 Spark shell 啟動(dòng)時(shí),輸出日志的最后有這么幾條信息
16/01/16 13:25:41 INFO repl.SparkILoop: Created spark context.. Spark context available as sc. 16/01/16 13:25:41 INFO repl.SparkILoop: Created sql context.. SQL context available as sqlContext.這些信息表明 SparkContent 和 SQLContext 都已經(jīng)初始化好了,可通過(guò)對(duì)應(yīng)的 sc、sqlContext 變量直接進(jìn)行訪問(wèn)。
使用 SQLContext 可以從現(xiàn)有的 RDD 或數(shù)據(jù)源創(chuàng)建 DataFrames。作為示例,我們通過(guò) Spark 提供的 JSON 格式的數(shù)據(jù)源文件 ./examples/src/main/resources/people.json 來(lái)進(jìn)行演示,該數(shù)據(jù)源內(nèi)容如下:
執(zhí)行如下命令導(dǎo)入數(shù)據(jù)源,并輸出內(nèi)容:
接著,我們來(lái)演示 DataFrames 處理結(jié)構(gòu)化數(shù)據(jù)的一些基本操作:
當(dāng)然,我們也可以使用 SQL 語(yǔ)句來(lái)進(jìn)行操作:
更多的功能可以查看完整的?DataFrames API?,此外 DataFrames 也包含了豐富的?DataFrames Function?可用于字符串處理、日期計(jì)算、數(shù)學(xué)計(jì)算等。
Spark Streaming
流計(jì)算除了使用?Storm?框架,使用 Spark Streaming 也是一個(gè)很好的選擇。基于 Spark Streaming,可以方便地構(gòu)建可拓展、高容錯(cuò)的流計(jì)算應(yīng)用程序。Spark Streaming 使用 Spark API 進(jìn)行流計(jì)算,這意味著在 Spark 上進(jìn)行流處理與批處理的方式一樣。因此,你可以復(fù)用批處理的代碼,使用 Spark Streaming 構(gòu)建強(qiáng)大的交互式應(yīng)用程序,而不僅僅是用于分析數(shù)據(jù)。
下面以一個(gè)簡(jiǎn)單的 Spark Streaming 示例(基于流的單詞統(tǒng)計(jì))來(lái)演示一下 Spark Streaming:本地服務(wù)器通過(guò) TCP 接收文本數(shù)據(jù),實(shí)時(shí)輸出單詞統(tǒng)計(jì)結(jié)果。該部分內(nèi)容主要參考了?Spark Streaming 編程指南。
運(yùn)行該示例需要 Netcat(在網(wǎng)絡(luò)上通過(guò) TCP 或 UDP 讀寫數(shù)據(jù)),CentOS 6.x 系統(tǒng)中默認(rèn)沒(méi)有安裝,經(jīng)過(guò)測(cè)試,如果通過(guò) yum 直接安裝,運(yùn)行時(shí)會(huì)有 “nc: Protocol not available” 的錯(cuò)誤,需要下載較低版本的 nc?才能正常使用。我們選擇 Netcat 0.6.1 版本,在終端中運(yùn)行如下命令進(jìn)行安裝:
安裝好 NetCat 之后,使用如下命令建立本地?cái)?shù)據(jù)服務(wù),監(jiān)聽(tīng) TCP 端口 9999:
啟動(dòng)后,該端口就被占用了,需要開(kāi)啟另一個(gè)終端運(yùn)行示例程序,執(zhí)行如下命令:
接著在終端 1 中輸入文本,在終端 2 中就可以實(shí)時(shí)看到單詞統(tǒng)計(jì)結(jié)果了。
Spark Streaming 的內(nèi)容較多,本教程就簡(jiǎn)單介紹到這,更詳細(xì)的內(nèi)容可查看官網(wǎng)教程。最后需要關(guān)掉終端 2,并按 ctrl+c 退出 終端 1 的Netcat。
獨(dú)立應(yīng)用程序(Self-Contained Applications)
接著我們通過(guò)一個(gè)簡(jiǎn)單的應(yīng)用程序 SimpleApp 來(lái)演示如何通過(guò) Spark API 編寫一個(gè)獨(dú)立應(yīng)用程序。使用 Scala 編寫的程序需要使用 sbt 進(jìn)行編譯打包,相應(yīng)的,Java 程序使用 Maven 編譯打包,而 Python 程序通過(guò) spark-submit 直接提交。
應(yīng)用程序代碼
在終端中執(zhí)行如下命令創(chuàng)建一個(gè)文件夾 sparkapp 作為應(yīng)用程序根目錄:
在 ./sparkapp/src/main/scala 下建立一個(gè)名為 SimpleApp.scala 的文件(vim ./sparkapp/src/main/scala/SimpleApp.scala),添加代碼如下:
該程序計(jì)算 /usr/local/spark/README 文件中包含 “a” 的行數(shù) 和包含 “b” 的行數(shù)。代碼第8行的 /usr/local/spark 為 Spark 的安裝目錄,如果不是該目錄請(qǐng)自行修改。不同于 Spark shell,獨(dú)立應(yīng)用程序需要通過(guò)?val sc = new SparkContext(conf)?初始化 SparkContext,SparkContext 的參數(shù) SparkConf 包含了應(yīng)用程序的信息。
該程序依賴 Spark API,因此我們需要通過(guò) sbt 進(jìn)行編譯打包。在 ./sparkapp 中新建文件 simple.sbt(vim ./sparkapp/simple.sbt),添加內(nèi)容如下,聲明該獨(dú)立應(yīng)用程序的信息以及與 Spark 的依賴關(guān)系:
name := "Simple Project"version := "1.0"scalaVersion := "2.10.5"libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.0"文件 simple.sbt 需要指明 Spark 和 Scala 的版本。啟動(dòng) Spark shell 的過(guò)程中,當(dāng)輸出到 Spark 的符號(hào)圖形時(shí),可以看到相關(guān)的版本信息。
查看 Spark 和 Scala 的版本信息
安裝 sbt
Spark 中沒(méi)有自帶 sbt,需要手動(dòng)安裝 sbt,我們選擇安裝在 /usr/local/sbt 中:
經(jīng)筆者測(cè)試,按官網(wǎng)教程安裝 sbt 0.13.9 后,使用時(shí)可能存在網(wǎng)絡(luò)問(wèn)題,無(wú)法下載依賴包,導(dǎo)致 sbt 無(wú)法正常使用,需要進(jìn)行一定的修改。為方便,請(qǐng)使用筆者修改后的版本,下載地址:http://pan.baidu.com/s/1eRyFddw。
下載后,執(zhí)行如下命令拷貝至 /usr/local/sbt 中:
接著在 /usr/local/sbt 中創(chuàng)建 sbt 腳本(vim ./sbt),添加如下內(nèi)容:
保存后,為 ./sbt 腳本增加可執(zhí)行權(quán)限:
最后檢驗(yàn) sbt 是否可用(首次運(yùn)行會(huì)處于 “Getting org.scala-sbt sbt 0.13.9 …” 的下載狀態(tài),請(qǐng)耐心等待。筆者等待了 7 分鐘才出現(xiàn)第一條下載提示):
下載過(guò)程中可能會(huì)類似 “Server access Error: java.security.ProviderException: java.security.KeyException url=https://jcenter.bintray.com/org/scala-sbt/precompiled-2_9_3/0.13.9/precompiled-2_9_3-0.13.9.jar” 的錯(cuò)誤,可以忽略。可再執(zhí)行一次?./sbt sbt-version,只要能得到如下圖的版本信息就沒(méi)問(wèn)題:
驗(yàn)證 sbt 是否可用
如果由于網(wǎng)絡(luò)問(wèn)題無(wú)法下載依賴,導(dǎo)致 sbt 無(wú)法正確運(yùn)行的話,可以下載筆者提供的離線依賴包 sbt-0.13.9-repo.tar.gz 到本地中(依賴包的本地位置為 ~/.sbt 和 ~/.ivy2,檢查依賴關(guān)系時(shí),首先檢查本地,本地未找到,再?gòu)木W(wǎng)絡(luò)中下載),下載地址:http://pan.baidu.com/s/1sjTQ8yD。下載后,執(zhí)行如下命令解壓依賴包:
通過(guò)這個(gè)方式,一般可以解決依賴包缺失的問(wèn)題(讀者提供的依賴包僅適合于 Spark 1.6 版本,不同版本依賴關(guān)系不一樣)。
如果對(duì) sbt 存在的網(wǎng)絡(luò)問(wèn)題以及如何解決感興趣,請(qǐng)點(diǎn)擊下方查看。
點(diǎn)擊查看:解決 sbt 無(wú)法下載依賴包的問(wèn)題
使用 sbt 打包 Scala 程序
為保證 sbt 能正常運(yùn)行,先執(zhí)行如下命令檢查整個(gè)應(yīng)用程序的文件結(jié)構(gòu):
文件結(jié)構(gòu)應(yīng)如下圖所示:
SimpleApp的文件結(jié)構(gòu)
接著,我們就可以通過(guò)如下代碼將整個(gè)應(yīng)用程序打包成 JAR(首次運(yùn)行同樣需要下載依賴包,如果這邊遇到網(wǎng)絡(luò)問(wèn)題無(wú)法成功,也請(qǐng)下載上述安裝 sbt 提到的離線依賴包 sbt-0.13.9-repo.tar.gz ):
打包成功的話,會(huì)輸出如下圖內(nèi)容:
SimpleApp的文件結(jié)構(gòu)
生成的 jar 包的位置為 ~/sparkapp/target/scala-2.10/simple-project_2.10-1.0.jar。
通過(guò) spark-submit 運(yùn)行程序
最后,我們就可以將生成的 jar 包通過(guò) spark-submit 提交到 Spark 中運(yùn)行了,命令如下:
最終得到的結(jié)果如下:
Lines with a: 58, Lines with b: 26自此,你就完成了你的第一個(gè) Spark 應(yīng)用程序了。
總結(jié)
以上是生活随笔為你收集整理的Spark快速入门指南 – Spark安装与基础使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 美剧王冠剧情介绍
- 下一篇: Intellij Idea搭建Spark