很可惜 T 。T 您現(xiàn)在還不是作者身份,不能自主發(fā)稿哦~
如有投稿需求,請(qǐng)把文章發(fā)送到郵箱tougao@appcpx.com,一經(jīng)錄用會(huì)有專人和您聯(lián)系
咨詢?nèi)绾纬蔀榇河鹱髡哒?qǐng)聯(lián)系:鳥哥筆記小羽毛(ngbjxym)
導(dǎo)讀:本系列文章將從最簡(jiǎn)單的概念開始,逐步講解推薦系統(tǒng)的發(fā)展歷程和最新實(shí)踐。以產(chǎn)品經(jīng)理的視角,闡述推薦系統(tǒng)涉及的算法,技術(shù)和架構(gòu)。本章將系統(tǒng)性地介紹推薦系統(tǒng)的基石之一:大數(shù)據(jù)。
大數(shù)據(jù)是數(shù)據(jù)智能時(shí)代的“鐵公基”,是一系列計(jì)算和存儲(chǔ)的基礎(chǔ)設(shè)施。推薦系統(tǒng)也是建立在大數(shù)據(jù)的基礎(chǔ)之上的,大量的數(shù)據(jù)挖掘和模型訓(xùn)練都離不開大數(shù)據(jù)。
大數(shù)據(jù)這個(gè)名詞起的很好,對(duì)于非技術(shù)人員來(lái)說(shuō)也能get到大的含義:數(shù)據(jù)量大,算力強(qiáng)大。但是這強(qiáng)大的能力是怎么來(lái)的?大數(shù)據(jù)生態(tài)體系架構(gòu)是怎么分工的?不具體做過(guò)的同學(xué)并不清楚。今天就繼續(xù)站在產(chǎn)品經(jīng)理的角度深入淺出地來(lái)講述這些問(wèn)題。其實(shí)不一定是產(chǎn)品經(jīng)理,對(duì)大數(shù)據(jù)感興趣的同學(xué)都可以看看。本文比較長(zhǎng),如果時(shí)間不夠,建議先mark下。
在大數(shù)據(jù)技術(shù)誕生之前,數(shù)據(jù)的存儲(chǔ)和處理大半壁江山都是Oracle和MySql和等數(shù)據(jù)庫(kù)軟件的。這些傳統(tǒng)數(shù)據(jù)庫(kù)的文件系統(tǒng)是單機(jī)的,也就是說(shuō),數(shù)據(jù)只能在一臺(tái)機(jī)器上跑。它們?cè)谔幚沓蒚B(1024GB)甚至上PB(1024TB)級(jí)別數(shù)據(jù)時(shí)就會(huì)特別吃力。
第一個(gè)解決了這個(gè)問(wèn)題的公司是谷歌。谷歌解決這個(gè)問(wèn)題的思路就是分布式。谷歌分別于2003-2004年發(fā)表了三篇重量級(jí)的論文,奠定了大數(shù)據(jù)的基礎(chǔ)。簡(jiǎn)單的說(shuō),谷歌通過(guò)論文公布了以下三個(gè)工具如何創(chuàng)造:
分布式文件系統(tǒng):Google File System
分布式并行計(jì)算框架:Google MapReduce
分布式數(shù)據(jù)庫(kù):BigTable
這個(gè)就是大數(shù)據(jù)技術(shù)的開始。從谷歌的這個(gè)原點(diǎn)開始,大數(shù)據(jù)經(jīng)過(guò)多年發(fā)展,形成了今天的全貌??梢杂靡韵氯齻€(gè)分類來(lái)去解構(gòu)整個(gè)大數(shù)據(jù)生態(tài):
分布式存儲(chǔ):把文件切成多份,分布地存儲(chǔ)到多臺(tái)機(jī)器上。常用的組件有:HDFS,HBase等。
分布式計(jì)算:把數(shù)據(jù)計(jì)算的任務(wù)切分成多個(gè),分配到多臺(tái)機(jī)器上計(jì)算。常用的組件有:MapReduce,Spark,Storm,F(xiàn)link等。
分布式工具:數(shù)據(jù)輔助類工具,資源調(diào)度管理工具等。常見的組件有:YARN,Hive,F(xiàn)lume,Sqoop,Elastic Search,ZooKeeper等。
大數(shù)據(jù)整個(gè)生態(tài)體系非常龐大,相關(guān)的產(chǎn)品不勝枚舉,讓人看著眼花繚亂,有種物種大爆發(fā)的感覺。但是也并非無(wú)跡可尋。我們理解大數(shù)據(jù)生態(tài),從這三個(gè)方面去理解就會(huì)輕松很多。本文也是嚴(yán)格按照這個(gè)方式來(lái)講述。
鑒于大數(shù)據(jù)生態(tài)過(guò)于龐大復(fù)雜,為了使得文章更加淺顯易懂,本文不對(duì)技術(shù)概念做過(guò)多的描述,而是直接到操作層面,以圖示的方式講解。因?yàn)橐v述的是數(shù)據(jù)系統(tǒng),我這里建一張數(shù)據(jù)表USER,用這張數(shù)據(jù)表在各個(gè)系統(tǒng)中處理過(guò)程來(lái)給大家講述大數(shù)據(jù)各個(gè)組件的工作原理和機(jī)制。
整個(gè)互聯(lián)網(wǎng)技術(shù)生態(tài)圈中,谷歌是超級(jí)績(jī)優(yōu)生。每次發(fā)表論文,都會(huì)引起眾多人員前來(lái)“抄作業(yè)”。Hadoop之父Doug Cutting和他的團(tuán)隊(duì)就是其中一個(gè)。他花了兩年的業(yè)余時(shí)間,照著谷歌的論文實(shí)現(xiàn)了一個(gè)分布式數(shù)據(jù)系統(tǒng),并用自己兒子的大象毛絨玩具的名字給這個(gè)系統(tǒng)命名為Hadoop。Hadoop的Logo也是個(gè)頭大象。
后來(lái)到了2006年,Hadoop被引入Apache基金會(huì),成為一個(gè)開源的頂級(jí)項(xiàng)目。隨著Hadoop的不斷發(fā)展,在Hadoop項(xiàng)目中,誕生了HBase,Hive,Pig,Zookeeper等子項(xiàng)目,并先后被Apache基金會(huì)將其獨(dú)立升級(jí)成為頂級(jí)項(xiàng)目。同時(shí),Apache基金會(huì)也不斷兼收并蓄其他大數(shù)據(jù)項(xiàng)目,基本把絕大多數(shù)優(yōu)秀的大數(shù)據(jù)項(xiàng)目都收入麾下,大有天下武功出少林的味道。大數(shù)據(jù)各種開源組件中,Apache旗下的才是少林正宗。
閑話不多說(shuō)。我們來(lái)講Hadoop。
現(xiàn)在的Hadoop主要分三個(gè)部分:
分布式存儲(chǔ):HDFS(Hadoop Distributed File System),一個(gè)高可靠、高吞吐量的分布式文件系統(tǒng),實(shí)現(xiàn)海量數(shù)據(jù)存儲(chǔ)。
分布式計(jì)算:MapReduce,一個(gè)分布式離線并行計(jì)算計(jì)算框架,實(shí)現(xiàn)海量計(jì)算。
分布式工具:YARN,一個(gè)集群資源調(diào)度管理的框架,實(shí)現(xiàn)硬件資源的調(diào)配。
這里先具象的解釋下,什么是大數(shù)據(jù)的分布式長(zhǎng)什么樣?
我們?cè)诎惭bHadoop的時(shí)候,要把同一個(gè)Hadoop的軟件安裝包,安裝在三臺(tái)以上不同的機(jī)器上。安裝好后,我們就可以得到一個(gè)Hadoop分布式集群。
如下圖,我們將Hadoop的三個(gè)組件,安裝在集群每一臺(tái)機(jī)器上,這個(gè)集群有七臺(tái)機(jī)器。每一臺(tái)機(jī)器叫一個(gè)節(jié)點(diǎn)。這七個(gè)節(jié)點(diǎn)中,要選出一個(gè)做老大,我們有什么事情先找這個(gè)老大,這個(gè)就是主節(jié)點(diǎn)。因?yàn)橹鞴?jié)點(diǎn)很重要,它要是掛了,整個(gè)集群就掛了。所以一般主節(jié)點(diǎn)配置兩臺(tái),一臺(tái)備份。其他五個(gè)節(jié)點(diǎn)叫做從節(jié)點(diǎn)。在Hadoop中,主節(jié)點(diǎn)命名為Master,從節(jié)點(diǎn)為Slave。
下面將Hadoop的第一個(gè)組件HDFS。HDFS作為分布式的文件系統(tǒng),它是以文本的方式來(lái)保存數(shù)據(jù)的,也就是說(shuō),數(shù)據(jù)一般會(huì)跟我們的TXT文件那樣。一個(gè)文件會(huì)被按照設(shè)定,切分成不同的數(shù)據(jù)塊,然后每個(gè)數(shù)據(jù)塊會(huì)被復(fù)制成多份,然后分布式地存到不同的節(jié)點(diǎn)中。HDFS把集群節(jié)點(diǎn)分成兩類:NameNode和DataNode。
NameNode可以理解成數(shù)據(jù)目錄,它記錄了每個(gè)數(shù)據(jù)塊在哪臺(tái)機(jī)器的哪個(gè)位置。這個(gè)功能由主節(jié)點(diǎn)承擔(dān)。
DataNode顧名思義就是存數(shù)據(jù)的節(jié)點(diǎn)了。
下面以USER數(shù)據(jù)表為例,舉例說(shuō)明HDFS的運(yùn)作過(guò)程。實(shí)際的系統(tǒng)中,因?yàn)镹ameNode負(fù)荷比較重,會(huì)設(shè)置一個(gè)SecondaryNameNode來(lái)協(xié)助NameNode的工作(注意是協(xié)助,而不是備份)。
上圖中:
HDFS先把深藍(lán)色的文本數(shù)據(jù)切分成三份。每份數(shù)據(jù)按照系統(tǒng)設(shè)定,如64MB或128MB一塊。
將三份數(shù)據(jù)塊復(fù)制成三份,這樣就有九份數(shù)據(jù)。
把上一步得到的九份數(shù)據(jù)劃分到不同的DataNode中,并建好目錄。
按照儲(chǔ)存分配,把各個(gè)數(shù)據(jù)塊保存。
HDFS優(yōu)點(diǎn):數(shù)據(jù)容量大,是大數(shù)據(jù)最主要的數(shù)據(jù)存儲(chǔ)方式。很多其他組件都是建立在HDFS的基礎(chǔ)上,應(yīng)用非常廣泛。
HDFS的缺點(diǎn):它是個(gè)文件系統(tǒng),而不是數(shù)據(jù)庫(kù)系統(tǒng),不能像關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)那樣建立索引等工具提升處理速度和定位到數(shù)據(jù)位置。因?yàn)閿?shù)據(jù)記錄的形式是一行一行的字符串,沒(méi)辦法定位,不支持對(duì)數(shù)據(jù)的直接修改。
MapReduce是專門負(fù)責(zé)分布式計(jì)算的,它是是一個(gè)組合詞,可以分成兩個(gè)部分:Map和Reduce。
簡(jiǎn)單的說(shuō),Map就是把要計(jì)算的數(shù)據(jù)分解成多個(gè)計(jì)算任務(wù),而Reduce則是Map過(guò)程得到的結(jié)果進(jìn)行匯總。假設(shè)現(xiàn)在我們要計(jì)算在USER表中,男女各有多少人。MapReduce計(jì)算詳細(xì)過(guò)程如下:
上圖中:
Splitting階段,把數(shù)據(jù)分成三塊。Splitting一般就是在HDFS存儲(chǔ)時(shí)的切分的基礎(chǔ)上再次切分。
Mapper則為每個(gè)切分的數(shù)據(jù)塊建一個(gè)Mapping任務(wù),逐條地計(jì)算每條數(shù)據(jù)的結(jié)果,然后在磁盤中存起來(lái)。
Shuffling也就是將Mapping階段的結(jié)果進(jìn)行分揀,shuffle任務(wù)要等Mapping完全完成后才能開展。
Reducing就是將分揀好的數(shù)據(jù),進(jìn)行匯總。
通過(guò)這種方式,MapReduce獲得了強(qiáng)大的運(yùn)算能力。
MapReduce優(yōu)點(diǎn):計(jì)算能力強(qiáng)大,運(yùn)算耗費(fèi)成本低廉,在運(yùn)算能力一般的機(jī)器上也能運(yùn)行。
MapReduce缺點(diǎn):它誕生的年代,內(nèi)存還很貴,在計(jì)算的過(guò)程中,中間結(jié)果要不斷存入磁盤中,以減少內(nèi)存的壓力,但是這樣導(dǎo)致了MapReduce運(yùn)算速度比較慢。另外就是代碼不簡(jiǎn)潔,學(xué)習(xí)曲線比較陡,后面在HIVE部分會(huì)講述。
YARN的全稱是Yet Another Resource Negotiator,直譯就是另一種資源協(xié)調(diào)者。
看名字就知道,他是Hadoop中其中一種資源調(diào)度器。它的最重要的組件是ResourceManager,通過(guò)這個(gè)組件,YARN可以為我們的MapReduce任務(wù)進(jìn)行資源分配,分配的資源就是一個(gè)個(gè)的計(jì)算容器,每個(gè)計(jì)算的任務(wù)就在這個(gè)容器中跑。由于優(yōu)秀,后來(lái)YARN進(jìn)一步被發(fā)揚(yáng)光大,成了Hadoop以外的很多大數(shù)據(jù)組件的資源調(diào)度框架。
在MapReduce的中,處理數(shù)據(jù)作業(yè)的程序是要通過(guò)JAVA來(lái)實(shí)現(xiàn)的。但是JAVA在寫MapReduce的過(guò)程并不簡(jiǎn)潔。像我們前面提到的統(tǒng)計(jì)數(shù)據(jù)表中男女人數(shù)這個(gè)簡(jiǎn)單的操作,需要嚴(yán)格按照Input到Reducing這五步來(lái)實(shí)現(xiàn),代碼一般長(zhǎng)達(dá)上百行。
但是統(tǒng)計(jì)這個(gè)數(shù)據(jù)結(jié)果,對(duì)于SQL來(lái)說(shuō),就是一句話的事:SELECT sex,COUNT(1) FROM USER GROUP BY sex。
為了不再寫又長(zhǎng)又煩的JAVA,Hive應(yīng)運(yùn)而生。Hive組件就主要做的事情是,將SQL代碼轉(zhuǎn)譯成MapReduce。然后放入YARN構(gòu)建的容器里面跑出結(jié)果。
這樣,我們要統(tǒng)計(jì)USER表中的男女人數(shù)的時(shí)候,就不用寫JAVA實(shí)現(xiàn)也能調(diào)動(dòng)MapReduce了。這里我們畫圖說(shuō)明一下:
另外,Hive除了轉(zhuǎn)譯SQL的功能外,它也可以用來(lái)建數(shù)據(jù)庫(kù)和數(shù)據(jù)表。一個(gè)數(shù)據(jù)庫(kù)擁有的能力它都有,而且還可以處理大量的數(shù)據(jù)。所以一般還會(huì)將Hive用來(lái)建數(shù)據(jù)倉(cāng)庫(kù)。數(shù)據(jù)倉(cāng)庫(kù)的主要功能,就是把歷史數(shù)據(jù)都存進(jìn)去,可以反復(fù)地統(tǒng)計(jì)計(jì)算使用。數(shù)據(jù)倉(cāng)庫(kù)最主要的特征就是數(shù)據(jù)量特別大。
由于它是構(gòu)建于HADOOP的基礎(chǔ)上,Hive可計(jì)算的容量大,運(yùn)算能力強(qiáng),但是速度不快。Hive也不能直接修改數(shù)據(jù)。對(duì)Hive進(jìn)行數(shù)據(jù)的修改操作非常費(fèi)時(shí)。
最后,介紹一下Hive和MySql的區(qū)別:
MySql是關(guān)系型數(shù)據(jù)庫(kù),它適合用于聯(lián)機(jī)事務(wù)數(shù)據(jù)管理。如用戶注冊(cè),修改昵稱等數(shù)據(jù)操作,可以讓用戶對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)快速地增刪改查。
HIVE是建立的HADOOP基礎(chǔ)上的數(shù)據(jù)倉(cāng)庫(kù)工具。它適合計(jì)算大容量數(shù)據(jù)的場(chǎng)景,因?yàn)橛?jì)算速度比較慢,不能用來(lái)進(jìn)行實(shí)時(shí)響應(yīng)的事務(wù)性場(chǎng)景。
Spark是分布式計(jì)算引擎,是大數(shù)據(jù)生態(tài)體系中的一個(gè)速度快,功能強(qiáng)大的一個(gè)組件。Spark整個(gè)框架非常龐大,提供能非常豐富的離線計(jì)算和流式計(jì)算能力。
本小節(jié)先介紹Spark的離線計(jì)算功能。
得益于摩爾定律下的硬件基礎(chǔ)設(shè)施的升級(jí),內(nèi)存變得越來(lái)越便宜,與MapReduce主要把中間結(jié)果不斷寫入磁盤不同,Spark主要把數(shù)據(jù)放在內(nèi)存中計(jì)算。這樣Spark在速度上比起MapReduce有上千倍的提升。
當(dāng)內(nèi)存不足的時(shí)候,Spark也會(huì)需要將中間結(jié)果存入磁盤。但是在這種情況下,Spark在速度上比起MapReduce也有上百倍的提升。因?yàn)镾park提供了RDD,DataFrame,DataSet這樣的數(shù)據(jù)表工具,并為這些數(shù)據(jù)表提供了一系列高效計(jì)算的算子,有效提升了速度。多個(gè)算子疊加就成了一個(gè)DAG(Directed Acyclic Graph),所以Spark也被成為DAG計(jì)算引擎。
下面介紹Spark的計(jì)算流程。
因?yàn)镽DD,DataFrame,DataSet都是類似關(guān)系數(shù)據(jù)庫(kù)的數(shù)據(jù)表,流程機(jī)制都差不多,這里選用DataFrame來(lái)解釋。當(dāng)Spark處理USER表的數(shù)據(jù)時(shí),會(huì)經(jīng)過(guò)以下過(guò)程:
上圖中:
數(shù)據(jù)讀取:數(shù)據(jù)讀取可以從文本,HDFS,HIVE,JSON等多種格式中讀取。
轉(zhuǎn)換成DataFrame:把讀取的數(shù)據(jù)表轉(zhuǎn)換成Spark的內(nèi)置格式DataFrame,并上圖中命名為USER_DF。有了DataFrame就可以直接對(duì)它進(jìn)行算子操作。上圖中用到的groupby()和count()都是算子。算子的作用就是執(zhí)行某類計(jì)算的操作。
groupby算子運(yùn)算:groupby就是分組的算子。它實(shí)現(xiàn)了按照男女對(duì)數(shù)據(jù)進(jìn)行了分組,得到一個(gè)分組后的新DataFrame,上圖中命名為GROUPBY_DF。每次算子運(yùn)算后,都得到一個(gè)新的DataFrame。
count算子運(yùn)算:從上一步的結(jié)果中,再次進(jìn)行個(gè)數(shù)計(jì)算,得出最后結(jié)果RESULT_DF。
多個(gè)算子混合后,就形成了一個(gè)DAG,上面的操作,會(huì)形成以下的DAG。Spark通過(guò)構(gòu)建DAG,然后下發(fā)給從節(jié)點(diǎn)計(jì)算。
同時(shí)這個(gè)計(jì)算過(guò)程也是像MapReduce那樣,將計(jì)算任務(wù)分解成Map和Reduce兩個(gè)階段,分布式地在多臺(tái)機(jī)器中計(jì)算,這里不再描述。
MapReduce和Spark都是離線計(jì)算的代表。離線計(jì)算就是計(jì)算前已經(jīng)有了所有需要計(jì)算的數(shù)據(jù),且每次計(jì)算都是所有的數(shù)據(jù)都參與的運(yùn)算。因?yàn)槊看味际且徽鷶?shù)據(jù)做計(jì)算,所以離線計(jì)算一般又叫批量計(jì)算。
但是日常的事務(wù)中,有很多場(chǎng)景是需要不斷實(shí)時(shí)的更新數(shù)據(jù)的。
假設(shè)我們的USER表,現(xiàn)在因?yàn)橛袀€(gè)新用戶注冊(cè),多了一條用戶數(shù)據(jù)“蔡九,女,27”。離線計(jì)算就要把新數(shù)據(jù)匯總,然后再進(jìn)行計(jì)算:
增加一條用戶日志,就要對(duì)全部的進(jìn)行計(jì)算,在數(shù)據(jù)量非常龐大的時(shí)候,這根本是不可能的事情。所以我們還要另外一種計(jì)算方式,那就是流式計(jì)算。流式計(jì)算因其實(shí)時(shí)性,又常被叫做在線計(jì)算和實(shí)時(shí)計(jì)算。
以下是流式計(jì)算的過(guò)程,同樣的新增數(shù)據(jù),流失計(jì)算只要對(duì)新增數(shù)據(jù)進(jìn)行計(jì)算,然后匯總更新:
流式計(jì)算引擎有:SPARK streaming,Storm和Flink。它們都可以提供流式計(jì)算的服務(wù),但是有些不同。
SPARK streaming是使用微批的方式計(jì)算流數(shù)據(jù)。微批就是小批量的意思。SPARK streaming并不是一條一條地計(jì)算新數(shù)據(jù)流,而且小批量的計(jì)算。比如幾分鐘算一次,或者幾十條算一次。像割韭菜那樣,等長(zhǎng)夠高了,再收割,一茬又一茬。
Storm和Flink就是來(lái)一條計(jì)算一條地處理數(shù)據(jù)流了。像流水線作業(yè)那樣,不斷地逐個(gè)逐個(gè)處理。值得一提的是,最近兩年Flink很火,在推薦系統(tǒng)上被廣泛用來(lái)計(jì)算如用戶畫像等實(shí)時(shí)性較高的數(shù)據(jù)。
前面說(shuō)到谷歌三篇關(guān)于大數(shù)據(jù)的論文,這里再補(bǔ)充一下它們后來(lái)的演變結(jié)果:
分布式文件系統(tǒng):Google File System,演變成Hadoop的HDFS。
分布式并行計(jì)算框架:Google MapReduce,演變成Hadoop的MapReduce。
分布式數(shù)據(jù)庫(kù):BigTable,演變成了另外一個(gè)大名鼎鼎的HBase。
這就是HBase的誕生。
HBase是一個(gè)NoSql數(shù)據(jù)庫(kù)。它在整個(gè)大數(shù)據(jù)生態(tài)中的定位是對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)的操作:查詢,更新,刪除和插入。前面說(shuō)到HIVE是能處理大量數(shù)據(jù),但是速度慢且不能對(duì)數(shù)據(jù)進(jìn)行修改,而MySql等傳統(tǒng)數(shù)據(jù)庫(kù)響應(yīng)快但是運(yùn)算能力不足。HBase的出現(xiàn),就是為了解決這些問(wèn)題。
NoSql數(shù)據(jù)庫(kù)的意思就是不支持SQL語(yǔ)句的數(shù)據(jù)庫(kù)。HBase有以下特征:
HBase最終存儲(chǔ)是基于HDFS的,有存儲(chǔ)海量數(shù)據(jù)能力。
HBase的增刪改查是分布式的,也就是一次修改,是多個(gè)節(jié)點(diǎn)服務(wù)器的修改。
HBase的表結(jié)構(gòu)跟關(guān)系型數(shù)據(jù)庫(kù)是不一樣的。
HBase有很快的讀取響應(yīng)速度。
為了方便理解,我們直接畫圖看HBase怎么工作。如何把我們的USER數(shù)據(jù)表放入HBase后,它是長(zhǎng)成這樣子的:
其中:
rowkey是行鍵,是每行數(shù)據(jù)的編號(hào)。
Users_info叫做列族,是保存數(shù)據(jù)的表頭。
HBASE中,每個(gè)數(shù)據(jù)都被保存成為key:value的鍵值對(duì),每個(gè)鍵值對(duì)叫做cell(單元格)。如name:張三就是一個(gè)cell。
MySql中,修改數(shù)據(jù)就會(huì)覆蓋掉舊數(shù)據(jù)。但是在HBase中,同個(gè)鍵值對(duì)可以保留多個(gè)數(shù)據(jù)版本。這個(gè)版本會(huì)以時(shí)間戳的形式來(lái)標(biāo)記。如張三,有一天改名叫張三豐了,它并不會(huì)覆蓋掉原有的張三,而是兩個(gè)版本都保存起來(lái)。如下如所示:
HBase有強(qiáng)大的讀取和增刪改查能力,加上可以保存不同時(shí)間的數(shù)據(jù)版本,在推薦系統(tǒng)中,用戶畫像的結(jié)果數(shù)據(jù),離線召回,近線召回等數(shù)據(jù),都是保存在HBase中。另外,HBase可以做到快速響應(yīng),推薦系統(tǒng)中需要快速讀取的數(shù)據(jù),都可以存在HBase中。
大數(shù)據(jù)的誕生,并不是取代掉傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù),而是變成一種補(bǔ)充。傳統(tǒng)數(shù)據(jù)庫(kù)存不下的數(shù)據(jù),大數(shù)據(jù)來(lái)存。傳統(tǒng)數(shù)據(jù)庫(kù)算不了的數(shù)據(jù),大數(shù)據(jù)來(lái)算。大數(shù)據(jù)系統(tǒng)只是把現(xiàn)有系統(tǒng)的數(shù)據(jù)采集到大數(shù)據(jù)中,做存儲(chǔ)和計(jì)算,對(duì)已有的業(yè)務(wù)流程和系統(tǒng)架構(gòu)并沒(méi)有什么影響。
將數(shù)據(jù)采集到大數(shù)據(jù),一般用到兩個(gè)工具:Sqoop,F(xiàn)lume。其實(shí)不同公司使用的數(shù)據(jù)采集工具不一樣,這里只是簡(jiǎn)單的介紹。
關(guān)系型數(shù)據(jù)是我們最常見的一種數(shù)據(jù)。Sqoop是關(guān)系型數(shù)據(jù)庫(kù)和大數(shù)據(jù)之間數(shù)據(jù)流動(dòng)的一個(gè)橋梁。它可以用來(lái)將MySql和Oracle的數(shù)據(jù)導(dǎo)入HDFS,HBASE中?;蛘邔⒋髷?shù)據(jù)中的數(shù)據(jù)導(dǎo)入MySql或Oracle。
另外一種常見的數(shù)據(jù)是來(lái)自于日志系統(tǒng)的數(shù)據(jù)。在生產(chǎn)環(huán)境中,我們的搜索,推薦,廣告服務(wù)每時(shí)每刻都在產(chǎn)生大量的流式日志。這些日志數(shù)據(jù)格式不一,形態(tài)各異。他們都是非結(jié)構(gòu)數(shù)據(jù)。
這些數(shù)據(jù)一般都是以文本的方式保存在各個(gè)業(yè)務(wù)系統(tǒng)中。對(duì)于推薦系統(tǒng)而言,最重要用戶的埋點(diǎn)行為數(shù)據(jù)就存在日志中。而對(duì)于這些非關(guān)系型數(shù)據(jù),我們需要采集到大數(shù)據(jù)的時(shí)候,就需要用到Flume。Flume可以采集批量數(shù)據(jù)也可以采集流數(shù)據(jù)。
這兩個(gè)工具知道作用即可,不用深究太多。
采用Sqoop或者Flume做數(shù)據(jù)采集的時(shí)候,可以說(shuō)是一對(duì)一的直采專線服務(wù)模式。我們把生產(chǎn)數(shù)據(jù)的系統(tǒng)叫生產(chǎn)者,消費(fèi)數(shù)據(jù)的系統(tǒng)叫消費(fèi)者。隨著系統(tǒng)的發(fā)展,一般生產(chǎn)者和消費(fèi)者都會(huì)越來(lái)越多,全部一對(duì)一直采,連接數(shù)就會(huì)指數(shù)上升,且難以維護(hù)。如果生產(chǎn)者的數(shù)據(jù)沒(méi)能及時(shí)被消費(fèi)者接收或者丟包,數(shù)據(jù)就會(huì)丟失。
為了解決這些問(wèn)題,Kafka被創(chuàng)造了出來(lái)。
通過(guò)Kafka,生產(chǎn)者只要把數(shù)據(jù)打包好,標(biāo)記好Topic,扔到Kafka的消息隊(duì)列上就可以了。而消費(fèi)者,只要做的事情就是訂閱該生產(chǎn)者的Topic。當(dāng)有新的數(shù)據(jù)到達(dá)時(shí),Kafka就會(huì)告知消費(fèi)者去取。
數(shù)據(jù)會(huì)被暫時(shí)保存在Kafka的硬盤中一段時(shí)間(一般7天),消費(fèi)者隨時(shí)可以來(lái)取。被保存的一系列數(shù)據(jù)塊,就是一個(gè)個(gè)按時(shí)間排序的消息隊(duì)列。同樣的,Kakfa也是分布式的,它會(huì)被安裝在多個(gè)節(jié)點(diǎn)中,數(shù)據(jù)也會(huì)被保存在多個(gè)節(jié)點(diǎn)中。
能看到這里,你已經(jīng)很不容易了。前面已經(jīng)將本文需要介紹的大數(shù)據(jù)組件講完了。
大數(shù)據(jù)實(shí)在是太龐大了,而且各司其職,分工得特別細(xì)。這么多大數(shù)據(jù)的框架,有離線計(jì)算和流式計(jì)算,不同的分布式存儲(chǔ)和不同的分布式工具,這些框架是怎么構(gòu)建成一個(gè)大數(shù)據(jù)系統(tǒng)的呢?
這就要介紹大數(shù)據(jù)的Lambda架構(gòu)。
Lambda架構(gòu)算大數(shù)據(jù)系統(tǒng)里面舉足輕重的架構(gòu),數(shù)據(jù)通道分為兩條分支:實(shí)時(shí)流和離線。實(shí)時(shí)流依照流式架構(gòu),保障了其實(shí)時(shí)性,而離線則以批處理方式為主,保障了最終一致性。適用于同時(shí)存在實(shí)時(shí)和離線需求的情況。抽象掉所有的框架,可以把Lambda架構(gòu)簡(jiǎn)化成如下方式:
推薦系統(tǒng)是個(gè)存儲(chǔ)和算力消耗的大戶,它需要離線計(jì)算,對(duì)時(shí)間不敏感的數(shù)據(jù)進(jìn)行大批量的計(jì)算。也需要實(shí)時(shí)流式計(jì)算,對(duì)用戶畫像,物品畫像數(shù)據(jù)進(jìn)行實(shí)時(shí)的更新。把本章中說(shuō)到的大數(shù)據(jù)的各個(gè)框架組件按照Lambda架構(gòu)的方式組建后,我們可以得到下圖。
實(shí)際的情況比上圖還要更復(fù)雜些,但是對(duì)于本文來(lái)說(shuō),借用機(jī)器學(xué)習(xí)的術(shù)語(yǔ),再?gòu)?fù)雜就要“過(guò)擬合”了,適當(dāng)?shù)腄ropOut可以防止過(guò)擬合。扔掉一些,可能是更好的。
千言萬(wàn)語(yǔ),匯總成一句話:大數(shù)據(jù)是由分布式存儲(chǔ),分布式計(jì)算和輔助性組件構(gòu)成一個(gè)龐大的數(shù)據(jù)技術(shù)生態(tài)體系。它有幾個(gè)要知識(shí)點(diǎn):
要理解分布式存儲(chǔ)的機(jī)制。因?yàn)閿?shù)據(jù)量大,數(shù)據(jù)的存儲(chǔ)的最終載體是最簡(jiǎn)單文本數(shù)據(jù),沒(méi)有很多花里胡哨的東西。這些文本數(shù)據(jù)被切割成多個(gè)數(shù)據(jù)塊,分布式地保存在不同的數(shù)據(jù)節(jié)點(diǎn)中。
要理解分布式計(jì)算中的MapReduce機(jī)制。理解HIVE的工作機(jī)制。理解什么是離線計(jì)算,什么是流式計(jì)算。
最后,可以的話,記住Lambda架構(gòu)。
大數(shù)據(jù)太多知識(shí)點(diǎn)了,受篇幅所限,這次只選擇性地介紹推薦系統(tǒng)需要用到的大數(shù)據(jù)開源類組件。這個(gè)生態(tài)體系還在不斷的發(fā)展中,我也還在路上。不足之處,還請(qǐng)各路高手不吝指教。
本文為作者獨(dú)立觀點(diǎn),不代表鳥哥筆記立場(chǎng),未經(jīng)允許不得轉(zhuǎn)載。
《鳥哥筆記版權(quán)及免責(zé)申明》 如對(duì)文章、圖片、字體等版權(quán)有疑問(wèn),請(qǐng)點(diǎn)擊 反饋舉報(bào)
測(cè)一測(cè)
我們致力于提供一個(gè)高質(zhì)量?jī)?nèi)容的交流平臺(tái)。為落實(shí)國(guó)家互聯(lián)網(wǎng)信息辦公室“依法管網(wǎng)、依法辦網(wǎng)、依法上網(wǎng)”的要求,為完善跟帖評(píng)論自律管理,為了保護(hù)用戶創(chuàng)造的內(nèi)容、維護(hù)開放、真實(shí)、專業(yè)的平臺(tái)氛圍,我們團(tuán)隊(duì)將依據(jù)本公約中的條款對(duì)注冊(cè)用戶和發(fā)布在本平臺(tái)的內(nèi)容進(jìn)行管理。平臺(tái)鼓勵(lì)用戶創(chuàng)作、發(fā)布優(yōu)質(zhì)內(nèi)容,同時(shí)也將采取必要措施管理違法、侵權(quán)或有其他不良影響的網(wǎng)絡(luò)信息。
一、根據(jù)《網(wǎng)絡(luò)信息內(nèi)容生態(tài)治理規(guī)定》《中華人民共和國(guó)未成年人保護(hù)法》等法律法規(guī),對(duì)以下違法、不良信息或存在危害的行為進(jìn)行處理。
1. 違反法律法規(guī)的信息,主要表現(xiàn)為:
1)反對(duì)憲法所確定的基本原則;
2)危害國(guó)家安全,泄露國(guó)家秘密,顛覆國(guó)家政權(quán),破壞國(guó)家統(tǒng)一,損害國(guó)家榮譽(yù)和利益;
3)侮辱、濫用英烈形象,歪曲、丑化、褻瀆、否定英雄烈士事跡和精神,以侮辱、誹謗或者其他方式侵害英雄烈士的姓名、肖像、名譽(yù)、榮譽(yù);
4)宣揚(yáng)恐怖主義、極端主義或者煽動(dòng)實(shí)施恐怖活動(dòng)、極端主義活動(dòng);
5)煽動(dòng)民族仇恨、民族歧視,破壞民族團(tuán)結(jié);
6)破壞國(guó)家宗教政策,宣揚(yáng)邪教和封建迷信;
7)散布謠言,擾亂社會(huì)秩序,破壞社會(huì)穩(wěn)定;
8)宣揚(yáng)淫穢、色情、賭博、暴力、兇殺、恐怖或者教唆犯罪;
9)煽動(dòng)非法集會(huì)、結(jié)社、游行、示威、聚眾擾亂社會(huì)秩序;
10)侮辱或者誹謗他人,侵害他人名譽(yù)、隱私和其他合法權(quán)益;
11)通過(guò)網(wǎng)絡(luò)以文字、圖片、音視頻等形式,對(duì)未成年人實(shí)施侮辱、誹謗、威脅或者惡意損害未成年人形象進(jìn)行網(wǎng)絡(luò)欺凌的;
12)危害未成年人身心健康的;
13)含有法律、行政法規(guī)禁止的其他內(nèi)容;
2. 不友善:不尊重用戶及其所貢獻(xiàn)內(nèi)容的信息或行為。主要表現(xiàn)為:
1)輕蔑:貶低、輕視他人及其勞動(dòng)成果;
2)誹謗:捏造、散布虛假事實(shí),損害他人名譽(yù);
3)嘲諷:以比喻、夸張、侮辱性的手法對(duì)他人或其行為進(jìn)行揭露或描述,以此來(lái)激怒他人;
4)挑釁:以不友好的方式激怒他人,意圖使對(duì)方對(duì)自己的言論作出回應(yīng),蓄意制造事端;
5)羞辱:貶低他人的能力、行為、生理或身份特征,讓對(duì)方難堪;
6)謾罵:以不文明的語(yǔ)言對(duì)他人進(jìn)行負(fù)面評(píng)價(jià);
7)歧視:煽動(dòng)人群歧視、地域歧視等,針對(duì)他人的民族、種族、宗教、性取向、性別、年齡、地域、生理特征等身份或者歸類的攻擊;
8)威脅:許諾以不良的后果來(lái)迫使他人服從自己的意志;
3. 發(fā)布垃圾廣告信息:以推廣曝光為目的,發(fā)布影響用戶體驗(yàn)、擾亂本網(wǎng)站秩序的內(nèi)容,或進(jìn)行相關(guān)行為。主要表現(xiàn)為:
1)多次發(fā)布包含售賣產(chǎn)品、提供服務(wù)、宣傳推廣內(nèi)容的垃圾廣告。包括但不限于以下幾種形式:
2)單個(gè)帳號(hào)多次發(fā)布包含垃圾廣告的內(nèi)容;
3)多個(gè)廣告帳號(hào)互相配合發(fā)布、傳播包含垃圾廣告的內(nèi)容;
4)多次發(fā)布包含欺騙性外鏈的內(nèi)容,如未注明的淘寶客鏈接、跳轉(zhuǎn)網(wǎng)站等,誘騙用戶點(diǎn)擊鏈接
5)發(fā)布大量包含推廣鏈接、產(chǎn)品、品牌等內(nèi)容獲取搜索引擎中的不正當(dāng)曝光;
6)購(gòu)買或出售帳號(hào)之間虛假地互動(dòng),發(fā)布干擾網(wǎng)站秩序的推廣內(nèi)容及相關(guān)交易。
7)發(fā)布包含欺騙性的惡意營(yíng)銷內(nèi)容,如通過(guò)偽造經(jīng)歷、冒充他人等方式進(jìn)行惡意營(yíng)銷;
8)使用特殊符號(hào)、圖片等方式規(guī)避垃圾廣告內(nèi)容審核的廣告內(nèi)容。
4. 色情低俗信息,主要表現(xiàn)為:
1)包含自己或他人性經(jīng)驗(yàn)的細(xì)節(jié)描述或露骨的感受描述;
2)涉及色情段子、兩性笑話的低俗內(nèi)容;
3)配圖、頭圖中包含庸俗或挑逗性圖片的內(nèi)容;
4)帶有性暗示、性挑逗等易使人產(chǎn)生性聯(lián)想;
5)展現(xiàn)血腥、驚悚、殘忍等致人身心不適;
6)炒作緋聞、丑聞、劣跡等;
7)宣揚(yáng)低俗、庸俗、媚俗內(nèi)容。
5. 不實(shí)信息,主要表現(xiàn)為:
1)可能存在事實(shí)性錯(cuò)誤或者造謠等內(nèi)容;
2)存在事實(shí)夸大、偽造虛假經(jīng)歷等誤導(dǎo)他人的內(nèi)容;
3)偽造身份、冒充他人,通過(guò)頭像、用戶名等個(gè)人信息暗示自己具有特定身份,或與特定機(jī)構(gòu)或個(gè)人存在關(guān)聯(lián)。
6. 傳播封建迷信,主要表現(xiàn)為:
1)找人算命、測(cè)字、占卜、解夢(mèng)、化解厄運(yùn)、使用迷信方式治病;
2)求推薦算命看相大師;
3)針對(duì)具體風(fēng)水等問(wèn)題進(jìn)行求助或咨詢;
4)問(wèn)自己或他人的八字、六爻、星盤、手相、面相、五行缺失,包括通過(guò)占卜方法問(wèn)婚姻、前程、運(yùn)勢(shì),東西寵物丟了能不能找回、取名改名等;
7. 文章標(biāo)題黨,主要表現(xiàn)為:
1)以各種夸張、獵奇、不合常理的表現(xiàn)手法等行為來(lái)誘導(dǎo)用戶;
2)內(nèi)容與標(biāo)題之間存在嚴(yán)重不實(shí)或者原意扭曲;
3)使用夸張標(biāo)題,內(nèi)容與標(biāo)題嚴(yán)重不符的。
8.「飯圈」亂象行為,主要表現(xiàn)為:
1)誘導(dǎo)未成年人應(yīng)援集資、高額消費(fèi)、投票打榜
2)粉絲互撕謾罵、拉踩引戰(zhàn)、造謠攻擊、人肉搜索、侵犯隱私
3)鼓動(dòng)「飯圈」粉絲攀比炫富、奢靡享樂(lè)等行為
4)以號(hào)召粉絲、雇用網(wǎng)絡(luò)水軍、「養(yǎng)號(hào)」形式刷量控評(píng)等行為
5)通過(guò)「蹭熱點(diǎn)」、制造話題等形式干擾輿論,影響傳播秩序
9. 其他危害行為或內(nèi)容,主要表現(xiàn)為:
1)可能引發(fā)未成年人模仿不安全行為和違反社會(huì)公德行為、誘導(dǎo)未成年人不良嗜好影響未成年人身心健康的;
2)不當(dāng)評(píng)述自然災(zāi)害、重大事故等災(zāi)難的;
3)美化、粉飾侵略戰(zhàn)爭(zhēng)行為的;
4)法律、行政法規(guī)禁止,或可能對(duì)網(wǎng)絡(luò)生態(tài)造成不良影響的其他內(nèi)容。
二、違規(guī)處罰
本網(wǎng)站通過(guò)主動(dòng)發(fā)現(xiàn)和接受用戶舉報(bào)兩種方式收集違規(guī)行為信息。所有有意的降低內(nèi)容質(zhì)量、傷害平臺(tái)氛圍及欺凌未成年人或危害未成年人身心健康的行為都是不能容忍的。
當(dāng)一個(gè)用戶發(fā)布違規(guī)內(nèi)容時(shí),本網(wǎng)站將依據(jù)相關(guān)用戶違規(guī)情節(jié)嚴(yán)重程度,對(duì)帳號(hào)進(jìn)行禁言 1 天、7 天、15 天直至永久禁言或封停賬號(hào)的處罰。當(dāng)涉及欺凌未成年人、危害未成年人身心健康、通過(guò)作弊手段注冊(cè)、使用帳號(hào),或者濫用多個(gè)帳號(hào)發(fā)布違規(guī)內(nèi)容時(shí),本網(wǎng)站將加重處罰。
三、申訴
隨著平臺(tái)管理經(jīng)驗(yàn)的不斷豐富,本網(wǎng)站出于維護(hù)本網(wǎng)站氛圍和秩序的目的,將不斷完善本公約。
如果本網(wǎng)站用戶對(duì)本網(wǎng)站基于本公約規(guī)定做出的處理有異議,可以通過(guò)「建議反饋」功能向本網(wǎng)站進(jìn)行反饋。
(規(guī)則的最終解釋權(quán)歸屬本網(wǎng)站所有)