推薦系統(tǒng)之Lambda架構(gòu)

1.Lambda介紹:

提出者:Twitter工程師Nathan Marz提出,同時(shí)是Storm項(xiàng)目發(fā)起人
Lambda作用:Lambda系統(tǒng)架構(gòu)提供了一個(gè)結(jié)合實(shí)時(shí)數(shù)據(jù)和Hadoop預(yù)先計(jì)算的數(shù)據(jù)環(huán)境下的混合平臺(tái),以提供一個(gè)實(shí)時(shí)的數(shù)據(jù)視圖

2.分層架構(gòu)

架構(gòu)圖如下:


1.批處理層

概述:離線處理數(shù)據(jù),服務(wù)層會(huì)根據(jù)批處理層生成批處理視圖,接著通過(guò)前端的交互式工具進(jìn)行查詢(xún)模型構(gòu)建的視圖(批處理層可以通過(guò)數(shù)據(jù)倉(cāng)庫(kù)建模的方式來(lái)將數(shù)據(jù)進(jìn)行可視化建模,例如構(gòu)建用戶(hù)畫(huà)像)
特點(diǎn):
1.數(shù)據(jù)不可變(hdfs的特點(diǎn),只可追加不可修改)
2.可進(jìn)行任何計(jì)算:
1)可以有任何類(lèi)型的輸入和輸出,并且在中間的轉(zhuǎn)換過(guò)程中可以分成靈活的定制和配置
2)例如一個(gè)MapReduce種你可以實(shí)現(xiàn)多個(gè)MapReduce作業(yè),或者一個(gè)MapReduce中可以實(shí)現(xiàn)多個(gè)map或者多個(gè)reduce,reduce之后再map,把作業(yè)串接起來(lái),形成一整個(gè)工作流來(lái)進(jìn)行復(fù)雜的作業(yè)
3)在spark當(dāng)中也是一樣,spark作業(yè)本質(zhì)也是分成map和reduce兩個(gè)階段,只不過(guò)在每個(gè)階段中已經(jīng)提供了非常豐富的已有的一些實(shí)現(xiàn)或者算子能夠讓你基于這些算子快速的進(jìn)行數(shù)據(jù)處理和分析,它在調(diào)度上是整體進(jìn)行一個(gè)圖的調(diào)度。(比如map端有map算子或者flatmap,或者filter,在reduce階段有reducebykey,groupByKey或者sortByKey等等一系列算子,每一種map或者reduce階段的操作其實(shí)本質(zhì)上會(huì)生成一個(gè)RDD,它就不斷去轉(zhuǎn)換這個(gè)RDD,也可以完成一個(gè)復(fù)雜的數(shù)據(jù)處理)
所以說(shuō)MapReduce和spark可以進(jìn)行任何計(jì)算。
3.水平擴(kuò)展:
得益于整個(gè)Hadoop集群主從架構(gòu),當(dāng)我們?cè)黾痈嗟膕lave節(jié)點(diǎn),也就使得hdfs存儲(chǔ)量會(huì)更大,所以會(huì)存儲(chǔ)更大的數(shù)據(jù)量,同時(shí)會(huì)擴(kuò)展yarn的集群,使得它的MapReduce和spark并行處理能力也得到了提升。
4.高延遲:
通常是T+1的處理,也就是說(shuō)我們今天處理的數(shù)據(jù)是昨天匯總的數(shù)據(jù),通常很多大數(shù)據(jù)平臺(tái)進(jìn)行批處理都是在凌晨來(lái)進(jìn)行跑批量,一天從早上9點(diǎn)到下午6點(diǎn)或者到晚上10點(diǎn)都是業(yè)務(wù)窗口期,而凌晨到5點(diǎn)之間就是批處理跑數(shù)據(jù)的時(shí)間,跑完之后第二天就可以看到前一天批處理得到的結(jié)果,所以說(shuō)它是高延遲。延遲時(shí)間一般是4到5個(gè)小時(shí)。

組件:
1.flume日志收集
從web日志采集到hdfs,如下圖:

2.sqoop日志收集
從關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)采集到hdfs,如下圖:


分布式存儲(chǔ)系統(tǒng):
hdfs存儲(chǔ)適合128M的大文件,不適合小文件,因?yàn)閚amenode會(huì)將所有元數(shù)據(jù)加載到內(nèi)存的,如果小文件太多,其實(shí)會(huì)影響namenode的訪問(wèn)效率和擴(kuò)展性,那么這時(shí)批處理層可以使用分布式存儲(chǔ)系統(tǒng)HBASE來(lái)存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù)。
HBASE和HDFS是互補(bǔ)的,HDFS適合連續(xù)的流式訪問(wèn),但是它不能更新,而HBASE可以滿足基于Rowkey的隨機(jī)訪問(wèn),所以HBASE是在隨機(jī)讀寫(xiě)方面的效率非常高的,還可以滿足海量數(shù)據(jù)的存儲(chǔ)。
如下圖:

分布式計(jì)算:

MapReduce和spark之間的區(qū)別:
1.調(diào)度方式上
MapReduce是每個(gè)作業(yè)單獨(dú)調(diào)度的,而spark是圖調(diào)度的,根據(jù)整個(gè)RDD血緣關(guān)系進(jìn)行整體的圖調(diào)度,所以效率比MapReduce要優(yōu)。
2.MapReduce計(jì)算中,map到reduce之間的shuffle過(guò)程會(huì)進(jìn)行大量寫(xiě)磁盤(pán)操作,reduce階段也會(huì)寫(xiě)HDFS,效率非常低。而spark全部是基于內(nèi)存
3.對(duì)開(kāi)發(fā)來(lái)說(shuō),開(kāi)發(fā)spark更加方便,因?yàn)樗峁┝艘恍┓奖愕乃阕?,比如map,flatmap,只需要去調(diào)用這些函數(shù),輸入一些參數(shù),就可以得到一個(gè)你想要的的結(jié)果,基于這個(gè)結(jié)果又
進(jìn)行作為下一個(gè)函數(shù)的參數(shù)來(lái)輸入,開(kāi)發(fā)起來(lái)非常地方便。
產(chǎn)生視圖:

數(shù)據(jù)集通過(guò)mr或者spark計(jì)算的結(jié)果推送到HDFS,HBASE,redis緩存。前端直接從redis去提取視圖的結(jié)果。
數(shù)據(jù)序列化:
序列化:就是把內(nèi)存的數(shù)據(jù)導(dǎo)出到磁盤(pán),從磁盤(pán)讀回到內(nèi)存,就是反序列化。
數(shù)據(jù)通常是按照什么樣的方式來(lái)序列化?
在開(kāi)發(fā)過(guò)程中,你指定的schema或者類(lèi)型,你的Java對(duì)象,比如指定的是string類(lèi)型,就是按照string來(lái)進(jìn)行序列化,
為數(shù)據(jù)設(shè)置schema(元數(shù)據(jù)):
1.保證數(shù)據(jù)一致性,處理過(guò)程中是處理同一個(gè)schema(json自帶schema)
2.保證數(shù)據(jù)合法性驗(yàn)證(讀寫(xiě)規(guī)范)
3.避免數(shù)據(jù)損壞
選擇序列化框架:
1.Thrift(Facebook)
hive自帶了thrift,所以能通過(guò)jdbc直接訪問(wèn)hive
2.Protocol buffer(Google)
3.Avro(Apache)
Avro處理格式用的非常多的,通常會(huì)把Avro數(shù)據(jù)格式作為大數(shù)據(jù)平臺(tái)通用存儲(chǔ)的一種格式,它的通用性也比較好
視圖存儲(chǔ)數(shù)據(jù)庫(kù):
1.HBASE:
強(qiáng)調(diào)CP(一致性)
存儲(chǔ)量大,使用HBASE,但HBASE不能進(jìn)行匯總,這時(shí)可以采用hive做映射
2.Cassandra:
強(qiáng)調(diào)AP(高可用性),它是分布式,也是nosql的一種,但它的架構(gòu)沒(méi)有一個(gè)固定主節(jié)點(diǎn),主節(jié)點(diǎn)是漂移的一個(gè)狀態(tài),它更加強(qiáng)調(diào)其他的可用性,掛掉了一個(gè)節(jié)點(diǎn),照樣可以對(duì)外提供服務(wù)
3.Impala:
滿足前端交互式BI,提供了非常高效專(zhuān)用的sql引擎,架構(gòu)師mpp架構(gòu),更符合BI多維的使用場(chǎng)景。
4.Rdis/memcache:
高效的向前端展現(xiàn)可以使用redis,但是可靠性不高,尤其是memcache,完全是存放內(nèi)存中的,一旦宕機(jī),數(shù)據(jù)就會(huì)丟失,但是它主要滿足的就是非常高效和低延遲。redis相對(duì)來(lái)說(shuō)更強(qiáng)大一些,比如支持多類(lèi)型存儲(chǔ),持久化磁盤(pán)。
5.MySQL

2.實(shí)時(shí)處理層


以上是實(shí)時(shí)處理的簡(jiǎn)圖,它跟批處理很大的不同點(diǎn)是:批處理是先把當(dāng)天或最近一段時(shí)間的批量數(shù)據(jù)存儲(chǔ)在HDFS,HDFS會(huì)存儲(chǔ)所有的歷史數(shù)據(jù),再基于這些數(shù)據(jù)進(jìn)行mr或spark計(jì)算。而流處理是對(duì)實(shí)時(shí)產(chǎn)生的點(diǎn)擊流實(shí)時(shí)的進(jìn)行處理,沒(méi)有延遲。
實(shí)時(shí)層特點(diǎn):
1.流式處理:
分兩種:
1)spark-streaming微批次,可以設(shè)置批次的間隔時(shí)間,間隔時(shí)長(zhǎng)設(shè)置非常小的時(shí)候,實(shí)際就是流處理。
2)storm:真正的流處理
2.持續(xù)計(jì)算:對(duì)批處理來(lái)說(shuō)會(huì)有預(yù)期的起始和結(jié)束的時(shí)間,而實(shí)時(shí)計(jì)算不會(huì)停止
3.存儲(chǔ)和分析某個(gè)窗口期內(nèi)的數(shù)據(jù):實(shí)時(shí)處理也可以理解為非常小的批次,但一般來(lái)講是秒級(jí),spark可以做到的最低粒度是秒級(jí),而storm可以做到毫秒級(jí)
4.最終正確性:保證了最終的結(jié)果是正確的,有些算法很難實(shí)時(shí)運(yùn)算,此時(shí)采用估算值即可。
實(shí)時(shí)數(shù)據(jù)收集

和批次數(shù)據(jù)采集基本一樣,采用flume的OG或者NG,使用NG,把collector改為agent即可。flume數(shù)據(jù)在批次處理是直接寫(xiě)到hdfs,而在流處理中,保證數(shù)據(jù)處理的吞吐量,通常會(huì)采用kafka,因?yàn)閗afka和許多流處理框架結(jié)合的比較好,并且flume也支持kafka的輸出,flume默認(rèn)有kafka sink的實(shí)現(xiàn),可以直接把數(shù)據(jù)給到kafka,kafka再寫(xiě)入到storm中進(jìn)行消費(fèi)

實(shí)時(shí)數(shù)據(jù)分析


加入我們選擇的是storm作為流式處理框架,那么構(gòu)建的是Topology(拓?fù)浣Y(jié)構(gòu)),在Topology中有一些組件(spout,bolt),spout把數(shù)據(jù)接收過(guò)來(lái),然后發(fā)送給后端,這一步是分發(fā)數(shù)據(jù)的。而bolt實(shí)際做一些Transformation(轉(zhuǎn)換)操作,所以會(huì)有很多bolt,bolt1處理完給bolt2等。把這一系列流程連接起來(lái),就是拓?fù)浣Y(jié)構(gòu)了。
數(shù)據(jù)源像水龍頭一樣,storm處理的數(shù)據(jù)單元,叫做tuple,每一個(gè)數(shù)據(jù)是一個(gè)元祖,不斷地流入進(jìn)來(lái),然后經(jīng)過(guò)spout或者bolt源源不斷地進(jìn)行處理

實(shí)時(shí)處理層:視圖存儲(chǔ)數(shù)據(jù)庫(kù)
和批次處理一樣的,實(shí)時(shí)存儲(chǔ)數(shù)據(jù)庫(kù)如下:
HBASE
Cassandra
Impala
Redis/memcache
MySQL
和批次處理不一樣的是,實(shí)時(shí)地進(jìn)行數(shù)據(jù)插入。

3.服務(wù)層

對(duì)批處理層和實(shí)時(shí)處理層已經(jīng)得到的數(shù)據(jù)結(jié)果基礎(chǔ)之上,來(lái)把最終結(jié)果進(jìn)行推薦或者展示等等
服務(wù)層特點(diǎn)
1.支持隨機(jī)讀
從批處理或者實(shí)時(shí)處理的視圖中把結(jié)果進(jìn)行合并,放到緩存中,然后通過(guò)web服務(wù)進(jìn)行展現(xiàn)
2.需要在非常短的時(shí)間內(nèi)返回結(jié)果
一般會(huì)用到一些內(nèi)存數(shù)據(jù)庫(kù)或者緩存機(jī)制等
3.讀取batch layer和speed layer結(jié)果,并對(duì)其歸并

3.應(yīng)用

1.Lambda架構(gòu)的實(shí)現(xiàn)demo1

這個(gè)案例是通過(guò)Lambda架構(gòu),去實(shí)現(xiàn)對(duì)Linux的一些操作日志進(jìn)行審批,比如一些非法的行為,或者影響性能的操作,那么我們可以這樣的架構(gòu)來(lái)發(fā)現(xiàn),對(duì)Linux性能也同時(shí)可以監(jiān)控,比如磁盤(pán)使用超標(biāo)或者用到大量虛擬內(nèi)存,都可以用這樣一套架構(gòu)實(shí)時(shí)采集,實(shí)時(shí)報(bào)警,實(shí)時(shí)展現(xiàn),大大方便了我們系統(tǒng)管理員來(lái)進(jìn)行系統(tǒng)的維護(hù)。



這個(gè)demo中,首先在數(shù)據(jù)采集左邊那部分,中間上半部分是批處理,中間下半部分是流處理。
左邊部分采集用flume agent,采集給kafka。kafka給批處理層的CAMUS,(CAMUS是用來(lái)把kafka數(shù)據(jù)讀取到hdfs或者mr,所以CAMUS就是一個(gè)MapReduce讀取作業(yè))讀取完成后再給下一個(gè)MapReduce作業(yè),mr結(jié)束后寫(xiě)入hdfs,多個(gè)MapReduce作業(yè)的調(diào)度使用Oozie進(jìn)行統(tǒng)一調(diào)度,最終結(jié)果寫(xiě)入hbase。
實(shí)時(shí)層同理,將kafka的數(shù)據(jù)實(shí)時(shí)計(jì)算,結(jié)果存儲(chǔ)到HBASE。
右邊部分是服務(wù)層,服務(wù)層用來(lái)展現(xiàn),展現(xiàn)用到kettle(etl框架),使用它將HBASE數(shù)據(jù)讀進(jìn)來(lái),再進(jìn)行前端展示(例如柱狀圖,餅狀圖等)

2.Lambda架構(gòu)的實(shí)現(xiàn)demo2

第二個(gè)實(shí)例是要進(jìn)行圖像的展現(xiàn)



中間上半部分是數(shù)據(jù)收集層:kafka,采集到的數(shù)據(jù)給批處理層和實(shí)時(shí)層,左邊上半部分是批處理層,右邊是實(shí)時(shí)處理層。
批處理:pixel處理的是圖片,S3是亞馬遜的分布式存儲(chǔ)系統(tǒng),再通過(guò)spark作業(yè)進(jìn)行批處理
流處理:storm集群,bolt實(shí)時(shí)對(duì)數(shù)據(jù)轉(zhuǎn)換
Shared Libraries:spark和storm之間共享的庫(kù)。結(jié)果spark寫(xiě)入到歷史索引,storm寫(xiě)到實(shí)時(shí)索引

3.Lambda架構(gòu)的實(shí)現(xiàn)demo3

應(yīng)用舉例:用戶(hù)卡欺詐系統(tǒng),系統(tǒng)架構(gòu)如下圖



1.數(shù)據(jù)采集:
判斷用戶(hù)是否為欺詐用戶(hù),我們可以通過(guò)前端埋點(diǎn)實(shí)時(shí)采集到用戶(hù)請(qǐng)求行為,可以通過(guò)flume采集到hdfs,交易數(shù)據(jù)存儲(chǔ)到MySQL或者Oracle,這些數(shù)據(jù)我們可以加載到HBASE活hdfs上。
2.建模:
構(gòu)建用戶(hù)畫(huà)像,了解這個(gè)用戶(hù)的特征是否是欺詐的用戶(hù),可以抽取一些特征值,借助一些機(jī)器學(xué)習(xí)的算法來(lái)進(jìn)行分類(lèi)判斷,計(jì)算過(guò)程可以通過(guò)MapReduce或者spark
3.實(shí)時(shí)采集:
通過(guò)flume對(duì)接kafka消息隊(duì)列,kafka來(lái)提供消息的可靠和高吞吐,然后將數(shù)據(jù)發(fā)送給storm,storm里面構(gòu)建一個(gè)拓?fù)?,這個(gè)拓?fù)浠厝ビ?jì)算這個(gè)用戶(hù)他的行為跟我們前面的批處理的結(jié)果進(jìn)行比較,最后把結(jié)果推送到redis等緩存區(qū)。然后讓我們的系統(tǒng)執(zhí)行下一步操作,如果結(jié)果是欺詐用戶(hù),就自動(dòng)凍結(jié)他的資產(chǎn)或者進(jìn)行告警燈。
4.批處理層:


4.Lambda在推薦系統(tǒng)中的應(yīng)用:

1.批處理層:放模型
2.實(shí)時(shí)層:實(shí)時(shí)采集用戶(hù)訪問(wèn)行為,然后給用戶(hù)實(shí)時(shí)推薦
具體框架圖如下:



上圖中MapReduce可以用spark替代,storm可以用sparkstreaming來(lái)替代

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容