自己寫(xiě)的Spark入門(mén)實(shí)戰(zhàn)教程,適合于有一定hadoop和數(shù)據(jù)分析經(jīng)驗(yàn)的朋友。
Spark簡(jiǎn)介
Spark是一個(gè)開(kāi)源的計(jì)算框架平臺(tái),使用該平臺(tái),數(shù)據(jù)分析程序可自動(dòng)分發(fā)到集群中的不同機(jī)器中,以解決大規(guī)模數(shù)據(jù)快速計(jì)算的問(wèn)題,同時(shí)它還向上提供一個(gè)優(yōu)雅的編程范式,使得數(shù)據(jù)分析人員通過(guò)編寫(xiě)類(lèi)似于本機(jī)的數(shù)據(jù)分析程序即可實(shí)現(xiàn)集群并行計(jì)算。
Spark項(xiàng)目由多個(gè)緊密集成的組件組成。
核心是Spark Core組件
,它實(shí)現(xiàn)了Spark的基本功能,包括:任務(wù)調(diào)度、內(nèi)存管理、錯(cuò)誤恢復(fù)、與存儲(chǔ)系統(tǒng)交互等模塊,特別的,Spark Core還定義了彈性分布式數(shù)據(jù)集(RDD)的API,是Spark內(nèi)存計(jì)算與并行計(jì)算的主要編程抽象。在Spark Core上有一系列軟件棧,用于滿(mǎn)足了各種不同數(shù)據(jù)分析計(jì)算任務(wù)需求,包括連接關(guān)系型數(shù)據(jù)庫(kù)或Hadoop Hive的SQL/HQL的查詢(xún)組件Spark SQL,對(duì)實(shí)時(shí)數(shù)據(jù)進(jìn)行流式計(jì)算的組件Spark Steaming,支持常見(jiàn)機(jī)器學(xué)習(xí)算法并行計(jì)算組件MLlib,支持并行圖計(jì)算組件GraphX等。
為了進(jìn)一步支持在數(shù)千個(gè)計(jì)算節(jié)點(diǎn)上的伸縮計(jì)算,Spark Core底層支持在各種集群管理器上運(yùn)行,包括Hadoop YARN、Apache Mesos,或者Spark自帶的Standalone獨(dú)立調(diào)度器。
Spark部署
安裝Spark比較簡(jiǎn)單,只要在機(jī)器上配置好最新版JAVA環(huán)境,下載編譯好的Spark軟件包后即可在本地運(yùn)行。當(dāng)然,也可以根據(jù)具體環(huán)境,使用Maven編譯需要的Spark功能。
Spark部署有兩種方式,一是本地部署,二是集群部署。前者只需啟動(dòng)本地的交互式環(huán)境spark-shell.sh腳本即可,常用在本機(jī)快速程序測(cè)試,后者的應(yīng)用場(chǎng)景更多些,具體根據(jù)集群環(huán)境不同,可部署在簡(jiǎn)易的Spark獨(dú)立調(diào)度集群上、部署在Hadoop YARN集群上、或部署在A(yíng)pache Mesos上等。
其中,Spark自帶的獨(dú)立調(diào)度器是最簡(jiǎn)單實(shí)現(xiàn)Spark集群環(huán)境的一種方式,只需在多臺(tái)聯(lián)網(wǎng)計(jì)算機(jī)上安裝好Spark,然后在其中一臺(tái)啟動(dòng)集群管理器(通過(guò)start-master.sh腳本),然后再在其他計(jì)算機(jī)上啟動(dòng)工作節(jié)點(diǎn)(通過(guò)start-slave.sh腳本),并連接到管理器上即可。
Spark編程
使用Spark編程,需要先在本機(jī)安裝好Spark環(huán)境,然后啟動(dòng)Spark上下文管理器連接到本機(jī)(本地部署)或是集群上的集群管理器(集群部署),再使用Spark提供的抽象接口編程即可。
支持Spark的原生語(yǔ)言是Scala,一種支持JVM的腳本語(yǔ)言,可以避免其他語(yǔ)言在做數(shù)據(jù)轉(zhuǎn)化過(guò)程的性能或信息丟失。但隨著Spark項(xiàng)目的不斷完善,使用Python和PySpark包、或者R和SparkR包進(jìn)行Spark編程也都是不錯(cuò)的選擇。
不論使用何種編程語(yǔ)言,使用Spark進(jìn)行數(shù)據(jù)分析的關(guān)鍵在于掌握Spark抽象的編程范式,其基本流程包括4步:
初始化SparkContext
。SparkContext即是Spark上下文管理器(也稱(chēng)為驅(qū)動(dòng)器程序),它主要負(fù)責(zé)向Spark工作節(jié)點(diǎn)上發(fā)送指令并獲得計(jì)算結(jié)果,但數(shù)據(jù)分析人員無(wú)需關(guān)注具體細(xì)節(jié),只需使用SparkContext接口編程即可。創(chuàng)建RDD
。彈性分布數(shù)據(jù)集RDD是Spark在多機(jī)進(jìn)行并行計(jì)算的核心數(shù)據(jù)結(jié)構(gòu),因此使用Spark進(jìn)行數(shù)據(jù)分析,首先需使用SparkContext將外部數(shù)據(jù)讀入到Spark集群內(nèi)。設(shè)計(jì)數(shù)據(jù)轉(zhuǎn)化操作
。即操作的結(jié)果是返回一個(gè)新的RDD,即在圖計(jì)算中只是一個(gè)中間節(jié)點(diǎn)。類(lèi)比于Hadoop的Map()映射算子,但又不僅于此,Spark還支持filter()過(guò)濾算子、distinct()去重算子、sample()采樣算子,以及多個(gè)RDD集合的交差補(bǔ)并等集合操作。設(shè)計(jì)數(shù)據(jù)執(zhí)行操作
。即操作的結(jié)果向SparkContext返回結(jié)果,或者將結(jié)果寫(xiě)入外部操作系統(tǒng)。類(lèi)比于Hadoop的Reduce()算子,按某函數(shù)操作兩個(gè)數(shù)據(jù)并返回一個(gè)同類(lèi)型的數(shù)據(jù),此外Spark還支持collect()直接返回結(jié)果算子、count()計(jì)數(shù)算子、take()/top()返回部分?jǐn)?shù)據(jù)算子、foreach()迭代計(jì)算算子等操作。Spark編程范式的本質(zhì)是有向無(wú)環(huán)圖方式的惰性計(jì)算
,即當(dāng)使用上述方式進(jìn)行編程后,Spark將自動(dòng)將上述RDD和轉(zhuǎn)化算子轉(zhuǎn)換為有向無(wú)環(huán)圖的數(shù)據(jù)工作流,只有當(dāng)觸發(fā)執(zhí)行算子時(shí),才按需進(jìn)行數(shù)據(jù)工作流的計(jì)算。此外,為進(jìn)一步提高計(jì)算效率,Spark默認(rèn)將在內(nèi)存中執(zhí)行,并自動(dòng)進(jìn)行內(nèi)存分配管理,當(dāng)然分析人員也可根據(jù)需求通過(guò)persist()算子將中間步驟數(shù)據(jù)顯式的將內(nèi)存數(shù)據(jù)持久化到磁盤(pán)中,以方便調(diào)試或復(fù)用。在R環(huán)境下使用Spark實(shí)例
最新版的RStudio已經(jīng)較完整的集成了Spark數(shù)據(jù)分析功能,可以在SparkR官方擴(kuò)展接口基礎(chǔ)上更方便的使用Spark,主要需要安裝兩個(gè)包,分別是sparklyr和dplyr。其中,sparklyr包提供了更簡(jiǎn)潔易用的Spark R編程接口,dplyr包提供了一個(gè)語(yǔ)法可擴(kuò)展的數(shù)據(jù)操作接口,支持與主流SQL/NoSQL數(shù)據(jù)庫(kù)連接,同時(shí)使數(shù)據(jù)操作與數(shù)據(jù)集數(shù)據(jù)結(jié)構(gòu)解耦合,并且和Spark原生算子可基本對(duì)應(yīng)。
若第一次運(yùn)行,先在本機(jī)安裝必要的包和Spark環(huán)境:
之后運(yùn)行下面的小例子,可以發(fā)現(xiàn),除了需要初始化SparkContext、導(dǎo)入RDD數(shù)據(jù)和導(dǎo)出數(shù)據(jù)外,其他數(shù)據(jù)處理操作都與在本機(jī)做數(shù)據(jù)分析是一樣的。
此外,除了dplyr接口外,sparklyr還封裝了一套特征工程和常用機(jī)器學(xué)習(xí)算法,足以滿(mǎn)足80%常見(jiàn)的數(shù)據(jù)分析與挖掘工作,至于剩余的20%定制算法或是流處理、圖計(jì)算等任務(wù),便需要了解更多高階的Spark接口來(lái)實(shí)現(xiàn)了。
區(qū)別就是兩者所表達(dá)的中文意思是不一樣,具體的不同如下
spark rs中文意思是瑞豹Spark RS 全新公路車(chē)
spark sport中文意思是破風(fēng)公路車(chē),又稱(chēng)氣動(dòng)公路車(chē),是經(jīng)過(guò)空氣動(dòng)力學(xué)優(yōu)化的公路車(chē),擁有更小的風(fēng)阻、更加整合的零件搭配、更加隱蔽的走線(xiàn)方式。
前者要好一些,與后者相比,前者的像素更加高一些。這兩部產(chǎn)品的發(fā)布時(shí)間很接近,他們的處理器也是同一個(gè)性能的處理器,使用起來(lái)沒(méi)有很大差距,但是與后者相比。
前者的攝像頭使用的是最新的傳感器,它拍照的能力更加強(qiáng),拍出來(lái)的照片也更加清晰。綜合來(lái)說(shuō)前者要好一些,它的價(jià)格也與后者差不多。。
1)過(guò)去整個(gè)業(yè)界對(duì)大數(shù)據(jù)的分析的技術(shù)棧的Pipeline一般分為以下兩種方式:a)Data Source -> HDFS -> MR/Hive/Spark(相當(dāng)于ETL)-> HDFS Parquet -> Spark SQL/Impala -> ResultService(可以放在DB中,也有可能被通過(guò)JDBC/ODBC來(lái)作為數(shù)據(jù)服務(wù)使用);b)Data Source -> Real timeupdate data to HBase/DB -> Export to Parquet -> Spark SQL/Impala -> ResultService(可以放在DB中,也有可能被通過(guò)JDBC/ODBC來(lái)作為數(shù)據(jù)服務(wù)使用);上述的第二種方式完全可以通過(guò)Kafka+Spark Streaming+Spark SQL(內(nèi)部也強(qiáng)烈建議采用Parquet的方式來(lái)存儲(chǔ)數(shù)據(jù))的方式取代2)期待的方式:DataSource -> Kafka -> Spark Streaming -> Parq
1、spark dataframe是一種以 RDD 為基礎(chǔ)的分布式數(shù)據(jù)集,是一種特殊的RDD,是一個(gè)分布式的表,類(lèi)似于傳統(tǒng)數(shù)據(jù)庫(kù)中的二維表格。
2、spark dataframe與RDD的主要區(qū)別在于,前者帶有schema元信息,即spark dataframe所表示的二維表數(shù)據(jù)集的每一列都帶有名稱(chēng)和類(lèi)型。
spark集群的啟動(dòng)流程:
(1)、創(chuàng)建Master對(duì)象,啟動(dòng)了一條Master進(jìn)程。然后,執(zhí)行preStart生命周期方法,開(kāi)啟一個(gè)定時(shí)器定期檢測(cè)超時(shí)的worker節(jié)點(diǎn);如果發(fā)現(xiàn)超時(shí)的worker節(jié)點(diǎn),則將其移除。
(2)、加載slaves文件,啟動(dòng)worker節(jié)點(diǎn)。
(3)、worker節(jié)點(diǎn)啟動(dòng)后,開(kāi)始向master注冊(cè)。
(4)、master將worker發(fā)來(lái)的注冊(cè)信息會(huì)在內(nèi)存和磁盤(pán)保存,然后響應(yīng)一個(gè)注冊(cè)成功的masterUrl
(5)、worker收到masterUrl后,開(kāi)始與master建立心跳連接;定期向master發(fā)送心跳。
spark 火花,火星例句:A cigarette spark started the fire. 香煙的火星引起這場(chǎng)火災(zāi)。sparkle 閃耀,閃光例句:People always mention the sparkle of her eyes. 人們總是說(shuō)她的眼睛炯炯有神。
Spark分區(qū)原則及方法
spark分區(qū)的一個(gè)分區(qū)原則:盡可能是得分區(qū)的個(gè)數(shù)等于集群核心數(shù)目
下面我們僅討論Spark默認(rèn)的分區(qū)個(gè)數(shù),這里分別就parallelize和textFile具體分析其默認(rèn)的分區(qū)數(shù)
無(wú)論是本地模式、Standalone模式、YARN模式或Mesos模式,我們都可以通過(guò)spark.default.parallelism來(lái)配置其默認(rèn)分區(qū)個(gè)數(shù),若沒(méi)有設(shè)置該值,則根據(jù)不同的集群環(huán)境確定該值
本地模式:默認(rèn)為本地機(jī)器的CPU數(shù)目,若設(shè)置了local[N],則默認(rèn)為N
Apache Mesos:默認(rèn)的分區(qū)數(shù)為8
Standalone或YARN:默認(rèn)取集群中所有核心數(shù)目的總和,或者2,取二者的較大值。對(duì)于parallelize來(lái)說(shuō),沒(méi)有在方法中的指定分區(qū)數(shù),則默認(rèn)為spark.default.parallelism,對(duì)于textFile來(lái)說(shuō),沒(méi)有在方法中的指定分區(qū)數(shù),則默認(rèn)為min(defaultParallelism,2),而defaultParallelism對(duì)應(yīng)的就是spark.default.parallelism。如果是從hdfs上面讀取文件,其分區(qū)數(shù)為文件分片數(shù)(128MB/片)
大疆曉Spark鏡頭參數(shù)如下:
影像傳感器:1/2.3 英寸 CMOS;有效像素 1200 萬(wàn)
鏡頭:FOV 81.9 °;35 mm 格式等效焦距 25 mm;光圈 f/2.6(攝影范圍 2 m至無(wú)窮遠(yuǎn))
ISO范圍:視頻:100 - 3200;照片:100 - 1600
電子快門(mén)速度:2 - 1/8000 秒
照片尺寸:3968×2976;景深功能下:1440×1080;全景(廣角)功能下:2300×1280;全景(豎拍)功能下:960×1280
照片拍攝模式:?jiǎn)螐埮臄z;多張連拍(BURST):3 張;自動(dòng)包圍曝光(AEB):3 張 @0.7EV 步長(zhǎng);定時(shí)拍攝(間隔:2/3/5/7/10/15/20/30/60 s)
錄像分辨率:FHD:1920×1080 30p
視頻最大碼流:24 Mbps
支持文件系統(tǒng):FAT32
圖片格式:JPEG
視頻格式:MP4(MPEG-4 AVC/H.264)
大疆曉Spark全部參數(shù)鏈接
Spark的驅(qū)動(dòng)器節(jié)點(diǎn),負(fù)責(zé)運(yùn)行Spark程序中的main方法,執(zhí)行實(shí)際的代碼。Driver在Spark作業(yè)時(shí)主要負(fù)責(zé):
將用戶(hù)程序轉(zhuǎn)化為作業(yè)(job)。
負(fù)責(zé)Executor之間的任務(wù)(task)調(diào)度。
監(jiān)控Executor的執(zhí)行狀態(tài)。
通過(guò)UI展示運(yùn)行情況。
Spark應(yīng)用啟動(dòng)時(shí),Executor同時(shí)被啟動(dòng),并且伴隨著Spark程序的生命周期而存在。如果有Executor節(jié)點(diǎn)發(fā)生了故障,程序也不會(huì)停止運(yùn)行,而是將出錯(cuò)的Executor節(jié)點(diǎn)上的任務(wù)調(diào)度到其他Executor節(jié)點(diǎn)運(yùn)行。