學(xué)習(xí)流處理的基本概念、研究各種流處理架構(gòu)。
通過具體實(shí)例來研究Structured Streaming、深入理解流處理概念。
通過Spark Streaming創(chuàng)建并管理流作業(yè),使用其他Spark API與Spark Streaming集成。
學(xué)習(xí)Spark Streaming高級(jí)技巧,包括近似算法和機(jī)器學(xué)習(xí)算法。
將Apache Spark與其他流處理項(xiàng)目比較,包括Apache Storm、Apache Flink和Apache Kafka Streams。
前言
本書適合哪些讀者
本書針對(duì)專業(yè)的軟件從業(yè)人員,他們可能經(jīng)常與數(shù)據(jù)打交道,或者希望在流處理領(lǐng)域提高相應(yīng)的知識(shí)技能,或者已經(jīng)了解Apache Spark,又或者希望利用Apache Spark 來構(gòu)建流式應(yīng)用。
本書對(duì)于流處理背后的概念進(jìn)行了全面的介紹。這些概念是理解Apache Spark 兩種流式API(Structured Streaming 和Spark Streaming)的基礎(chǔ)。
對(duì)于這些API 我們會(huì)進(jìn)行深入研究,并對(duì)其特性、應(yīng)用詳細(xì)介紹,以及根據(jù)實(shí)踐經(jīng)驗(yàn)提供相應(yīng)建議。
除了介紹API 和實(shí)際應(yīng)用之外,我們還討論了流處理的高級(jí)技巧。
所有人都值得仔細(xì)閱讀這篇序言,只不過專業(yè)經(jīng)驗(yàn)更加豐富的讀者可能會(huì)從高級(jí)技巧的篇章中受益更多,并知道如何進(jìn)一步學(xué)習(xí)。
這里并未假定你所需的Spark 基礎(chǔ)知識(shí),但如果你對(duì)于Spark 數(shù)據(jù)處理不熟悉,需要注意本書的核心是Spark 流式API 及其功能。關(guān)于Spark 功能以及相關(guān)生態(tài)的基礎(chǔ)知識(shí),我們推薦Bill Chambers 和Matei Zaharia 所著的《Spark: The Definitive Guide》。
本書所使用的編程語言為Scala。雖然Spark 在Scala 之外還提供了Java、Python,以及R 語言的支持,但是我們?nèi)匀徽J(rèn)為Scala 是流式編程的首選語言。雖然很多代碼示例可以被翻譯為其他語言,但是在某些領(lǐng)域(比如復(fù)雜的狀態(tài)計(jì)算)Scala 還是最合適的編程語言。
安裝Spark
Spark 是Apache 基金會(huì)正式托管的Apache 開源項(xiàng)目,不過大部分人都是在Github
上對(duì)其進(jìn)行開發(fā)。你可以在以下地址下載二進(jìn)制預(yù)編譯包:https://spark.apache.org/downloads.html。
你可以將Spark 運(yùn)行在一臺(tái)或者多臺(tái)機(jī)器上,這一點(diǎn)我們會(huì)稍后解釋。目前對(duì)于主要的Linux 發(fā)行版Spark 都有對(duì)應(yīng)的安裝包,這對(duì)于安裝來說很方便。
本書我們所使用的代碼示例都是兼容Spark 2.4.0 版本的,除了少量的輸出和格式化細(xì)節(jié)之外,這些示例應(yīng)該能夠兼容Spark 的未來版本。
另外由于Spark 是運(yùn)行在Java 虛擬機(jī)(JVM)上的,所以你需要安裝它,并且在Spark 組件運(yùn)行的所有機(jī)器上都可以訪問。
對(duì)于安裝Java 開發(fā)包(JDK),我們推薦使用OpenJDK,它一般已經(jīng)被打包在多數(shù)系統(tǒng)中了。
當(dāng)然,你也可以安裝Oracle JDK。
與Scala 程序類似,Spark 也是運(yùn)行在JDK 6 或者更高版本的系統(tǒng)上,F(xiàn)在推薦的Spark 所依賴Java 版本是:
?? Spark 2.0 以下版本,推薦Java 7。
?? Spark 2.0 及其以上版本,推薦Java 8。
Scala 基礎(chǔ)
本書中的代碼示例由Scala 編寫。它也是Spark 核心的實(shí)現(xiàn)語言,但它并非唯一可用的語言,Spark 也提供了Python、Java,以及R 語言的API。
Scala 是目前世界上特性最完備的編程語言之一,因?yàn)樗瑫r(shí)提供了函數(shù)式與面向?qū)ο蟮闹С。而且,它的簡潔性和類型推斷機(jī)制讓其語法易于理解。
從教育學(xué)的角度來看,Scala 作為一門初學(xué)語言有很多優(yōu)勢,其中最重要的是它的語法規(guī)則以及語義表示。
——Björn Regnell,隆德大學(xué)
因此,我們希望本書的示例足夠簡潔,讓任何讀者都能夠理解其含義。對(duì)于想要Scala 入門教程以及喜歡通過書籍學(xué)習(xí)的讀者來說,我們推薦《Atomic Scala》[Eckel2013]。還有些讀者可能只是想要一本參考書來擴(kuò)展知識(shí), 那么推薦《Programming in Scala》[Odersky2016]。
學(xué)習(xí)指引
本書分為五個(gè)部分:
?? 第一部分繼續(xù)深入講解我們?cè)谛蜓灾刑岬降倪@些概念。我們將會(huì)介紹流處理的基本概念及其實(shí)現(xiàn)架構(gòu),深入學(xué)習(xí)Spark。
?? 第二部分,我們會(huì)學(xué)習(xí)Structured Streaming 及其編程模型,以及如何實(shí)現(xiàn)流處理程序,包括從簡單的無狀態(tài)轉(zhuǎn)換到高級(jí)的有狀態(tài)操作。還會(huì)討論與監(jiān)控工具的集成從而支持24/7 級(jí)別的運(yùn)維,以及目前還在開發(fā)階段的實(shí)驗(yàn)性模塊。
?? 第三部分,我們會(huì)學(xué)習(xí)Spark Streaming。與Structured Streaming 類似,我們會(huì)學(xué)習(xí)如何創(chuàng)建流處理程序,管理Spark Streaming 作業(yè),并與Spark 中其他API集成。最后會(huì)簡要介紹性能調(diào)優(yōu)的相關(guān)內(nèi)容。
?? 第四部分將介紹流處理的高級(jí)技巧,用概率數(shù)據(jù)結(jié)構(gòu)和近似技術(shù)解決流處理中的一些挑戰(zhàn),并探討Spark Streaming 對(duì)于在線機(jī)器學(xué)習(xí)方面的局限。
?? 第五部分談到Apache Spark 之外的世界。我們調(diào)研了其他的流處理器,并提供進(jìn)一步學(xué)習(xí)Spark 以及流處理相關(guān)內(nèi)容的方法路徑。
這里推薦你通過第一部分的閱讀來理解流處理中的概念。這會(huì)對(duì)于理解接下來的相關(guān)術(shù)語和概念很有幫助。
第二部分介紹Structured Streaming,第三部分介紹Spark Streaming,內(nèi)容結(jié)構(gòu)與前者類似。你可以選擇其中一個(gè),這取決于你的興趣和當(dāng)前的優(yōu)先級(jí):
?? 你可能正在啟動(dòng)一個(gè)新項(xiàng)目或者希望了解Structured Streaming ?那么可以從第二部分開始閱讀。
?? 你當(dāng)前的項(xiàng)目已經(jīng)使用了Spark Streaming,而你又希望更加了解它?那么請(qǐng)從第三部分開始閱讀。
第四部分則對(duì)于概率結(jié)構(gòu)背后的數(shù)學(xué)知識(shí)進(jìn)行了深入介紹,正所謂“坎坷前面是美景”。
第五部分將Spark 流處理與其他流處理框架進(jìn)行比較,有助于你嘗試多種技術(shù)選型并確認(rèn)最終方案。
本書在線資源可以對(duì)你的學(xué)習(xí)進(jìn)行補(bǔ)充,其中notebooks 以及代碼可以自行嘗試。
當(dāng)然也可以使用其中的代碼來開始自己的項(xiàng)目。在線資源的地址是https://github.com/stream-processing-with-spark。
我們非常高興能夠把這些知識(shí)以及自身經(jīng)驗(yàn)記錄下來,希望你能夠喜歡上這本書。
參考書籍
?? [Eckel2013] Eckel, Bruce and Dianne Marsh, Atomic Scala (Mindview LLC, 2013).
?? [Odersky2016] Odersky, Martin, Lex Spoon, and Bill Venners, Programming in Scala, 3rd ed. (Artima Press, 2016).
排版約定
在本書中使用以下排版約定:
斜體字(Italic)
表示新的術(shù)語、URL 網(wǎng)址、email 地址、文件名和文件擴(kuò)展名。
等寬字體(Constant width)
表示代碼行以及段落內(nèi)引用的程序中的元素,如變量或函數(shù)名、數(shù)據(jù)庫、數(shù)據(jù)類型、環(huán)境變量、語句和關(guān)鍵詞。
等寬黑體(Constant width bold)
表示由用戶輸入的命令或其他文本。
等寬斜體(Constant width italic)
表示應(yīng)替換為用戶提供的值或由上下文確定的值的文本。
使用示例代碼
本書在線資源中的補(bǔ)充資料(交互式的notebooks、工程代碼示例,以及一些項(xiàng)目)可以擴(kuò)充你的學(xué)習(xí),幫助你進(jìn)行嘗試、理解相關(guān)的技術(shù)知識(shí)。具體地址是https://github.com/stream-processing-with-spark。
需要注意的是,notebooks 需要運(yùn)行在Spark Notebook 上。Spark Notebook 是一個(gè)基于Web 的交互式編程環(huán)境,主要使用Scala 來運(yùn)行Apache Spark 任務(wù)。其中實(shí)時(shí)組件非常適合流處理編程使用,可用于從系統(tǒng)中獲取的數(shù)據(jù)做可視化展示。
Spark Notebook 項(xiàng)目位于Github 上:https://github.com/spark-notebook/sparknotebook,也可以直接從其發(fā)布站點(diǎn)http://spark-notebook.io 去下載編譯好的版本。
本書的目的在于幫助你更好地完成工作。通常情況下,可以在你的程序或者文檔中使用本書的代碼。不必聯(lián)系我們獲取代碼的使用權(quán),除非你需要使用大量的代碼。例如,在寫程序的時(shí)候引用幾段代碼不需要向我們申請(qǐng)?jiān)S可。但以光盤方式銷售或者重新發(fā)行O’Reilly 書中的示例則需要獲得許可。引用本書或引用本書中的示例代碼來回答問題也不需要申請(qǐng)?jiān)S可。但是,如果要將本書中的大量代碼加入到你的產(chǎn)品文檔,則需要申請(qǐng)?jiān)S可。
我們欣賞你在引用時(shí)注明出處,但不強(qiáng)求。引用通常包括書名、作者、出版社和ISBN。如:“Stream Processing with Apache Spark by Gerard Maas and François Garillot (O’Reilly). Copyright 2019 François Garillot and Gerard Maas Images, 978-1-491-94424-0”。
如果覺得使用示例代碼的情況不屬于前面列出的合理使用或許可范圍,請(qǐng)通過電子郵件聯(lián)系我們,郵箱地址為permissions@oreilly.com。
O’Reilly 在線學(xué)習(xí)平臺(tái)(O’Reilly Online Learning)
近40 年來,O’Reilly Media 致力于提供技術(shù)和商業(yè)培訓(xùn)、知識(shí)和卓越見解,來幫助眾多公司取得成功。
我們有一群獨(dú)家專家和創(chuàng)新者,他們通過圖書、文章、會(huì)議和在線學(xué)習(xí)平臺(tái)分享知識(shí)和技術(shù)。O’Reilly 的在線學(xué)習(xí)平臺(tái)提供按需訪問的直播培訓(xùn)課程、詳細(xì)的學(xué)習(xí)路徑、交互式編程環(huán)境,以及由O’Reilly 和其他200 多家出版社出版的書籍和視頻。詳情請(qǐng)?jiān)L問http://oreilly.com。
聯(lián)系我們
任何有關(guān)本書的意見或疑問,請(qǐng)按照以下地址聯(lián)系出版社。
美國:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中國:
北京市西城區(qū)西直門南大街2 號(hào)成銘大廈C 座807 室(100035)
奧萊利技術(shù)咨詢(北京)有限公司
本書有一個(gè)對(duì)應(yīng)網(wǎng)頁,可以看到勘誤表、案例及其他相關(guān)信息,具體可以訪問http://bit.ly/stream-proc-apache-spark。
發(fā)表評(píng)論或咨詢有關(guān)本書的技術(shù)問題,請(qǐng)發(fā)送電子郵件至bookquestions@oreilly.com 郵箱。
關(guān)于我們的書籍、課程、會(huì)議和新聞的更多信息, 請(qǐng)參閱http://www.oreilly.com。
我們的Facebook:http://facebook.com/oreilly。
我們的Twitter:http://twitter.com/oreillymedia。
我們的YouTube:http://www.youtube.com/oreillymedia。
致謝
本書最初起源于Spark Streaming 學(xué)習(xí)手冊(cè),后來迅速發(fā)展成全面介紹Apache Spark在流處理方面的資料。這里要感謝所有的審稿人,你們寶貴的反饋促使了本書發(fā)展至今。另外特別感謝來自Datastax 的Russell Spitzer 和Facebook 的Serhat Yilmaz,以及來自Klarrio 的Giselle Van Dongen。
感謝Holden Karau 在本書草稿階段給予的幫助和建議,以及Bill Chambers 對(duì)于我們后來新增的Structured Streaming 模塊的幫助。
至于O’Reilly 的編輯Jeff Bleiel,從我們提出最初的想法到草稿版本,再到你手里拿到的這個(gè)完整版本,一直全程參與,很有耐心并積極地反饋建議。還要感謝我們?cè)贠’Reilly 所接觸的第一位編輯Shannon Cutt,她為整個(gè)項(xiàng)目的啟動(dòng)提供了不少幫助。此外O’Reilly 其他人在本書撰寫的各個(gè)階段都給予了不少幫助,這才讓我們走得更遠(yuǎn)。
另外還要感謝Tathagata Das 與我們之間多次的互動(dòng)交流,特別是在早期寫Spark Streaming 的那段時(shí)間,當(dāng)時(shí)我們正在挑戰(zhàn)這個(gè)框架所能提供的極限。
Gerard
我要感謝Lightbend 的同事對(duì)于我在寫作和工作之間來回忙碌之時(shí)所給予的支持和理解。特別要感謝的是Ray Roestenburg 在我困難時(shí)刻對(duì)我的鼓勵(lì),還有DeanWampler 對(duì)于我所做出的努力一直很支持,以及Ruth Stento 對(duì)我在寫作風(fēng)格上給出了良好建議。
特別需要提及的是Kurt Jonckheer、Patrick Goemaere 和Lieven Gesquière,他們給予了我不少機(jī)會(huì)和空間來加深對(duì)于Spark 的理解。感謝Andy Petrella 創(chuàng)建的SparkNotebook,但更重要的是他那富有感染力的激情鼓勵(lì)我去探索編程與數(shù)據(jù)的交集。最重要的是,我無比感謝我的妻子Ingrid,兩個(gè)女兒Layla 和Juliana,以及我的母親Carmen。如果沒有她們的愛和關(guān)心以及理解,那么不可能完成這個(gè)項(xiàng)目。
François
非常感謝Swisscom 以及Facebook 的同事在本書寫作期間給予的支持,感謝Chris Fregly、Paco Nathan 和Ben Lorica 對(duì)我的建議和支持,以及我的妻子AJung 所做的一切。
Gerard Mass是Lightbend的首席工程師,致力于將Structured Streaming與流處理擴(kuò)展技術(shù)無縫集成到Lightbend平臺(tái)中。
François Garillot在Facebook從事于分布式計(jì)算相關(guān)工作。曾在Lightbend從事Spark Streaming反壓機(jī)制研究,同時(shí)擁有巴黎綜合理工學(xué)院的博士學(xué)位。
目錄
序 1
前言 3
第一部分 Apache Spark 流處理的基本原理
第1 章 流處理概述 13
什么是流處理 14
批處理與流處理 15
流處理中的時(shí)間概念 15
不確定性因素 16
流處理案例 16
可擴(kuò)展的數(shù)據(jù)處理能力 18
擴(kuò)展性與容錯(cuò)性 19
分布式流處理 19
Apache Spark 概述 20
第一波浪潮:函數(shù)式API 20
第二波浪潮:SQL 21
統(tǒng)一的引擎21
Spark 組件 22
Spark Streaming 23
Structured Streaming 23
接下來? 24
第2 章 流處理模型 25
數(shù)據(jù)源與接收器 26
不可變流 27
轉(zhuǎn)換與聚合 27
窗口聚合 28
滾動(dòng)窗口 28
滑動(dòng)窗口 29
無狀態(tài)處理與有狀態(tài)處理 29
有狀態(tài)的流 30
案例:Scala 中的本地狀態(tài)計(jì)算 31
無狀態(tài)流,還是有狀態(tài)流? 33
時(shí)間效應(yīng) 33
帶時(shí)間戳的事件計(jì)算 33
通過時(shí)間戳來定義時(shí)間概念 34
事件時(shí)間與處理時(shí)間 34
使用水位線計(jì)算 37
小結(jié) 39
第3 章 流處理架構(gòu) 41
數(shù)據(jù)平臺(tái)的組件 41
體系模型 43
在流處理應(yīng)用中使用批處理組件 44
流處理架構(gòu)參考 45
Lambda 架構(gòu) 45
Kappa 架構(gòu) 46
流處理算法與批處理算法 47
流處理算法有時(shí)候本質(zhì)上與批處理算法完全不同 47
流處理算法難以保證比批處理算法表現(xiàn)更好 48
小結(jié) 50
第4 章 流處理引擎Apache Spark 51
兩種API 的由來 51
Spark 的內(nèi)存使用 52
故障恢復(fù) 53
惰性執(zhí)行 53
緩存使用建議 53
延遲 54
面向吞吐的數(shù)據(jù)處理 55
Spark 的多語言API 55
快速實(shí)現(xiàn)數(shù)據(jù)分析 56
更多關(guān)于Spark 的內(nèi)容 57
小結(jié) 57
第5 章 Spark 分布式處理模型 59
通過集群管理器來運(yùn)行Apache Spark 59
Spark 的集群管理器 61
分布式系統(tǒng)的彈性與容錯(cuò) 62
故障恢復(fù) 63
集群管理器對(duì)容錯(cuò)的支持 63
數(shù)據(jù)交付語義 64
微批處理與一次處理一個(gè) 66
微批處理:整體同步處理應(yīng)用案例 66
一次處理一個(gè) 68
微批與一次處理一個(gè):權(quán)衡 68
微批處理與一次處理一個(gè)方式地結(jié)合 69
動(dòng)態(tài)的批次間隔 69
Structured Streaming 處理模型 69
第6 章 Spark 彈性模型 71
Spark 中的彈性分布式數(shù)據(jù)集 71
Spark 組件 73
Spark 容錯(cuò)保證 75
Task 失敗恢復(fù) 76
stage 失敗恢復(fù) 77
Driver 失敗恢復(fù) 77
小結(jié) 78
參考文獻(xiàn) 81
第二部分 Structured Streaming
第7 章 Structured Streaming 概述 87
學(xué)習(xí)Structured Streaming 之前 88
批處理分析 89
流分析 92
連接Stream 93
準(zhǔn)備流數(shù)據(jù)93
流式Dataset 操作 94
創(chuàng)建查詢(Query) 95
啟動(dòng)流處理96
瀏覽數(shù)據(jù) 97
小結(jié) 97
第8 章 Structured Streaming 編程模型 99
初始化Spark 實(shí)例 100
source:接收流數(shù)據(jù) 100
流數(shù)據(jù)的轉(zhuǎn)換 102
sink:輸出結(jié)果數(shù)據(jù) 105
format 106
outputMode 107
queryName 107
option 108
options 108
trigger 108
start() 109
小結(jié) 109
第9 章 Structured Streaming 實(shí)戰(zhàn) 111
消費(fèi)流source 112
程序邏輯 114
寫入流sink 114
小結(jié) 116
第10 章 Structured Streaming 的Source 117
source 概述 117
可靠的source 需要能夠重放數(shù)據(jù) 118
source 需要提供schema 119
可用的source 121
文件source 122
指定文件格式 122
公共配置 123
常用的文本解析配置項(xiàng)(CSV、JSON) 124
JSON 文件source 125
CSV 文件source127
Parquet 文件source 128
文本文件source 128
Kafka source 129
創(chuàng)建Kafka source 130
選擇訂閱主題的方法 131
Kafka source 的配置項(xiàng) 132
Kafka 消費(fèi)者的配置項(xiàng) 133
Socket source 134
配置 135
操作 136
Rate source 136
第11 章 Structured Streaming 的Sink 139
sink 概述 139
可用的sink 140
可靠的sink 140
實(shí)驗(yàn)型sink 141
sink API 141
深入學(xué)習(xí)sink 141
文件sink 142
在文件sink 中使用觸發(fā)器 143
文件格式的通用配置項(xiàng) 145
常見的時(shí)間和日期格式化設(shè)置(CSV、JSON) 146
CSV 文件sink 146
JSON 文件sink 147
Parquet 文件sink 148
文本文件sink 148
Kafka sink 148
Kafka 發(fā)布模型 148
Kafka sink 的使用 149
內(nèi)存sink 152
控制臺(tái)sink 153
配置項(xiàng) 153
輸出模式 153
Foreach sink 154
ForeachWriter 接口 154
TCP Writer sink: ForeachWriter 使用案例 155
案例總結(jié) 158
ForeachWriter 序列化問題排查 159
第12 章 基于事件時(shí)間的流處理 161
Structured Streaming 中的事件時(shí)間 161
事件時(shí)間 163
處理時(shí)間 164
水位線 164
基于時(shí)間的窗口聚合 165
基于時(shí)間的窗口定義 166
如何計(jì)算間隔 167
多維聚合 167
滾動(dòng)窗口和滑動(dòng)窗口 168
記錄去重 170
小結(jié) 170
第13 章 高級(jí)狀態(tài)操作 173
案例:車隊(duì)管理 174
分組狀態(tài)操作 174
使用MapGroupsWithState 176
使用FlatMapGroupsWithState 180
輸出模式 182
管理狀態(tài)的時(shí)變性 183
小結(jié) 186
第14 章 Structured Streaming 應(yīng)用監(jiān)控 187
Spark 指標(biāo)子系統(tǒng) 188
StreamingQuery 實(shí)例 189
StreamingQueryListener 接口 192
第15 章 實(shí)驗(yàn)性模塊:連續(xù)處理與機(jī)器學(xué)習(xí) 195
連續(xù)處理 195
連續(xù)處理介紹 195
使用連續(xù)處理 197
局限性 198
機(jī)器學(xué)習(xí) 199
學(xué)習(xí)與應(yīng)用199
在流中使用機(jī)器學(xué)習(xí)模型 200
案例:利用環(huán)境傳感器估計(jì)房間使用情況 201
在線訓(xùn)練 204
參考文獻(xiàn) 207
第三部分 Spark Streaming
第16 章 Spark Streaming 概述 213
DStream 抽象 214
基于DStream 的編程模型 214
基于DStream 的執(zhí)行模型 216
Spark Streaming 程序結(jié)構(gòu) 216
創(chuàng)建Spark Streaming Context 217
定義DStream 218
定義輸出操作 218
啟動(dòng)Spark Streaming Context 218
停止Streaming 進(jìn)程 219
小結(jié) 219
第17 章 Spark Streaming 編程模型 221
RDD,DStream 的底層抽象 221
DStream 轉(zhuǎn)換操作 224
元素級(jí)別的DStream 轉(zhuǎn)換 226
RDD 級(jí)別的DStream 轉(zhuǎn)換228
Count 操作 229
修改結(jié)構(gòu)的轉(zhuǎn)換操作 230
小結(jié) 231
第18 章 Spark Streaming 執(zhí)行模型 233
整體同步架構(gòu) 233
Receiver 模型 235
Receiver API 235
Receiver 工作流程 236
Receiver 數(shù)據(jù)流 237
內(nèi)部的數(shù)據(jù)彈性 238
Receiver 的并行 239
資源平衡:Receiver 與處理核數(shù) 239
通過預(yù)寫式日志(Write-Ahead Log)達(dá)到零數(shù)據(jù)丟失 240
無Receiver(Direct)模式 241
小結(jié) 242
第19 章 Spark Streaming 的Source 245
source 分類 245
基礎(chǔ)source 246
基于Receiver 模式的source 246
基于Direct 模式的source 247
常用source 247
文件source 248
隊(duì)列source 251
工作流程 252
使用隊(duì)列source 進(jìn)行單元測試 252
隊(duì)列source 的簡單替代方案:ConstantInputDStream 254
Socket source 256
Kafka source 258
使用Kafka source 260
工作流程 261
哪里有更多的source 262
第20 章 Spark Streaming 的Sink 263
輸出操作 263
內(nèi)置的輸出操作 265
print 266
saveAs 系列 266
foreachRDD 268
使用foreachRDD 編寫自定義sink 268
第三方輸出操作 271
第21 章 基于時(shí)間的流處理 273
窗口聚合 273
滾動(dòng)窗口 274
滑動(dòng)窗口 275
滑動(dòng)窗口與批次間隔 275
滑動(dòng)窗口與滾動(dòng)窗口 276
使用窗口還是較長的批次間隔 276
窗口上的reduce 操作 277
reduceByWindow 278
reduceByKeyAndWindow 278
countByWindow 278
countByValueAndWindow 279
可逆的窗口聚合操作 279
流的分片 281
小結(jié) 281
第22 章 任意有狀態(tài)的流處理 283
流的狀態(tài)性 283
updateStateByKey 284
updateStateByKey 的局限性 286
性能 286
內(nèi)存占用 287
使用mapwithState 進(jìn)行有狀態(tài)的計(jì)算 287
使用mapWithState 289
使用mapWithState 進(jìn)行基于事件時(shí)間的流計(jì)算 291
第23 章 使用Spark SQL 295
Spark SQL 296
在Spark Streaming 中使用Spark SQL 函數(shù) 297
靜態(tài)數(shù)據(jù)處理 301
Join 優(yōu)化 304
更新流處理程序中的參考數(shù)據(jù)集 307
小結(jié) 309
第24 章 checkpoint 機(jī)制 311
checkpoint 的使用 312
DStream 的checkpoint 機(jī)制 317
從checkpoint 中恢復(fù) 318
checkpoint 的代價(jià) 320
checkpoint 調(diào)優(yōu) 320
第25 章 Spark Streaming 應(yīng)用監(jiān)控 323
Streaming UI 324
通過Streaming UI 了解作業(yè)性能 326
輸入速率圖326
調(diào)度延遲圖327
處理時(shí)間圖328
總延遲圖 328
批次細(xì)節(jié) 329
監(jiān)控REST API 331
監(jiān)控REST API 的使用 331
監(jiān)控REST API 詳解 331
指標(biāo)子系統(tǒng) 333
內(nèi)部事件總線 335
小結(jié) 339
第26 章 性能調(diào)優(yōu) 341
Spark Streaming 中的性能平衡 341
批次間隔與處理延遲的關(guān)系 342
作業(yè)是如何失敗的 342
深入理解調(diào)度延遲和處理延遲 343
checkpoint 對(duì)處理時(shí)間的影響 344
影響作業(yè)性能的外部因素 345
如何提高性能 345
調(diào)整批次間隔 346
以固定速率對(duì)數(shù)據(jù)攝入限流 346
反壓 347
動(dòng)態(tài)限流 348
PID 反壓調(diào)優(yōu) 349
自定義速率估算器 349
另一種動(dòng)態(tài)處理策略 350
緩存 350
推測執(zhí)行 352
參考文獻(xiàn) 353
第四部分 Spark Streaming 高級(jí)技巧
第27 章 流式近似與抽樣算法 357
準(zhǔn)確性、實(shí)時(shí)性與大數(shù)據(jù) 358
準(zhǔn)確性 358
實(shí)時(shí)處理 358
大數(shù)據(jù) 359
準(zhǔn)確性、實(shí)時(shí)性與大數(shù)據(jù)之間的三角關(guān)系 359
近似算法 362
哈希與素描 362
去重統(tǒng)計(jì):HyperLogLog 363
角色扮演練習(xí):假如我們是系統(tǒng)管理員 364
HyperLogLog 在Spark 中的實(shí)踐 367
統(tǒng)計(jì)元素頻率:Count-min Sketch 371
布隆過濾器概述 372
在Spark 中使用布隆過濾器 373
使用Count-min Sketch 統(tǒng)計(jì)頻率 373
排名與分位數(shù):T-Digest 算法 376
減少元素?cái)?shù)量:抽樣 378
隨機(jī)抽樣 379
分層抽樣 380
第28 章 實(shí)時(shí)機(jī)器學(xué)習(xí) 381
利用樸素貝葉斯進(jìn)行流分類 382
streamDM 介紹384
樸素貝葉斯實(shí)踐案例 385
訓(xùn)練一個(gè)電影評(píng)論分類器 386
決策樹介紹 387
Hoeffding 樹 389
使用在線K-means 進(jìn)行流聚類 392
K-means 聚類 392
在線數(shù)據(jù)與在線K-means 算法 393
聚類的衰退問題 394
使用Spark Streaming 運(yùn)行流式K-means 396
參考文獻(xiàn) 399
第五部分 Apache Spark 之外的世界
第29 章 其他分布式實(shí)時(shí)流處理系統(tǒng) 405
Apache Storm 405
編程模型 406
Storm 拓?fù)?406
Storm 集群 407
與Spark 相比 407
Apache Flink 408
流處理優(yōu)先的框架 408
與Spark 相比 409
Kafka Streams 409
Kafka Streams 編程模型 410
與Spark 相比 410
云上的流處理系統(tǒng) 411
AWS 上的Amazon Kinesis 411
微軟的Azure Stream Analytics 412
Apache Beam 和Google Cloud Dataflow 413
第30 章 展望 417
緊隨Spark 項(xiàng)目 418
在Stack Overflow 上尋求幫助 418
在郵件列表中進(jìn)行討論 418
參加會(huì)議 419
參加交流會(huì) 419
貢獻(xiàn)Apache Spark 項(xiàng)目 419
參考文獻(xiàn) 421
作者介紹 423
封面介紹 423