Lambda Architecture 能與加法算法很好地協(xié)同工作。 因此,在另一種情況下,我們需要考慮使用近似算法,例如,使用HyperLogLog處理count-distinct的問(wèn)題等。
實(shí)現(xiàn)
有許多實(shí)現(xiàn)Lambda架構(gòu)的方法,因?yàn)閷?duì)于每個(gè)層的底層解決方案是非常獨(dú)立的。每個(gè)層需要底層實(shí)現(xiàn)的特定功能,有助于做出更好的選擇并避免過(guò)度決策:
批量層(Batch Layer):寫(xiě)一次,批量讀取多次
服務(wù)層(Serving layer):隨機(jī)讀取,不支持隨機(jī)寫(xiě)入,批量計(jì)算和批量寫(xiě)入
速度層(Speed layer):隨機(jī)讀取,隨機(jī)寫(xiě)入;增量計(jì)算
例如,其中一個(gè)實(shí)現(xiàn)方案的構(gòu)成(使用Kafka,Apache Hadoop,Voldemort,Twitter Storm,Cassandra)可能如下圖所示:
Apache Spark
Apache Spark可以被認(rèn)為是用于Lambda架構(gòu)各層的集成解決方案。其中,Spark Core 包含了高層次的API和優(yōu)化的支持通用圖運(yùn)算引擎,Spark SQL用于SQL和結(jié)構(gòu)化數(shù)據(jù)處理、 Spark Streaming 可以解決高拓展、高吞吐、容錯(cuò)的實(shí)時(shí)流處理。在批處理中使用Spark可能小題大做,而且不是所有方案和數(shù)據(jù)集都適用。但除此之外,Spark算是對(duì)Lambda Architecture的合理的實(shí)現(xiàn)。
示例應(yīng)用
下面通過(guò)一些路徑創(chuàng)建一個(gè)示例應(yīng)用,以展示Lambda Architecture,其主要目的是提供#morningatlohika tweets(一個(gè)由我在Lviv, Ukraine發(fā)起的本地技術(shù)演講,)這個(gè)hash標(biāo)簽的統(tǒng)計(jì):包括之前到今天這一刻的所有時(shí)間。
源碼在GitHub 上,有關(guān)這個(gè)主題的更多信息可以在Slideshare上找到。
批處理視圖(Batch View)
簡(jiǎn)單地說(shuō),假定我們的主數(shù)據(jù)集包含自開(kāi)始時(shí)間以來(lái)的所有更新。 此外,我們已經(jīng)實(shí)現(xiàn)了一個(gè)批處理,可用于創(chuàng)建我們的業(yè)務(wù)目標(biāo)所需的批處理視圖,因此我們有一個(gè)預(yù)計(jì)算的批處理視圖,其中包含所有與#morningatlohika相關(guān)的標(biāo)簽統(tǒng)計(jì)信息:
編號(hào)很容易記住,因?yàn)?,為方便查看,我使用?duì)應(yīng)標(biāo)簽的英文單詞的字母數(shù)目作為編號(hào)。
實(shí)時(shí)視圖
假設(shè)應(yīng)用程序啟動(dòng)后,同時(shí)有人發(fā)如下tweet:
“Cool blog post by @tmatyashovsky about #lambda #architecture using #apache #spark at #morningatlohika”
此時(shí),正確的實(shí)時(shí)視圖應(yīng)該包含如下的hash標(biāo)簽和統(tǒng)計(jì)數(shù)據(jù)(本例中都是1,因?yàn)槊總€(gè)hash標(biāo)簽只用了一次):
查詢
當(dāng)終端用戶查詢出現(xiàn)是,為了給全部hash標(biāo)簽返回實(shí)時(shí)統(tǒng)計(jì)結(jié)果,我們只需要合并批處理視圖和實(shí)時(shí)視圖。所以,輸出如下所示編碼(hash標(biāo)簽的正確統(tǒng)計(jì)數(shù)據(jù)都加了1):
場(chǎng)景
示例中的場(chǎng)景可以簡(jiǎn)化為如下步驟:
用Apache Spark創(chuàng)建批處理視圖(.parquet)
在Spark中緩存批處理視圖
將流處理應(yīng)用連接到Twitter
實(shí)時(shí)監(jiān)視包含#morningatlohika 的tweets
構(gòu)造增量實(shí)時(shí)視圖
查詢,即,即時(shí)合并批處理視圖和實(shí)時(shí)視圖
技術(shù)細(xì)節(jié)
此源代碼是基于Apache Spark 1.6.x(注:再引入結(jié)構(gòu)流之前)。 Spark Streaming架構(gòu)是純微型批處理架構(gòu):
所以當(dāng)我處理一個(gè)流媒體應(yīng)用程序時(shí),我使用DStream來(lái)連接使用TwitterUtils的Twitter:
在每個(gè)微批次中(使用可配置的批處理間隔),我正在對(duì)新tweets中的hashtags統(tǒng)計(jì)信息進(jìn)行計(jì)算,并使用updateStateByKey()狀態(tài)轉(zhuǎn)換函數(shù)來(lái)更新實(shí)時(shí)視圖的狀態(tài)。簡(jiǎn)單地說(shuō),就是使用臨時(shí)表將實(shí)時(shí)視圖存儲(chǔ)在存儲(chǔ)器中。
查詢服務(wù)反映了批處理的合并過(guò)程和通過(guò)代碼表示的DataFrame實(shí)時(shí)視圖: