[TOC]
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供農(nóng)安企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、HTML5、小程序制作等業(yè)務(wù)。10年已為農(nóng)安眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。1、Spark Streaming,其實(shí)就是一種Spark提供的,對(duì)于大數(shù)據(jù),進(jìn)行實(shí)時(shí)計(jì)算的一種框架。它的底層,其實(shí),也是基于我們之前講解的Spark Core的?;镜挠?jì)算模型,還是基于內(nèi)存的大數(shù)據(jù)實(shí)時(shí)計(jì)算模型。而且,它的底層的核心組件還是我們?cè)赟park Core中經(jīng)常用到的RDD。
2、針對(duì)實(shí)時(shí)計(jì)算的特點(diǎn),在RDD之上,進(jìn)行了一層封裝,叫做DStream。其實(shí),學(xué)過了Spark SQL之后,你理解這種封裝就容易了。之前學(xué)習(xí)Spark SQL是不是也是發(fā)現(xiàn),它針對(duì)數(shù)據(jù)查詢這種應(yīng)用,提供了一種基于RDD之上的全新概念,DataFrame,但是,其底層還是基于RDD的。所以,RDD是整個(gè)Spark技術(shù)生態(tài)中的核心。
正如市面上存在眾多可用的流處理引擎,人們經(jīng)常詢問我們Spark Streaming有何獨(dú)特的優(yōu)勢(shì)?那么首先要說的就是Apache Spark在批處理以及流處理上提供了原生支持。這與別的系統(tǒng)不同之處在于其他系統(tǒng)的處理引擎要么只專注于流處理,要么只負(fù)責(zé)批處理且僅提供需要外部實(shí)現(xiàn)的流處理API接口而已。Spark 憑借其執(zhí)行引擎以及統(tǒng)一的編程模型可實(shí)現(xiàn)批處理與流處理,這就是與傳統(tǒng)流處理系統(tǒng)相比Spark Streaming所具備獨(dú)一無(wú)二的優(yōu)勢(shì)。尤其特別體現(xiàn)在以下四個(gè)重要部分:
1.能在故障報(bào)錯(cuò)與straggler的情況下迅速恢復(fù)狀態(tài);
2.更好的負(fù)載均衡與資源使用;
3.靜態(tài)數(shù)據(jù)集與流數(shù)據(jù)的整合和可交互查詢;
4.內(nèi)置豐富高級(jí)算法處理庫(kù)(SQL、機(jī)器學(xué)習(xí)、圖處理)
當(dāng)前分布式流處理管道執(zhí)行方式如下所述:
1、接收來自數(shù)據(jù)源的流數(shù)據(jù)(比如時(shí)日志、系統(tǒng)遙測(cè)數(shù)據(jù)、物聯(lián)網(wǎng)設(shè)備數(shù)據(jù)等等),處理成為數(shù)據(jù)攝取系統(tǒng),比如Apache Kafka、Amazon Kinesis等等。
2、在集群上并行處理數(shù)據(jù)。這也是設(shè)計(jì)流處理引擎的關(guān)鍵所在,我們將在下文中做出更細(xì)節(jié)性的討論。
3、輸出結(jié)果存放至下游系統(tǒng)(例如HBase、Cassandra, Kafka等等)。
為了處理這些數(shù)據(jù),大部分傳統(tǒng)的流處理系統(tǒng)被設(shè)計(jì)為連續(xù)算子 模型,其工作方式如下:
1、有一系列的工作節(jié)點(diǎn),每組節(jié)點(diǎn)運(yùn)行一至多個(gè)連續(xù)算子;
2、對(duì)于流數(shù)據(jù),每個(gè)連續(xù)算子一次處理一條記錄,并且將記錄傳輸給管道中別的算子;
3、源算子從攝入系統(tǒng)接收數(shù)據(jù),接著輸出到下游系統(tǒng)。
1、連續(xù)算子是一種較為簡(jiǎn)單、自然的模型。然而,隨著如今大數(shù)據(jù)時(shí)代下,數(shù)據(jù)規(guī)模的不斷擴(kuò)大以及越來越復(fù)雜的實(shí)時(shí)分析,這個(gè)傳統(tǒng)的架構(gòu)也面臨著嚴(yán)峻的挑戰(zhàn)。因此,我們?cè)O(shè)計(jì)Spark Streaming就是為了解決如下幾點(diǎn)需求:
2、故障迅速恢復(fù)–數(shù)據(jù)越龐大,出現(xiàn)節(jié)點(diǎn)故障與節(jié)點(diǎn)運(yùn)行變慢(例如straggler)情況的概率也越來越高。因此,系統(tǒng)要是能夠?qū)崟r(shí)給出結(jié)果,就必須能夠自動(dòng)修復(fù)故障。可惜在傳統(tǒng)流處理系統(tǒng)中,在這些工作節(jié)點(diǎn)靜態(tài)分配的連續(xù)算子要迅速完成這項(xiàng)工作仍然是個(gè)挑戰(zhàn);
3、負(fù)載均衡–在連續(xù)算子系統(tǒng)中工作節(jié)點(diǎn)間不平衡分配加載會(huì)造成部分節(jié)點(diǎn)性能的bottleneck(運(yùn)行瓶頸)。這些問題更常見于大規(guī)模數(shù)據(jù)與動(dòng)態(tài)變化的工作量面前。為了解決這個(gè)問題,那么要求系統(tǒng)必須能夠根據(jù)工作量動(dòng)態(tài)調(diào)整節(jié)點(diǎn)間的資源分配;
4、統(tǒng)一的流處理與批處理以及交互工作–在許多用例中,與流數(shù)據(jù)的交互是很有必要的(畢竟所有流系統(tǒng)都將這置于內(nèi)存中)或者與靜態(tài)數(shù)據(jù)集結(jié)合(例如pre-computed model)。這些都很難在連續(xù)算子系統(tǒng)中實(shí)現(xiàn),當(dāng)系統(tǒng)動(dòng)態(tài)地添加新算子時(shí),并沒有為其設(shè)計(jì)臨時(shí)查詢功能,這樣大大的削弱了用戶與系統(tǒng)的交互能力。因此我們需要一個(gè)引擎能夠集成批處理、流處理與交互查詢;
5、高級(jí)分析(例如機(jī)器學(xué)習(xí)、SQL查詢等等)–一些更復(fù)雜的工作需要不斷學(xué)習(xí)和更新數(shù)據(jù)模型,或者利用SQL查詢流數(shù)據(jù)中最新的特征信息。因此,這些分析任務(wù)中需要有一個(gè)共同的集成抽象組件,讓開發(fā)人員更容易地去完成他們的工作。
6、為了解決這些要求,Spark Streaming使用了一個(gè)新的結(jié)構(gòu),我們稱之為discretized streams(離散化的流數(shù)據(jù)處理),它可以直接使用Spark引擎中豐富的庫(kù)并且擁有優(yōu)秀的故障容錯(cuò)機(jī)制。
1、Spark的運(yùn)行模式多種多樣,靈活多變,部署在單機(jī)上時(shí),既可以用本地模式運(yùn)行,也可以用偽分布式模式運(yùn)行;而當(dāng)以分布式集群的方式部署時(shí),也有眾多的運(yùn)行模式可供選擇,這取決于集群的實(shí)際情況,底層的資源調(diào)度既可以依賴于外部的資源調(diào)度框架,也可以使用Spark內(nèi)建的Standalone模式。對(duì)于外部資源調(diào)度框架的支持,目前的實(shí)現(xiàn)包括相對(duì)穩(wěn)定的Mesos模式,以及還在持續(xù)開發(fā)更新中的Hadoop YARN模式。
2、Spark Streaming是Spark Core API的一種擴(kuò)展,它可以用于進(jìn)行大規(guī)模、高吞吐量、容錯(cuò)的實(shí)時(shí)數(shù)據(jù)流的處理。它支持從很多種數(shù)據(jù)源中讀取數(shù)據(jù),比如Kafka、Flume、Twitter、ZeroMQ、Kinesis、ZMQ或者是TCP Socket。并且能夠使用類似高階函數(shù)的復(fù)雜算法來進(jìn)行數(shù)據(jù)處理,比如map、reduce、join和window。處理后的數(shù)據(jù)可以被保存到文件系統(tǒng)、數(shù)據(jù)庫(kù)、Dashboard等存儲(chǔ)中。
接收實(shí)時(shí)輸入數(shù)據(jù)流,然后將數(shù)據(jù)拆分成多個(gè)batch,比如每收集1秒的數(shù)據(jù)封裝為一個(gè)batch,然后將每個(gè)batch交給Spark的計(jì)算引擎進(jìn)行處理,最后會(huì)生產(chǎn)出一個(gè)結(jié)果數(shù)據(jù)流,其中的數(shù)據(jù),也是由一個(gè)一個(gè)的batch所組成的。
1、Spark Streaming提供了一種高級(jí)的抽象,叫做DStream,英文全稱為Discretized Stream,中文翻譯為“離散流”,它代表了一個(gè)持續(xù)不斷的數(shù)據(jù)流。DStream可以通過輸入數(shù)據(jù)源來創(chuàng)建,比如Kafka、Flume、ZMQ和Kinesis;也可以通過對(duì)其他DStream應(yīng)用高階函數(shù)來創(chuàng)建,比如map、reduce、join、window。
2、DStream的內(nèi)部,其實(shí)一系列持續(xù)不斷產(chǎn)生的RDD。RDD是Spark Core的核心抽象,即,不可變的,分布式的數(shù)據(jù)集。DStream中的每個(gè)RDD都包含了一個(gè)時(shí)間段內(nèi)的數(shù)據(jù)。
1、對(duì)DStream應(yīng)用的算子,比如map,其實(shí)在底層會(huì)被翻譯為對(duì)DStream中每個(gè)RDD的操作。比如對(duì)一個(gè)DStream執(zhí)行一個(gè)map操作,會(huì)產(chǎn)生一個(gè)新的DStream。但是,在底層,其實(shí)其原理為,對(duì)輸入DStream中每個(gè)時(shí)間段的RDD,都應(yīng)用一遍map操作,然后生成的新的RDD,即作為新的DStream中的那個(gè)時(shí)間段的一個(gè)RDD。底層的RDD的transformation操作。
2、還是由Spark Core的計(jì)算引擎來實(shí)現(xiàn)的。Spark Streaming對(duì)Spark Core進(jìn)行了一層封裝,隱藏了細(xì)節(jié),然后對(duì)開發(fā)人員提供了方便易用的高層次的API。
對(duì)比點(diǎn) | Storm | Spark Streaming | Flink |
---|---|---|---|
實(shí)時(shí)計(jì)算模型 | 純實(shí)時(shí),來一條數(shù)據(jù)處理一條 | 1、準(zhǔn)實(shí)時(shí),對(duì)一個(gè)時(shí)間段的RDD數(shù)據(jù)收集起來,一起處理 | 流式計(jì)算和批處理分別采用DataStream和DataSet |
實(shí)時(shí)計(jì)算延遲度 | 毫秒級(jí) | 秒級(jí) | 秒級(jí) |
吞吐量 | 低 | 高 | 高 |
事務(wù)機(jī)制 | 支持完善 | 支持,但不夠完善 | 支持,但不夠完善 |
健壯性/容錯(cuò)性 | ZK、Acker,很好 | CheckPoint,WAL一般 | CheckPoint一般 |
動(dòng)態(tài)調(diào)整并行度 | 支持 | 不支持 | 支持 |
運(yùn)行時(shí)同時(shí)支持流失和離線處理 | 不支持 | 支持 | 支持 |
成熟度 | 高 | 高 | 低 |
模型 | native | Micro-batching | native |
API | 組合式 | 聲明式 | 組合式 |
1、Spark Streaming絕對(duì)談不上比Storm、Flink優(yōu)秀。這兩個(gè)框架在實(shí)時(shí)計(jì)算領(lǐng)域中,都很優(yōu)秀,只是擅長(zhǎng)的細(xì)分場(chǎng)景并不相同。
2、Spark Streaming在吞吐量上要比Storm優(yōu)秀。
3、Storm在實(shí)時(shí)延遲度上,比Spark Streaming就好多了,前者是純實(shí)時(shí),后者是準(zhǔn)實(shí)時(shí)。而且,Storm的事務(wù)機(jī)制、健壯性/容錯(cuò)性、動(dòng)態(tài)調(diào)整并行度等特性,都要比Spark Streaming更加優(yōu)秀。
4、Spark Streaming,有一點(diǎn)是Storm絕對(duì)比不上的,就是:它位于Spark整個(gè)生態(tài)技術(shù)棧中,因此Spark Streaming可以和Spark Core、Spark SQL、Spark?。莚aphx無(wú)縫整合,換句話說,我們可以對(duì)實(shí)時(shí)處理出來的中間數(shù)據(jù),立即在程序中無(wú)縫進(jìn)行延遲批處理、交互式查詢等操作。這個(gè)特點(diǎn)大大增強(qiáng)了Spark Streaming的優(yōu)勢(shì)和功能。
1、建議在需要純實(shí)時(shí),不能忍受1秒以上延遲的場(chǎng)景下使用,比如實(shí)時(shí)計(jì)算系統(tǒng),要求純實(shí)時(shí)進(jìn)行交易和分析時(shí)。
2、在實(shí)時(shí)計(jì)算的功能中,要求可靠的事務(wù)機(jī)制和可靠性機(jī)制,即數(shù)據(jù)的處理完全精準(zhǔn),一條也不能多,一條也不能少,也可以考慮使用Storm,但是Spark Streaming也可以保證數(shù)據(jù)的不丟失。
3、如果我們需要考慮針對(duì)高峰低峰時(shí)間段,動(dòng)態(tài)調(diào)整實(shí)時(shí)計(jì)算程序的并行度,以大限度利用集群資源(通常是在小型公司,集群資源緊張的情況),我們也可以考慮用Storm
1、不滿足上述3點(diǎn)要求的話,我們可以考慮使用Spark Streaming來進(jìn)行實(shí)時(shí)計(jì)算。
2、考慮使用Spark Streaming最主要的一個(gè)因素,應(yīng)該是針對(duì)整個(gè)項(xiàng)目進(jìn)行宏觀的考慮,即,如果一個(gè)項(xiàng)目除了實(shí)時(shí)計(jì)算之外,還包括了離線批處理、交互式查詢、圖計(jì)算和MLIB機(jī)器學(xué)習(xí)等業(yè)務(wù)功能,而且實(shí)時(shí)計(jì)算中,可能還會(huì)牽扯到高延遲批處理、交互式查詢等功能,那么就應(yīng)該選Spark生態(tài),用Spark Core開發(fā)離線批處理,用Spark SQL開發(fā)交互式查詢,用Spark Streaming開發(fā)實(shí)時(shí)計(jì)算,三者可以無(wú)縫整合,給系統(tǒng)提供非常高的可擴(kuò)展性。
1.支持高吞吐、低延遲、高性能的流處理
2.支持帶有事件時(shí)間的窗口(Window)操作
3.支持有狀態(tài)計(jì)算的Exactly-once語(yǔ)義
4.支持高度靈活的窗口(Window)操作,支持基于time、count、session,以及data-driven的窗口操作
5.支持具有Backpressure功能的持續(xù)流模型
6.支持基于輕量級(jí)分布式快照(Snapshot)實(shí)現(xiàn)的容錯(cuò)
7.一個(gè)運(yùn)行時(shí)同時(shí)支持Batch on Streaming處理和Streaming處理
8.Flink在JVM內(nèi)部實(shí)現(xiàn)了自己的內(nèi)存管理
9.支持迭代計(jì)算
10.支持程序自動(dòng)優(yōu)化:避免特定情況下Shuffle、排序等昂貴操作,中間結(jié)果有必要進(jìn)行緩存
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。