溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Yelp的PaaStorm內(nèi)部機(jī)制是什么

發(fā)布時間:2021-12-23 15:50:03 來源:億速云 閱讀:127 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“Yelp的PaaStorm內(nèi)部機(jī)制是什么”,在日常操作中,相信很多人在Yelp的PaaStorm內(nèi)部機(jī)制是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Yelp的PaaStorm內(nèi)部機(jī)制是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

這名字中有什么含義?

PaaStorm的名字其實是PaaSTA和Storm的組合。那PaaStorm到底是干什么的呢?要回答這個問題,咱們先看看數(shù)據(jù)管道的基本架構(gòu):

Yelp的PaaStorm內(nèi)部機(jī)制是什么

主要看看“Transformer”那一步,就會知道大多數(shù)存儲在Kafka中的消息都并不能直接被導(dǎo)入目標(biāo)系統(tǒng)。設(shè)想有一套Redshift集群是用來存儲廣告推送數(shù)據(jù)的。廣告推送集群想存儲的只是上游系統(tǒng)的某一個字段(比如某個業(yè)務(wù)的平均權(quán)重),否則它就要保存原始數(shù)據(jù)并對其進(jìn)行聚合計算。如果Redhift廣告推送集群要存儲所有上游數(shù)據(jù)的話,就會浪費(fèi)存儲空間,導(dǎo)致系統(tǒng)性能降低。

在過去,各個服務(wù)都會寫復(fù)雜的MapReduce任務(wù),在把數(shù)據(jù)寫到目標(biāo)數(shù)據(jù)存儲之前先進(jìn)行數(shù)據(jù)處理。可是,這些MapReduce任務(wù)都碰到了上文所述的性能和擴(kuò)展問題。數(shù)據(jù)管道給大家提供的好處之一是消費(fèi)者程序可以拿到它所需要的數(shù)據(jù)的形式,不管上游數(shù)據(jù)本來是什么樣。

減少示例代碼

本來我們是可以讓每個消費(fèi)者程序自己按自己需要的方式做數(shù)據(jù)轉(zhuǎn)換的。比如,廣告推送系統(tǒng)可以自己寫一個轉(zhuǎn)換服務(wù),從Kafka中的業(yè)務(wù)數(shù)據(jù)中提取出查看統(tǒng)計量,并自己維護(hù)這個轉(zhuǎn)換服務(wù)的。這種辦法最初工作得很好,但最終系統(tǒng)上規(guī)模時我們就碰上問題了。

我們想提供一個轉(zhuǎn)換框架是基于以下考慮:

很多轉(zhuǎn)換邏輯是通用的,可以在多個團(tuán)隊之間共享。比如把標(biāo)志位轉(zhuǎn)換成有意義的字段。

這樣的轉(zhuǎn)換邏輯通常會需要很多示例代碼。比如連接數(shù)據(jù)源或數(shù)據(jù)目的、保存狀態(tài)、監(jiān)控吞吐量、故障恢復(fù)等。這樣的代碼本來并不需要在各種服務(wù)之間拷來拷去。

要保證能對數(shù)據(jù)進(jìn)行實時處理的話,數(shù)據(jù)轉(zhuǎn)換操作要盡可能地快,要基于流。

減少示例代碼最自然的方式就是提供一個轉(zhuǎn)換接口。大家的服務(wù)實現(xiàn)接口中完成一次轉(zhuǎn)換操作的具體邏輯,然后,剩下的工作就由我們的流處理框架完成。

把Kafka作為消息總線

最初PaaStorm是一個Kafka-to-Kafka的轉(zhuǎn)換框架,慢慢地才演進(jìn)成也支持了其他類型的終端節(jié)點。把Kafka做為PaaStorm的終端節(jié)點簡化了很多東西:每個對數(shù)據(jù)感興趣的服務(wù)都可以注冊到Topic上,關(guān)注任意轉(zhuǎn)換過的數(shù)據(jù)或者原始數(shù)據(jù),有新消息到來就處理就好了,完全不必在意是誰創(chuàng)建了這個Topic。轉(zhuǎn)換過的數(shù)據(jù)按Kafka的保留策略持久化。因為Kafka是一個發(fā)布-訂閱系統(tǒng),下游系統(tǒng)也可以在任何它想的時候消費(fèi)數(shù)據(jù)。

用Storm處理一切

當(dāng)采用了PaaStorm之后,我們該怎樣把我們的Kafka Topic之間的關(guān)系可視化呢?因為有些Topic中的數(shù)據(jù)會按照源到端的方式流向別的Topic,我們可以把我們的拓?fù)浣Y(jié)構(gòu)當(dāng)成一個有向無環(huán)圖:

Yelp的PaaStorm內(nèi)部機(jī)制是什么

每個節(jié)點都是一個Kafka Topic,箭頭表示PaaStorm提供的轉(zhuǎn)換操作。這時候“PaaStorm”這個名字就變得更有意義了:象Storm一樣,PaaStorm通過轉(zhuǎn)換模塊(象Bolt一樣)提供對數(shù)據(jù)流的源(象Spout一樣)的實時轉(zhuǎn)換。

PaaStorm內(nèi)部機(jī)制

PaaStorm的核心抽象叫做Spolt(Spout和Bolt的結(jié)合物)。象名字表示的一樣,Spolt接口也定義了兩個重要的東西:一個輸入數(shù)據(jù)源,一種對那個源的消息數(shù)據(jù)進(jìn)行的某種處理。

下面例子定義了一個最簡單的Spolt:

Yelp的PaaStorm內(nèi)部機(jī)制是什么

這個Spolt會處理“refresh_primary.business.abc123efg456”這個Topic中的每一條消息,增加一個字段,保存原始消息中的‘name’字段的大寫的值,然后再把這條處理過的新版本的消息發(fā)送出去。

值得一提的是數(shù)據(jù)管道中的所有消息都是不可修改的。要得到一條修改過的消息,就要創(chuàng)建一個新的對象。而且,因為我們在為消息體中增加一個新字段(就是那個增加的“大寫字母的name”字段),新消息的模式已經(jīng)改變了。在生產(chǎn)環(huán)境中,消息的模式ID是從來都不能寫死的。我們要依靠Schematizer服務(wù)來為一條修改過的消息注冊并提供合適的模式。

***提一句,數(shù)據(jù)管道的客戶端庫提供了好幾種非常相似的用名字空間、Topic名、源名和模式ID的組合來生成“spolt_source”的方法。這樣就可以很容易地讓某個Spolt去找到它需要的所有源并從中讀取數(shù)據(jù)。

與Kafka相關(guān)的處理是怎樣的?

也許你已經(jīng)發(fā)現(xiàn)上面的Spolt中沒有什么代碼是與Kafka Topic相交互的。這是因為在PaaStorm中,所有真正的Kafka接口相關(guān)處理都是由一個內(nèi)部實例(恰好也叫PaaStorm)完成的。PaaStorm實例會把一個特定的Spolt與對應(yīng)的源和目的關(guān)聯(lián)起來,并把消息送給Spolt處理,再把Spolt輸出的消息發(fā)布到正確的Topic上去。

Yelp的PaaStorm內(nèi)部機(jī)制是什么

每個PaaStorm實例都用一個Spolt初始化。比如,下面的命令就用上文中定義的UppercaseNameSpolt開啟了一次處理:

PaaStorm(UppercaseNameSpolt()).start()

這就意味著所有有意寫一個新轉(zhuǎn)換器的人都可以簡單地定義一個新的Spolt子類,壓根不用修改任何PaaStorm運(yùn)行體相關(guān)的東西。

從內(nèi)部來看,PaaStorm運(yùn)行體的主方法也是驚人的簡單,偽碼如下:

Yelp的PaaStorm內(nèi)部機(jī)制是什么

這個運(yùn)行體先做了一些設(shè)置:初始化了生產(chǎn)者和消費(fèi)者,以及消息計數(shù)器。然后,它一直等待上游Topic中的新數(shù)據(jù)。如果有新數(shù)據(jù)到來,就用Spolt處理它。Spolt處理之后會輸出一條或多條消息,生產(chǎn)者再把它發(fā)布到下游的Topic。

另外簡單提一下,PaaStorm運(yùn)行體也提供了比如消費(fèi)者注冊、心跳機(jī)制(名叫“tick”)等。比如某個Spolt要經(jīng)常性地清空它的內(nèi)容,那就可以用tick來觸發(fā)。

關(guān)于狀態(tài)保存

PaaStorm保證可以可靠地從故障中恢復(fù)。萬一發(fā)生了崩潰,我們就該從正確的偏移位置開始重新消費(fèi)。但不幸的是,這個正確的偏移量一般情況下都并不是我們從上游的Topic中消費(fèi)的***那一條消息。原因是雖然我們已經(jīng)消費(fèi)了它,但事實上我們還沒來得及把轉(zhuǎn)換后的版本發(fā)布出去。

所以重新啟動時正確的位置應(yīng)該是上游Topic與已經(jīng)成功發(fā)布到下游的***一條消息對應(yīng)的位置。在知道發(fā)到下游的***一條消息的情況之后,我們需要知道它對應(yīng)的上游的消息是哪一條,這樣就可以從那里恢復(fù)了。

為了方便實現(xiàn)這個功能,PaaStorm的Spolt在處理一條原始消息時,會把與這條原始消息相對應(yīng)的在上游Topic中的Kafka偏移量也加到轉(zhuǎn)換后的包里。轉(zhuǎn)換后的消息隨后會在生產(chǎn)者的回調(diào)函數(shù)中把這個偏移量傳回來。這樣,我們就可以知道與下游Topic中***一條消息對應(yīng)的上游Topic的偏移量了。因為回調(diào)函數(shù)只有在生產(chǎn)者成功地把轉(zhuǎn)換后的消息發(fā)布出去之后才會調(diào)用,也就意味著原始消息已經(jīng)被成功處理了,在這種情況下,消費(fèi)者就可以很放心的在那個回調(diào)函數(shù)中提交這個偏移量了。萬一發(fā)生崩潰,我們可以直接從還沒有被完全處理的上游消息那里開始繼續(xù)處理。

從上面的偽碼中可以看到,PaaStorm也會統(tǒng)計消費(fèi)掉的消息數(shù)和發(fā)布的消息數(shù)。這樣,感興趣的用戶可以檢查上游和下游Topic中的吞吐量。這讓我們很輕松地有了對任意轉(zhuǎn)換操作的監(jiān)控和性能檢查功能。在Yelp,我們是把我們的統(tǒng)計信息發(fā)給SignalFX的:

Yelp的PaaStorm內(nèi)部機(jī)制是什么

SignalFX圖可以顯示出在一個PaaStorm實例中生產(chǎn)者和消費(fèi)者的吞吐量。在這個例子中,輸入輸出消息量并不匹配。

在PaaStorm中對生產(chǎn)者和消費(fèi)者分開做統(tǒng)計的好處之一是我們可以把這兩個吞吐量放在一起,看看瓶頸是在哪里。如果到不了這個粒度,是很難發(fā)現(xiàn)管道中的性能問題的。

到此,關(guān)于“Yelp的PaaStorm內(nèi)部機(jī)制是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI