Spark簡(jiǎn)介
Spark是基于內(nèi)存的分布式計(jì)算框架。在迭代計(jì)算的場(chǎng)景下,數(shù)據(jù)處理過(guò)程中的數(shù)據(jù)可以存儲(chǔ)在內(nèi)存中,提供了比MapReduce高10到100倍的計(jì)算能力。Spark可以使用HDFS作為底層存儲(chǔ),使用戶(hù)能夠快速地從MapReduce切換到Spark計(jì)算平臺(tái)上去。Spark提供一站式數(shù)據(jù)分析能力,包括小批量流式處理、離線批處理、SQL查詢(xún)、數(shù)據(jù)挖掘等,用戶(hù)可以在同一個(gè)應(yīng)用中無(wú)縫結(jié)合使用這些能力。
Spark的特點(diǎn)如下:
- 通過(guò)分布式內(nèi)存計(jì)算和DAG(無(wú)回路有向圖)執(zhí)行引擎提升數(shù)據(jù)處理能力,比MapReduce性能高10倍到100倍。
- 提供多種語(yǔ)言開(kāi)發(fā)接口(Scala/Java/Python),并且提供幾十種高度抽象算子,可以很方便構(gòu)建分布式的數(shù)據(jù)處理應(yīng)用。
- 結(jié)合SQL、Streaming等形成數(shù)據(jù)處理?xiàng)?,提供一站式?shù)據(jù)處理能力。
- 支持契合Hadoop生態(tài)環(huán)境,Spark應(yīng)用可以運(yùn)行在Standalone、Mesos或者YARN上,能夠接入HDFS、HBase、Hive等多種數(shù)據(jù)源,支持MapReduce程序平滑轉(zhuǎn)接。
Spark結(jié)構(gòu)介紹
|
模塊名稱(chēng)
|
描述
|
|---|---|
Cluster Manager |
集群管理器,管理集群中的資源。Spark支持多種集群管理器,Spark自帶的Standalone集群管理器、Mesos或YARN。Spark集群默認(rèn)采用YARN模式。 |
Application |
Spark應(yīng)用,由一個(gè)Driver Program和多個(gè)Executor組成。 |
Deploy Mode |
部署模式,分為cluster和client模式。cluster模式下,Driver會(huì)在集群內(nèi)的節(jié)點(diǎn)運(yùn)行;而在client模式下,Driver在客戶(hù)端運(yùn)行(集群外)。 |
Driver Program |
是Spark應(yīng)用程序的主進(jìn)程,運(yùn)行Application的main()函數(shù)并創(chuàng)建SparkContext。負(fù)責(zé)應(yīng)用程序的解析、生成Stage并調(diào)度Task到Executor上。通常SparkContext代表Driver Program。 |
Executor |
在Work Node上啟動(dòng)的進(jìn)程,用來(lái)執(zhí)行Task,管理并處理應(yīng)用中使用到的數(shù)據(jù)。一個(gè)Spark應(yīng)用一般包含多個(gè)Executor,每個(gè)Executor接收Driver的命令,并執(zhí)行一到多個(gè)Task。 |
Worker Node |
集群中負(fù)責(zé)啟動(dòng)并管理Executor以及資源的節(jié)點(diǎn)。 |
Job |
一個(gè)Action算子(比如collect算子)對(duì)應(yīng)一個(gè)Job,由并行計(jì)算的多個(gè)Task組成。 |
Stage |
每個(gè)Job由多個(gè)Stage組成,每個(gè)Stage是一個(gè)Task集合,由DAG分割而成。 |
Task |
承載業(yè)務(wù)邏輯的運(yùn)算單元,是Spark平臺(tái)上可執(zhí)行的最小工作單元。一個(gè)應(yīng)用根據(jù)執(zhí)行計(jì)劃以及計(jì)算量分為多個(gè)Task。 |
Spark原理及相關(guān)介紹
Spark原理
Spark的應(yīng)用運(yùn)行結(jié)構(gòu)如下圖。
運(yùn)行流程如下:
1、應(yīng)用程序(Application)是作為一個(gè)進(jìn)程的集合運(yùn)行在集群上的,由Driver進(jìn)行協(xié)調(diào)。
2、在運(yùn)行一個(gè)應(yīng)用時(shí),Driver會(huì)去連接集群管理器(Standalone、Mesos、YARN)申請(qǐng)運(yùn)行Executor資源,并啟動(dòng)ExecutorBackend。然后由集群管理器在不同的應(yīng)用之間調(diào)度資源。Driver同時(shí)會(huì)啟動(dòng)應(yīng)用程序DAG調(diào)度、Stage劃分、Task生成。
3、然后Spark會(huì)把應(yīng)用的代碼(傳遞給SparkContext的JAR或者Python定義的代碼)發(fā)送到Executor上。
4、所有的Task執(zhí)行完成后,用戶(hù)的應(yīng)用程序運(yùn)行結(jié)束。
Spark Streaming
Spark Streaming是一種構(gòu)建在Spark上的實(shí)時(shí)計(jì)算框架,擴(kuò)展了Spark處理大規(guī)模流式數(shù)據(jù)的能力。當(dāng)前Spark支持兩種數(shù)據(jù)處理方式:Direct Streaming和Receiver方式。
SparkSQL和DataSet
SparkSQL是Spark中用于結(jié)構(gòu)化數(shù)據(jù)處理的模塊。在Spark應(yīng)用中,可以無(wú)縫地使用SQL語(yǔ)句亦或是DataSet API對(duì)結(jié)構(gòu)化數(shù)據(jù)進(jìn)行查詢(xún)。
SparkSQL以及DataSet還提供了一種通用的訪問(wèn)多數(shù)據(jù)源的方式,可訪問(wèn)的數(shù)據(jù)源包括Hive、CSV、Parquet、ORC、JSON和JDBC數(shù)據(jù)源,這些不同的數(shù)據(jù)源之間也可以實(shí)現(xiàn)互相操作。SparkSQL復(fù)用了Hive的前端處理邏輯和元數(shù)據(jù)處理模塊,使用SparkSQL可以直接對(duì)已有的Hive數(shù)據(jù)進(jìn)行查詢(xún)。
另外,SparkSQL還提供了諸如API、CLI、JDBC等諸多接口,對(duì)客戶(hù)端提供多樣接入形式。
SparkSession
SparkSession是Spark編程的統(tǒng)一API,也可看作是讀取數(shù)據(jù)的統(tǒng)一入口。SparkSession提供了一個(gè)統(tǒng)一的入口點(diǎn)來(lái)執(zhí)行以前分散在多個(gè)類(lèi)中的許多操作,并且還為那些較舊的類(lèi)提供了訪問(wèn)器方法,以實(shí)現(xiàn)最大的兼容性。
Structured Streaming
Structured Streaming是構(gòu)建在Spark SQL引擎上的流式數(shù)據(jù)處理引擎,用戶(hù)可以使用Scala、Java、Python或R中的Dataset/DataFrame API進(jìn)行流數(shù)據(jù)聚合運(yùn)算、按事件時(shí)間窗口計(jì)算、流流Join等操作。當(dāng)流數(shù)據(jù)連續(xù)不斷的產(chǎn)生時(shí),Spark SQL將會(huì)增量的、持續(xù)不斷的處理這些數(shù)據(jù)并將結(jié)果更新到結(jié)果集中。同時(shí),系統(tǒng)通過(guò)checkpoint和Write Ahead Logs確保端到端的完全一次性容錯(cuò)保證。
Structured Streaming的核心是將流式的數(shù)據(jù)看成一張不斷增加的數(shù)據(jù)庫(kù)表,這種流式的數(shù)據(jù)處理模型類(lèi)似于數(shù)據(jù)塊處理模型,可以把靜態(tài)數(shù)據(jù)庫(kù)表的一些查詢(xún)操作應(yīng)用在流式計(jì)算中,Spark執(zhí)行標(biāo)準(zhǔn)的SQL查詢(xún),從不斷增加的無(wú)邊界表中獲取數(shù)據(jù)。
Spark與其他組件的關(guān)系
-
Spark和HDFS的配合關(guān)系
通常,Spark中計(jì)算的數(shù)據(jù)可以來(lái)自多個(gè)數(shù)據(jù)源,如Local File、HDFS等。最常用的是HDFS,用戶(hù)可以一次讀取大規(guī)模的數(shù)據(jù)進(jìn)行并行計(jì)算。在計(jì)算完成后,也可以將數(shù)據(jù)存儲(chǔ)到HDFS。
分解來(lái)看,Spark分成控制端(Driver)和執(zhí)行端(Executor)??刂贫素?fù)責(zé)任務(wù)調(diào)度,執(zhí)行端負(fù)責(zé)任務(wù)執(zhí)行。
通常,Spark中計(jì)算的數(shù)據(jù)可以來(lái)自多個(gè)數(shù)據(jù)源,如Local File、HDFS等。最常用的是HDFS,用戶(hù)可以一次讀取大規(guī)模的數(shù)據(jù)進(jìn)行并行計(jì)算。在計(jì)算完成后,也可以將數(shù)據(jù)存儲(chǔ)到HDFS。
分解來(lái)看,Spark分成控制端(Driver)和執(zhí)行端(Executor)??刂贫素?fù)責(zé)任務(wù)調(diào)度,執(zhí)行端負(fù)責(zé)任務(wù)執(zhí)行。
-
Spark和YARN的配合關(guān)系
Spark的計(jì)算調(diào)度方式,可以通過(guò)YARN的模式實(shí)現(xiàn)。Spark共享YARN集群提供豐富的計(jì)算資源,將任務(wù)分布式的運(yùn)行起來(lái)。Spark on YARN分兩種模式:YARN Cluster和YARN Client。
Spark的計(jì)算調(diào)度方式,可以通過(guò)YARN的模式實(shí)現(xiàn)。Spark共享YARN集群提供豐富的計(jì)算資源,將任務(wù)分布式的運(yùn)行起來(lái)。Spark on YARN分兩種模式:YARN Cluster和YARN Client。