一垮刹、Spark是什么
Spark是Apache下的一個用于大規(guī)模數(shù)據(jù)處理的統(tǒng)一分析引擎,Unified engine for large-scale data analytics.
Spark還是一個支持多語言的(Python培他、SQL、Scala遗座、Java靶壮、R),可以在單節(jié)點(diǎn)或者集群上用作數(shù)據(jù)工程员萍、數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)的內(nèi)存計算引擎腾降。
Spark借鑒了MapReduce的思想發(fā)展而來,保留了其分布式并行計算的優(yōu)點(diǎn)碎绎,并改進(jìn)了其缺陷螃壤,讓中間數(shù)據(jù)存儲在內(nèi)存中從而提高了運(yùn)行速度,并提供了豐富的操作數(shù)據(jù)的API筋帖,提升了開發(fā)的效率奸晴。
二、為什么要使用Spark
談起Spark日麸,就不得不對比Hadoop寄啼,相比Hadoop而言,Spark具有更大的優(yōu)勢代箭,但是它并不能完全替代Hadoop墩划,如下是它們之間的一個簡單對比:
Hadoop | Spark | |
---|---|---|
類型 | 是大數(shù)據(jù)基礎(chǔ)平臺,包括HDFS存儲嗡综、MapReduce計算乙帮、Yarn資源調(diào)度 | 僅是一個計算框架 |
場景 | 基于磁盤的海量數(shù)據(jù)批處理場景 | 基于內(nèi)存的海量數(shù)據(jù)批處理、流計算 |
價格 | 對機(jī)器要求低极景,價格低 | 對機(jī)器內(nèi)存要求高察净,價格貴 |
編程 | MR框架,API較為底層盼樟,算法適應(yīng)性低氢卡,編程較為復(fù)雜 | RDD組成DAG的模式,API較為高層晨缴,方便編程 |
存儲 | 中間計算結(jié)果存在HDFS的磁盤上译秦,延遲高 | 中間計算結(jié)果存在內(nèi)存中,延遲低 |
運(yùn)行 | Task以進(jìn)程方式維護(hù),任務(wù)啟動慢 | Task以線程方式維護(hù)诀浪,任務(wù)啟動快,可批量創(chuàng)建提高并行能力 |
總結(jié)下來延都,Spark只是一個計算框架雷猪,頂多用來替換Hadoop中的MapReduce計算框架,而HDFS和Yarn仍然是大數(shù)據(jù)技術(shù)棧的主流晰房。
Spark的四大特點(diǎn)是:
速度快求摇,由于是基于DAG的內(nèi)存計算框架,速度比Hadoop要快100倍殊者;
易于使用与境,支持Python、SQL猖吴、Scala摔刁、Java、R在內(nèi)的主流數(shù)據(jù)分析語言海蔽,用戶涵蓋面大共屈,API使用簡潔高效;
-
通用性強(qiáng)党窜,支持對接多種數(shù)據(jù)源拗引,比如LocalFS、HDFS幌衣、Hive矾削、Text、CSV豁护、Json等等哼凯;
Spark支持多種數(shù)據(jù)源
而且在Spark核心的基礎(chǔ)上,還提供了SparkSQL楚里、StructedStreaming挡逼、SparkStreaming、MLlib腻豌、GraphX等工具庫家坎,可以在一個應(yīng)用里面無縫切換使用;
- 運(yùn)行方式靈活吝梅,支持多種運(yùn)行方式虱疏,包括local、standalone苏携、Spark on Yarn做瞪、Mesos、Kubernetes、云平臺等等装蓬;
三著拭、Spark是如何工作的
我們在原先學(xué)習(xí)Yarn的時候,有提到過Yarn里面的角色:
- ResourceManager牍帚,負(fù)責(zé)整個集群的資源管理和調(diào)度儡遮;
- NodeManager,負(fù)責(zé)當(dāng)前節(jié)點(diǎn)的資源管理并監(jiān)控資源匯報給ResourceManager暗赶;
- ApplicationMaster鄙币,負(fù)責(zé)應(yīng)用任務(wù)的執(zhí)行和管理,一個應(yīng)用任務(wù)僅有一個AM蹂随,且運(yùn)行在節(jié)點(diǎn)的容器中十嘿;
- TaskContainer,負(fù)責(zé)具體任務(wù)的執(zhí)行岳锁,并匯報給AM绩衷,一個應(yīng)用任務(wù)會被拆分為多個Task,運(yùn)行在任意節(jié)點(diǎn)的容器中激率;
那么Spark想要實(shí)現(xiàn)計算任務(wù)和資源調(diào)度唇聘,那么也會擁有類似Yarn的角色和職能:
- Master,類似Yarn中的ResourceManager柱搜,管理整個集群中的資源和調(diào)度迟郎;在Spark on Yarn的模式下沒有Master,由Yarn的ResourceManager替代聪蘸;
- Worker宪肖,類似Yarn中的NodeManager,管理當(dāng)前節(jié)點(diǎn)的資源并向Master匯報健爬;在Spark on Yarn的模式下沒有Worker控乾,由Yarn的NodeManager替代;
- Driver娜遵,類似Yarn中的AM蜕衡,一個應(yīng)用任務(wù)對應(yīng)一個Driver,負(fù)責(zé)管理任務(wù)的執(zhí)行设拟;在Spark on Yarn的模式下慨仿,AM和Driver將會并存在節(jié)點(diǎn)的容器中;
- Executor纳胧,類似Yarn中的TaskContainer镰吆,也是以容器的形式負(fù)責(zé)具體任務(wù)的執(zhí)行;
四跑慕、Spark環(huán)境搭建
在搭建Spark不同的部署模式之前万皿,我們都需要做一些準(zhǔn)備工作摧找,在上面運(yùn)行方式的內(nèi)容中,我們介紹了6種牢硅,但是本文只介紹如下的2種最常見的蹬耘,其它的比如Standalone模式需要借助虛擬機(jī)實(shí)現(xiàn)集群,在企業(yè)中很少用到减余,而Mesos综苔、K8s、和云平臺的方式和Spark本身并無關(guān)系休里,就待以后再介紹赃承。
Spark的運(yùn)行依賴于Hadoop悴侵,因此我們需要準(zhǔn)備好:
- 服務(wù)器,從阿里云購買ECS服務(wù)器抓于,Local模式就買一臺浇借,Spark on Yarn集群模式就購買三臺;
- 操作系統(tǒng)巾遭,Linux CentOS7.5 X64闯估;
- JDK,配置好JDK環(huán)境骑素,確保
java -version
能執(zhí)行刚夺; - Hadoop,按照往期教程搭建單機(jī)或者集群模式的Hadoop環(huán)境阳距;
4.1 Local模式
Local模式即本地模式结借,是一種只能在開發(fā)和測試中使用的模式,因?yàn)槠浔举|(zhì)就是啟動一個JVM進(jìn)程咖熟,通過啟動多個線程來提供并行計算能力執(zhí)行多個Task任務(wù),其不能算是分布式的集群郭赐,不能用在生產(chǎn)環(huán)境确沸。Local模式分為:
- Local[n],n表示線程數(shù)观谦,通常n小于等于CPU核心數(shù)桨菜,可以充分利用CPU的計算能力,n不指定則默認(rèn)為1泻红;
- Local[*]霞掺,表示按照CPU最多的核心數(shù)設(shè)置線程數(shù);
在Local模式下缠劝,因?yàn)橹挥幸粋€進(jìn)程挤巡,所以Master、Worker和Driver角色就是其進(jìn)程本身喉恋,而且不會有Executor角色母廷,任務(wù)Task的執(zhí)行會由Driver啟動的多線程來完成并行計算;而且在同一時間氓鄙,只能執(zhí)行一個Spark應(yīng)用程序业舍。
我們能將下載好的Spark壓縮包放到/soft
目錄下并解壓縮升酣,下載可以從國內(nèi)鏡像源下載态罪,會快很多。
cd /soft
tar -zxvf spark-3.3.2-bin-hadoop3.tgz
然后我們設(shè)置Spark的環(huán)境變量:
vim /etc/profile
export SPARK_HOME=/root/soft/spark-3.3.2-bin-hadoop3
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
source /etc/profile
此時绩聘,我們就可以運(yùn)行和使用Spark應(yīng)用程序了:
# 運(yùn)行Spark自帶的示例程序——計算圓周率
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[2] \
/root/soft/spark-3.3.2-bin-hadoop3/examples/jars/spark-examples_2.12-3.3.2.jar \
20
INFO SparkContext: Running Spark version 3.3.2
......
INFO Utils: Successfully started service 'sparkDriver' on port 34697.
......
INFO Utils: Successfully started service 'SparkUI' on port 4040.
......
INFO Executor: Starting executor ID driver on host node1
......
INFO TaskSetManager: Starting task 0.0 in stage 0.0 (TID 0) (node1, executor driver, partition 0, PROCESS_LOCAL, 4 578 bytes) taskResourceAssignments Map()
INFO TaskSetManager: Starting task 1.0 in stage 0.0 (TID 1) (node1, executor driver, partition 1, PROCESS_LOCAL, 4 578 bytes) taskResourceAssignments Map()
......
# 打印出計算結(jié)果
Pi is roughly 3.1421555710777858
......
INFO SparkUI: Stopped Spark web UI at http://node1:4040
......
INFO SparkContext: Successfully stopped SparkContext
......
如上是執(zhí)行提交到Spark的應(yīng)用程序的模式凿菩,執(zhí)行完成Spark就退出了帜讲,其實(shí)Spark還是支持命令行模式,命令行模式有很多種会喝,比如:
- pyspark玩郊,python語言的命令行交互窗口译红;
- spark-shell兴溜,scala語言的命令行交互窗口;
- sparkR刨沦,R語言的命令行交互窗口膘怕;
- spark-sql挣柬,SQL語言的命令行交互窗口;
由于Spark本身就是使用scala實(shí)現(xiàn)的货岭,我們就使用spark-shell來體驗(yàn)一下命令行交互窗口的使用:
[root@node1 bin]# spark-shell
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
23/03/10 15:10:52 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Spark context Web UI available at http://node1:4040
Spark context available as 'sc' (master = local[*], app id = local-1678432255647).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 3.3.2
/_/
Using Scala version 2.12.15 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_351)
Type in expressions to have them evaluated.
Type :help for more information.
# 等待輸入scala命令
scala> sc.parallelize(Array(1,2,3,4,5)).map(x => x * 10).collect()
res0: Array[Int] = Array(10, 20, 30, 40, 50)
在使用命令行模式的時候,Spark守護(hù)進(jìn)程會一直存在髓堪,此時訪問4040端口就能看到Spark的一些信息,比如執(zhí)行器Executor驶沼、集群環(huán)境信息商乎、任務(wù)Job情況、Job執(zhí)行的Stage情況等鲜戒;
4.2 Spark onYarn模式
Spark on Yarn集群模式才是企業(yè)生產(chǎn)環(huán)境中最常使用的模式抹凳,由于至少要準(zhǔn)備三臺服務(wù)器,本教程暫時擱置該搭建過程失都,網(wǎng)上也有很多類似的教程幸冻,此處就先省略了洽损。Spark的驗(yàn)證可通過如下命令驗(yàn)證:
jps
844046 ResourceManager
3863790 RunJar
# Spark的Master角色
859128 Master
641310 Jps
# Spark的Worker角色
859973 Worker
504718 JobHistoryServer
3863616 RunJar
843665 SecondaryNameNode
846707 NameNode
894978 QuorumPeerMain
# 進(jìn)入scala命令交互模式
spark-shell --master yarn
......
scala> sc.parallelize(Array(1,2,3,4,5)).map(x => x * 10).collect()
res0: Array[Int] = Array(10, 20, 30, 40, 50)
# 提交代碼運(yùn)行
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
/root/soft/spark-3.3.2-bin-hadoop3/examples/jars/spark-examples_2.12-3.3.2.jar \
20
......
Pi is roughly 3.1421555710777858
集群Cluster模式:Driver在Yarn的容器中運(yùn)行碑定,提交任務(wù)的客戶端可能看不到太多日志信息,性能和網(wǎng)絡(luò)情況較好漫试,適合生產(chǎn)環(huán)境碘赖;
客戶端Client模式:Driver在提交任務(wù)的客戶端上運(yùn)行,方便打印日志秘车,但是網(wǎng)絡(luò)流量大叮趴,延遲會高权烧,適合開發(fā)和測試環(huán)境;
Spark on yarn的client妻率、cluster模式提交job流程及區(qū)別_spark on yarn client_java編程藝術(shù)的博客-CSDN博客