离线轻量级大数据平台Spark之单机部署及Java开发
1、Spark平臺(tái)基本介紹
Spark 由加州大學(xué)伯克利分校 AMP 實(shí)驗(yàn)室 (Algorithms, Machines, and PeopleLab) 開(kāi)發(fā),可用來(lái)構(gòu)建大型的、低延遲的數(shù)據(jù)分析應(yīng)用程序。
Spark 是在Scala 語(yǔ)言中實(shí)現(xiàn)的,它將 Scala 用作其應(yīng)用程序框架。Scala 可以像操作本地集合對(duì)象一樣輕松地操作分布式數(shù)據(jù)集。
Spark 是一種與Hadoop 相似的開(kāi)源集群計(jì)算環(huán)境,不同之處使是Spark 啟用了內(nèi)存分布數(shù)據(jù)集,除了能夠提供交互式查詢外,它還可以優(yōu)化迭代工作負(fù)載。盡管創(chuàng)建 Spark 是為了支持分布式數(shù)據(jù)集上的迭代作業(yè),但是實(shí)際上它是對(duì) Hadoop 的補(bǔ)充,可以在 Hadoo 文件系統(tǒng)中并行運(yùn)行。通過(guò)名為 Mesos 的第三方集群框架可以支持此行為。
1)Spark集群計(jì)算架構(gòu)
Spark 是為集群計(jì)算中的特定類型的工作負(fù)載而設(shè)計(jì),即那些在并行操作之間重用工作數(shù)據(jù)集(比如機(jī)器學(xué)習(xí)算法)的工作負(fù)載。為了優(yōu)化這些類型的工作負(fù)載,Spark 引進(jìn)了內(nèi)存集群計(jì)算的概念,可在內(nèi)存集群計(jì)算中將數(shù)據(jù)集緩存在內(nèi)存中,以縮短訪問(wèn)延遲。
Spark 還引進(jìn)了名為彈性分布式數(shù)據(jù)集 (RDD) 的抽象。RDD 是分布在一組節(jié)點(diǎn)中的只讀對(duì)象集合。這些集合是彈性的,如果數(shù)據(jù)集一部分丟失,則可以對(duì)它們進(jìn)行重建。重建部分?jǐn)?shù)據(jù)集的過(guò)程依賴于容錯(cuò)機(jī)制,該機(jī)制可以維護(hù)“血統(tǒng)”(即充許基于數(shù)據(jù)衍生過(guò)程重建部分?jǐn)?shù)據(jù)集的信息)。RDD 被表示為一個(gè) Scala 對(duì)象,并且可以從文件中創(chuàng)建它;一個(gè)并行化的切片(遍布于節(jié)點(diǎn)之間);另一個(gè) RDD 的轉(zhuǎn)換形式;并且最終會(huì)徹底改變現(xiàn)有 RDD 的持久性,比如請(qǐng)求緩存在內(nèi)存中。
Spark 中的應(yīng)用程序稱為驅(qū)動(dòng)程序,這些驅(qū)動(dòng)程序可實(shí)現(xiàn)在單一節(jié)點(diǎn)上執(zhí)行的操作或在一組節(jié)點(diǎn)上并行執(zhí)行的操作。與 Hadoop 類似,Spark 支持單節(jié)點(diǎn)集群或多節(jié)點(diǎn)集群。對(duì)于多節(jié)點(diǎn)操作,Spark 依賴于 Mesos 集群管理器。Mesos 為分布式應(yīng)用程序的資源共享和隔離提供了一個(gè)有效平臺(tái)。該設(shè)置充許 Spark 與 Hadoop 共存于節(jié)點(diǎn)的一個(gè)共享池中。
2)Spark編程模式
ResilientDistributed Datasets (RDD,)??彈性分布式數(shù)據(jù)集。 RDD是只讀的、分區(qū)記錄的集合。驅(qū)動(dòng)程序可以在數(shù)據(jù)集上執(zhí)行兩種類型的操作:動(dòng)作和轉(zhuǎn)換。動(dòng)作會(huì)在數(shù)據(jù)集上執(zhí)行一個(gè)計(jì)算,并向驅(qū)動(dòng)程序返回一個(gè)值;而轉(zhuǎn)換會(huì)從現(xiàn)有數(shù)據(jù)集中創(chuàng)建一個(gè)新的數(shù)據(jù)集。動(dòng)作的示例包括執(zhí)行一個(gè) Reduce 操作(使用函數(shù))以及在數(shù)據(jù)集上進(jìn)行迭代(在每個(gè)元素上運(yùn)行一個(gè)函數(shù),類似于Map 操作)。轉(zhuǎn)換示例包括 Map 操作和 Cache 操作(它請(qǐng)求新的數(shù)據(jù)集存儲(chǔ)在內(nèi)存中)。
每個(gè)RDD有5個(gè)主要的屬性:
一組分片(partition),即數(shù)據(jù)集的基本組成單位
一個(gè)計(jì)算每個(gè)分片的函數(shù)
對(duì)parentRDD的依賴,這個(gè)依賴描述了RDD之間的lineage
對(duì)于key-value的RDD,一個(gè)Partitioner
一個(gè)列表,存儲(chǔ)存取每個(gè)partition的preferred位置。對(duì)于一個(gè)HDFS文件來(lái)說(shuō),存儲(chǔ)每個(gè)partition所在的塊的位置。
Scala 語(yǔ)言由EcolePolytechniqueFederale de Lausanne(瑞士洛桑市的兩所瑞士聯(lián)邦理工學(xué)院之一)開(kāi)發(fā)。Scala 是一種多范式語(yǔ)言,它以一種流暢的、讓人感到舒服的方法支持與命令式、函數(shù)式和面向?qū)ο蟮恼Z(yǔ)言相關(guān)的語(yǔ)言特性。從面向?qū)ο蟮慕嵌葋?lái)看,Scala 中的每個(gè)值都是一個(gè)對(duì)象。同樣,從函數(shù)觀點(diǎn)來(lái)看,每個(gè)函數(shù)都是一個(gè)值。Scala也是屬于靜態(tài)類型,它有一個(gè)既有表現(xiàn)力又很安全的類型系統(tǒng)。
此外,Scala是一種虛擬機(jī) (VM) 語(yǔ)言,并且可以通過(guò) Scala 編譯器生成的字節(jié)碼,直接運(yùn)行在使用 Java Runtime Environment V2 的 Java? Virtual Machine (JVM) 上。該設(shè)置充許 Scala 運(yùn)行在運(yùn)行 JVM 的任何地方(要求一個(gè)額外的 Scala 運(yùn)行時(shí)庫(kù))。它還充許 Scala 利用大量現(xiàn)存的 Java 庫(kù)以及現(xiàn)有的 Java 代碼。
最后,Scala具有可擴(kuò)展性。該語(yǔ)言(它實(shí)際上代表了可擴(kuò)展語(yǔ)言)被定義為可直接集成到語(yǔ)言中的簡(jiǎn)單擴(kuò)展。
2、Spark單機(jī)模式部署
1)基本環(huán)境
centos6.2 64位
#java-version //1.8版本
2)安裝spark
官網(wǎng)https://spark.apache.org/downloads.html選擇最新的 Spark 版本和 Hadoop 版本(暫不用 Hadoop,所以任何版本都行),然后下載壓縮包。
解壓到spark-2.0.1-bin-hadoop2.7.tgz到/home/spark路徑下。
#cd /home
#tar -zxvfspark-2.0.1-bin-hadoop2.7.tgz
#mv spark-2.0.1-bin-hadoop2.7.tgzspark
#cd /spark
#bin/spark-shell
進(jìn)入scale命令行。Spark 主要使用 Scala 來(lái)進(jìn)行開(kāi)發(fā),要最大程度地發(fā)揮 Spark 的性能,最好掌握scale語(yǔ)言。Spark 還支持 Java 和Python 的接口,但 Java 的語(yǔ)法沒(méi)有 Scala 簡(jiǎn)潔,Python 的性能沒(méi)有 Scala 的高。
3)spark-Shell
Scale> valtextFile = sc.textFile("README.md")
textFile:org.apache.spark.rdd.RDD[String] = README.md MapPartitionsRDD[1] at textFile at<console>:24
RDD對(duì)象集合有轉(zhuǎn)換和行動(dòng)兩類操作,轉(zhuǎn)化操作返回新的RDD,行動(dòng)操作返回具體數(shù)據(jù)類型。
先看看兩個(gè)具體的行動(dòng)操作:統(tǒng)計(jì)和取第一行
Scale> textFile.count()
Res1: Long =99
scala>textFile.first()
res2: String= # Apache Spark
在看看轉(zhuǎn)化操作:
Scale>vallinesWithSpark = textFile.filter(line => line.contains("Spark"))
linesWithSpark:org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[2] at filter at <console>:26
Scale> textFile.filter(line=> line.contains("Spark")).count()
res3: Long =19
簡(jiǎn)單操作可參考:https://spark.apache.org/docs/latest/quick-start.htmlb
3、Java開(kāi)發(fā)Spark
為避免學(xué)習(xí)Scale語(yǔ)言,在Eclipse上用java開(kāi)發(fā)。
1)Maven要升級(jí)到3.3.9版本。
卸載原來(lái)的版本:
#apt-getautoremove maven
安裝新版本:
cd~/Downloads
wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
sudo mkdir-p /usr/local/apache-maven
sudo mvapache-maven-3.3.9-bin.tar.gz /usr/local/apache-maven
cd/usr/local/apache-maven
sudo tar-xzvf apache-maven-3.3.9-bin.tar.gz
配置環(huán)境變量/etc/profile
#vi/etc/profile
尾部加入:
??? export M2_HOME=/usr/local/apache-maven/apache-maven-3.3.9
exportM2=$M2_HOME/bin
exportMAVEN_OPTS="-Xms256m -Xmx512m"
exportPATH=$M2:$PATH
#source /etc/profile
#mvn --version
Apache Maven 3.3.9
2)編譯spark的jar包
官網(wǎng)下載源碼spark-2.0.1.tgz并解壓到spark-2.0.1。在ubuntu14用Maven編譯。
進(jìn)入spark-2.0.1目錄執(zhí)行mvn package編譯生成jar文件。
#build/mvn-DskipTests clean package
編譯后進(jìn)入core/target目錄提取jar包spark-core_2.11-2.0.1.jar,開(kāi)發(fā)時(shí)需要其他功能再引入spark相關(guān)jar包。暫不使用HDFS集群,所以不添加一個(gè)hadoop-client依賴。
下載已編譯spark-2.0.1-bin-hadoop2.7.tgz內(nèi)jars目錄內(nèi)也可以找到相關(guān)jar包。
3)工程實(shí)例
Java工程中引入spark-core_2.11-2.0.1.jar、scala-library-2.11.8.jar、spark-sql_2.11-2.0.1.jar、scala-reflect-2.11.8.jar,實(shí)現(xiàn)wordcount案例。代碼可參考examples里,eclipse里export輸出skwc.jar。
提交執(zhí)行:
bin/spark-submit--class sk.rdd.JavaWordCount --master local /mnt/skwc.jar/home/spark/README.md
4、總結(jié)
初步了解Spark平臺(tái),后續(xù)根據(jù)需要:
1)深入學(xué)習(xí)RDD操作和Spark SQL及所支持的各類數(shù)據(jù)輸入和輸出格式;
2)部署Spark分布式環(huán)境并調(diào)優(yōu)性能,獨(dú)立資源管理器和Meso、Yarn管理器;
3)掌握Spark Streaming實(shí)時(shí)流式處理框架;
4)Hadoop集成,含hafs文件系統(tǒng)和Yarn集群管理器集成;
5)應(yīng)用上需要重點(diǎn)掌握MLib機(jī)器學(xué)習(xí)庫(kù)。
總結(jié)
以上是生活随笔為你收集整理的离线轻量级大数据平台Spark之单机部署及Java开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 算法导论之单源最短路径
- 下一篇: 算法导论之每对顶点间的最短路径