在過(guò)去的幾個(gè)月里,Yelp一直在不斷地向大家分享著他們的數(shù)據(jù)管道的情況(文章列表見(jiàn)頁(yè)尾)。這是一套基于Python的工具,可以實(shí)時(shí)地將數(shù)據(jù)流向需要它們的服務(wù),并隨之加以必要的數(shù)據(jù)處理。這一系列的文章講述了如何從MySQL中將消息復(fù)制出來(lái)、如何跟蹤模式的變化及演進(jìn)、并最終分享了如何把數(shù)據(jù)接入到Redshift和Salesforce等不同類型的目標(biāo)存儲(chǔ)。
幸好Yelp非常慷慨,他們不只是分享了自己的設(shè)計(jì)思路和經(jīng)驗(yàn),更是趕在圣誕節(jié)之前向大家獻(xiàn)上了一份大禮,把主要模塊開(kāi)源出來(lái)了!
在讀過(guò)了所有這些關(guān)于我們的數(shù)據(jù)管道的文章之后,可能你會(huì)覺(jué)得我們這些Yelp的人不過(guò)是像一個(gè)孩子在向大家炫耀他的新玩具一樣,肯定會(huì)自己捂得嚴(yán)嚴(yán)的,不會(huì)和大家分享。但是和大多數(shù)有了新玩具又不會(huì)分享的孩子一樣,我們?cè)敢夥窒?mdash;—所以我們最終決定要把我們的數(shù)據(jù)管道的主體部分開(kāi)源出來(lái),然后大家就可以開(kāi)心地迎來(lái)新年假期了。
閑話少說(shuō),下面這些就是Yelp為大家的假期準(zhǔn)備的圣誕禮物:
MySQL Streamer會(huì)不斷地查看MySQL的binlog,得到最新的表變更操作。Streamer負(fù)責(zé)捕獲MySQL數(shù)據(jù)庫(kù)上的單條數(shù)據(jù)更改操作,并把它封裝成Kafka消息,發(fā)布到Kafka的某個(gè)Topic中。如果有必要,也會(huì)做模式轉(zhuǎn)換。 Schematizer服務(wù)會(huì)跟蹤每一條消息所使用的模式信息。在有新模式出現(xiàn)時(shí),Schematizer會(huì)處理注冊(cè)消息,并為下游的表生成更改計(jì)劃。 Data Pipeline clientlib為生產(chǎn)和消費(fèi)Kafka消息提供了非常易用的接口。有了clientlib,就再也不必關(guān)心Kafka的Topic名字、加密或消費(fèi)者程序的分區(qū)情況了。你可以站在表和數(shù)據(jù)庫(kù)的角度去考慮問(wèn)題,不必關(guān)心其它細(xì)節(jié)。 Data Pipeline Avro utility包提供了讀寫(xiě)Avro模式的Python接口。它也可以為表的主鍵等模式信息提供枚舉類,這一點(diǎn)Yelp在實(shí)踐中發(fā)現(xiàn)非常有用。 Yelp Kafka庫(kù)擴(kuò)展了Kafka-python包,并提供了多重處理消費(fèi)者組等新功能。這個(gè)庫(kù)可以幫助大家非常高效地與Kafka進(jìn)行交互。這個(gè)庫(kù)也讓用戶可以判斷出Yelp內(nèi)部的Kafka跨區(qū)域部署情況。數(shù)據(jù)管道中不同組成部分的概覽圖。單個(gè)服務(wù)用方形表示,而共享包用圓角表示。
這些項(xiàng)目每個(gè)都有Docker化的服務(wù),你可以很容易地把它們用到你的架構(gòu)中。我們希望對(duì)于每個(gè)用Python構(gòu)建實(shí)時(shí)流處理程序的開(kāi)發(fā)者來(lái)說(shuō),它們都能有用。
有了之前的文章介紹,現(xiàn)在又有了開(kāi)源的代碼,相信有許多數(shù)據(jù)處理工程師的圣誕假期都會(huì)過(guò)得無(wú)比充實(shí)了。
Yelp的系列文章深度講解了他們?nèi)绾斡?ldquo;確保只有一次”的方式把MySQL數(shù)據(jù)庫(kù)中的改動(dòng)實(shí)時(shí)地以流的方式傳輸出去,他們?nèi)绾巫詣?dòng)跟蹤表模式變化、如何處理和轉(zhuǎn)換流,以及最終如何把這些數(shù)據(jù)存儲(chǔ)到Redshift或Salesforce之類的數(shù)據(jù)倉(cāng)庫(kù)中去。