數(shù)十億筆信用卡在云端交易背后的技術(shù)
譯文【2013年2月21日 51CTO外電頭條】使用信用卡進(jìn)行的支付數(shù)量巨大。很顯然,分析所有交易后得到的數(shù)據(jù)本身就有固有的價(jià)值??蛻糁艺\(chéng)、人口統(tǒng)計(jì)數(shù)據(jù)、活動(dòng)熱圖、商店推薦以及其他許多統(tǒng)計(jì)數(shù)字對(duì)客戶和店家來(lái)說(shuō)都很有用,店家可用來(lái)改進(jìn)與市場(chǎng)的關(guān)系。在Datasalt,我們聯(lián)合西班牙畢爾巴鄂比斯開(kāi)銀行(BBVA)開(kāi)發(fā)出了一款系統(tǒng),能夠分析多年來(lái)的數(shù)據(jù),并且提供不同的低延遲Web和移動(dòng)應(yīng)用程序方面的洞察力和統(tǒng)計(jì)數(shù)字。
除了處理大數(shù)據(jù)輸入外,我們面臨的主要挑戰(zhàn)在于,輸出的也是大數(shù)據(jù),而且比輸入的大數(shù)據(jù)還要龐大。而且必須在高負(fù)載環(huán)境下,迅速提供這種輸出。
我們開(kāi)發(fā)的解決方案其基礎(chǔ)設(shè)施成本每月只有幾千美元,這歸功于使用了云服務(wù)(AWS)、Hadoop和Voldemort。我們會(huì)在下文解釋這個(gè)提議架構(gòu)的幾個(gè)主要特點(diǎn)。
數(shù)據(jù)、目標(biāo)和首要決策
系統(tǒng)使用BBVA銀行在全球各地商店進(jìn)行的信用卡交易,作為用來(lái)分析的輸入源。很顯然,數(shù)據(jù)是匿名的、非個(gè)人的、分離的,目的是為了防止出現(xiàn)任何隱私問(wèn)題。信用卡號(hào)經(jīng)過(guò)了散列處理,故意弄亂。任何因而得到的洞察力始終是聚合信息,所以無(wú)法從中獲得任何個(gè)人的信息。
我們計(jì)算了每家商店、每個(gè)不同時(shí)間段的許多統(tǒng)計(jì)數(shù)字和數(shù)據(jù)。下面是其中一些:
■每家商店的支付數(shù)額的直方圖
■客戶忠誠(chéng)
■客戶人口統(tǒng)計(jì)數(shù)據(jù)
■商店推薦(在此購(gòu)物的客戶還在…購(gòu)物)。按地點(diǎn)和商店類別等標(biāo)準(zhǔn)來(lái)過(guò)濾。
該項(xiàng)目的主要目標(biāo)是,通過(guò)低延遲的Web和移動(dòng)應(yīng)用程序,把這一切信息提供給不同的代理人(商店和客戶)。所以一個(gè)很高的要求就是,能夠在高負(fù)載情況下提供結(jié)果,而延遲不到1秒。又由于這是個(gè)研究項(xiàng)目,需要兼顧代碼和需求方面的高度靈活性。
由于每天只更新一次數(shù)據(jù)不是問(wèn)題,我們選擇了一種面向批處理的架構(gòu)(Hadoop)。我們還選擇了Voldemort,作為只讀存儲(chǔ)區(qū),用于提供Hadoop生成的洞察力;Voldemort是一種簡(jiǎn)單而超快速的鍵/值存儲(chǔ)區(qū),與Hadoop整合得很好。
平臺(tái)
系統(tǒng)搭建在亞馬遜網(wǎng)絡(luò)服務(wù)(AWS)的環(huán)境上。具體來(lái)說(shuō),我們使用簡(jiǎn)單存儲(chǔ)服務(wù)(S3)來(lái)存儲(chǔ)原始輸入數(shù)據(jù),使用Elastic Map Reduce(亞馬遜提供的Hadoop)用于分析,使用彈性計(jì)算云(EC2)來(lái)提供結(jié)果。使用云技術(shù)讓我們得以實(shí)現(xiàn)快速迭代,迅速交付實(shí)用原型,這正是我們對(duì)這種項(xiàng)目提出的要求。
架構(gòu)
架構(gòu)有三個(gè)主要部分:
■數(shù)據(jù)存儲(chǔ):用于維護(hù)原始數(shù)據(jù)(信用卡交易)和因而獲得的Voldemort存儲(chǔ)區(qū)。
■數(shù)據(jù)處理:在Elastic Map Reduce上運(yùn)行的 Hadoop工作流程執(zhí)行所有計(jì)算,并創(chuàng)建Voldemort所需的數(shù)據(jù)存儲(chǔ)區(qū)。
■數(shù)據(jù)提供:Voldemort集群從數(shù)據(jù)處理層提供預(yù)計(jì)算的數(shù)據(jù)。
該銀行每天把當(dāng)日進(jìn)行的所有交易上傳到S3中的一個(gè)文件夾中。這讓我們得以保留所有的歷史數(shù)據(jù)——每一天進(jìn)行的所有信用卡交易。所有這些數(shù)據(jù)是處理層的輸入部分,所以我們重新計(jì)算一切,每天都是如此。重新處理所有數(shù)據(jù)讓我們得以非常敏捷靈活。要是需求發(fā)生變化,或者要是我們找到了一個(gè)愚蠢的錯(cuò)誤,我們只需更新項(xiàng)目代碼,下一次批處理后,所有數(shù)據(jù)都得到了修復(fù)。這個(gè)開(kāi)發(fā)決策為我們帶來(lái)了:
■簡(jiǎn)化的代碼庫(kù)及架構(gòu);
■靈活應(yīng)對(duì)變化的能力;
■易于處理人為錯(cuò)誤的能力(只要修復(fù)錯(cuò)誤,重新啟動(dòng)過(guò)程)。
控制器啟動(dòng)Elastic Map Reduce上的新Hadoop集群,并啟動(dòng)處理流程,每天執(zhí)行一次。這個(gè)流程由大約16個(gè)計(jì)算不同洞察力的Tuple MapReduce作業(yè)(http://www.datasalt.com/2012/02/tuple-mapreduce-beyond-the-classic-mapreduce/)組成。流程的***一個(gè)部分(Voldemort檢索器)負(fù)責(zé)創(chuàng)建數(shù)據(jù)存儲(chǔ)區(qū)文件,這些文件以后將部署到Voldemort。一旦該流程完成,因而獲得的數(shù)據(jù)存儲(chǔ)區(qū)文件將上傳到S3??刂破麝P(guān)閉Hadoop集群,并將部署請(qǐng)求發(fā)送到Voldemort。然后,Voldemort從S3下載新的數(shù)據(jù)存儲(chǔ)區(qū),并執(zhí)行熱交換操作,完全更換舊的數(shù)據(jù)存儲(chǔ)區(qū)。
技術(shù)
Hadoop和Pangool
整個(gè)分析和處理流程使用基于Hadoop上的Pangool作業(yè)(http://pangool.net/)來(lái)實(shí)現(xiàn)。這讓我們很好地兼顧了性能、靈活性以及敏捷性。使用tuples讓我們得以使用簡(jiǎn)單的數(shù)據(jù)類型(int和string),在流程之間傳輸信息;與此同時(shí),我們可以添加其他的復(fù)雜對(duì)象(比如直方圖),連同它們自己的自定義序列化。
此外,由于Pangool仍是一種低級(jí)API(應(yīng)用編程接口),我們可以在需要時(shí),對(duì)每一個(gè)作業(yè)進(jìn)行多次微調(diào)。
Voldemort
Voldemort是由LinkedIn開(kāi)發(fā)的一種鍵/值NoSql數(shù)據(jù)庫(kù),基于亞馬遜的Dynamo(http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html)概念。
Voldemort背后的主要想法是,把數(shù)據(jù)分成多個(gè)部分。每個(gè)部分在Voldemort集群的節(jié)點(diǎn)中加以復(fù)制和提供。每個(gè)Voldemort守護(hù)程序都能將查詢傳送到為某一個(gè)鍵保留值的那個(gè)節(jié)點(diǎn)。Voldemort支持快速讀取和隨機(jī)寫(xiě)入,但是就這個(gè)項(xiàng)目而言,我們使用Voldemort作為只讀數(shù)據(jù)存儲(chǔ)區(qū),在每個(gè)批處理過(guò)程后更換所有數(shù)據(jù)部分。由于數(shù)據(jù)存儲(chǔ)區(qū)由Hadoop預(yù)先生成,查詢服務(wù)并不受部署過(guò)程的影響。這是使用這種只讀批處理方法的優(yōu)點(diǎn)之一。我們還可以根據(jù)需要,靈活地更改集群的拓?fù)浣Y(jié)構(gòu),并重新均衡數(shù)據(jù)。
Voldemort提供了Hadoop MapReduce作業(yè),可以在分布式集群下創(chuàng)建數(shù)據(jù)存儲(chǔ)區(qū)。數(shù)據(jù)的每個(gè)部分只是Berkeley DB B樹(shù)(http://en.wikipedia.org/wiki/B-tree)。
Voldemort的接口是TCP,但我們希望使用HTTP來(lái)提供數(shù)據(jù)。VServ是一種簡(jiǎn)單的HTTP服務(wù)器,可以把進(jìn)入的HTTP請(qǐng)求轉(zhuǎn)變成Voldemort TCP請(qǐng)求。負(fù)載均衡系統(tǒng)負(fù)責(zé)在所有VServ之間分配查詢。
經(jīng)過(guò)計(jì)算的數(shù)據(jù)
統(tǒng)計(jì)數(shù)字
分析過(guò)程的一個(gè)環(huán)節(jié)包括計(jì)算簡(jiǎn)單的統(tǒng)計(jì)數(shù)字:平均值、***值、最小值、標(biāo)準(zhǔn)差、獨(dú)特的計(jì)數(shù)等。它們使用眾所周知的MapReduce方法來(lái)實(shí)現(xiàn)。但我們還計(jì)算了一些直方圖。為了使用Hadoop高效地實(shí)現(xiàn)它們,我們創(chuàng)建了一種自定義直方圖,只需要一遍就可以計(jì)算。此外,我們還能計(jì)算每次交易的所有簡(jiǎn)單統(tǒng)計(jì)數(shù)字以及與之相關(guān)的直方圖,只要使用一個(gè)MapReduce步驟,可以是隨意的時(shí)間段。
為了減少直方圖所使用的存儲(chǔ)量,并且改進(jìn)可視化,許多顏色區(qū)間(bin)形成的原始的計(jì)算直方圖被轉(zhuǎn)換成顏色區(qū)間寬度可變的直方圖。下列圖表顯示了某個(gè)直方圖的3個(gè)顏色區(qū)間的***直方圖。
***直方圖使用一種隨機(jī)重復(fù)爬山法(random-restart hill climbing)近似算法來(lái)計(jì)算。下列圖表顯示了每一次爬山迭代過(guò)程中可能出現(xiàn)的變化:
事實(shí)證明這種算法非??焖?、非常準(zhǔn)確:與精確的動(dòng)態(tài)算法相比,我們獲得了99%的準(zhǔn)確性,而速度提高了一倍。
商務(wù)方面的推薦
使用同現(xiàn)(co-ocurrences)來(lái)計(jì)算推薦。也就是說(shuō),如果某人在A商店和B商店都購(gòu)買(mǎi)了東西,那么A商店與B商店之間就存在一種同現(xiàn)。即使顧客在A商店和B商店都購(gòu)買(mǎi)了數(shù)次,被考慮進(jìn)來(lái)的也只有一次同現(xiàn)。
但需要對(duì)這個(gè)簡(jiǎn)單的同現(xiàn)概念加以一些改進(jìn)。首先,使用一種簡(jiǎn)單的頻切方法(frequency cut),將***的商店過(guò)濾出來(lái),因?yàn)椴畈欢嗝總€(gè)人都在這些商店購(gòu)物。所以推薦它們毫無(wú)意義。可以按地點(diǎn)(彼此挨得很近的商店)、商店類別或這兩者過(guò)濾推薦,這也有助于改進(jìn)推薦。基于時(shí)間的同現(xiàn)形成了更熱門(mén)的推薦與“總是適用”的推薦。限制同現(xiàn)可能出現(xiàn)的時(shí)間帶來(lái)了這種商店推薦:人們?cè)?**家商店購(gòu)物后馬上到第二家商店購(gòu)物。
Hadoop和Pangool是計(jì)算同現(xiàn)、生成推薦的***工具,不過(guò)一些挑戰(zhàn)并不容易克服。尤其是,如果一個(gè)顧客在多家商店支付,該信用卡的同現(xiàn)數(shù)量就會(huì)呈平方增長(zhǎng),使得分析不呈現(xiàn)線性擴(kuò)展。由于這是罕見(jiàn)情況,我們完全限制了每張卡的同現(xiàn)數(shù)量,只考慮顧客買(mǎi)得最多的情況。
成本和一些數(shù)據(jù)
就BBVA一年下來(lái)在西班牙的信用卡交易而言,用Voldemort提供的信息量是270 GB。整個(gè)處理流程在24個(gè)亞馬遜EC2“m 1.large”實(shí)例組成的集群上需要耗時(shí)11個(gè)小時(shí)才完成。整套基礎(chǔ)設(shè)施(包括提供隨后數(shù)據(jù)所需的EC2實(shí)例)成本約為每個(gè)月3500美元。
仍然存在有待優(yōu)化的空間。但是考慮到該解決方案敏捷、靈活,而且在云端,價(jià)格相當(dāng)合理。在一套內(nèi)部基礎(chǔ)設(shè)施上運(yùn)行的系統(tǒng)其成本將會(huì)低得多。
結(jié)論與展望
由于使用了Hadoop、亞馬遜網(wǎng)絡(luò)服務(wù)和NoSQL數(shù)據(jù)庫(kù)等技術(shù),有可能迅速開(kāi)發(fā)出這樣的解決方案:具有可擴(kuò)展性和靈活性,準(zhǔn)備經(jīng)受得住人為失誤,而且成本合理。
未來(lái)的工作將包括把Voldemort換成Splout SQL(http://sploutsql.com/),這便于部署Hadoop生成的數(shù)據(jù)集,并將低延遲鍵/值擴(kuò)展到低延遲SQL。這將縮短分析時(shí)間以及提供的數(shù)據(jù)量,因?yàn)樵S多聚合可以“實(shí)時(shí)”執(zhí)行。比如說(shuō),它允許在任意時(shí)間段進(jìn)行聚合統(tǒng)計(jì)分析,如果進(jìn)行預(yù)先計(jì)算是不可能實(shí)現(xiàn)的。