豈止於大,一文讀懂大資料及其在推薦系統的應用

wbhljpk99發表於2022-03-20

大資料是資料智慧時代的“鐵公基”,是一系列計算和儲存的基礎設施。推薦系統也是建立在大資料的基礎之上的,大量的資料探勘和模型訓練都離不開大資料。

大資料這個名詞起的很好,對於非技術人員來說也能get到大的含義:資料量大,算力強大。

但是這強大的能力是怎麼來的?大資料生態體系架構是怎麼分工的?

不具體做過的同學並不清楚。今天就繼續站在產品經理的角度深入淺出地來講述這些問題。其實不一定是產品經理,對大資料感興趣的同學都可以看看。本文比較長,如果時間不夠,建議先Mark下。

01 大資料的誕生與分散式

在大資料技術誕生之前,資料的儲存和處理大半壁江山都是Oracle和MySql和等資料庫軟體的。這些傳統資料庫的檔案系統是單機的,也就是說,資料只能在一臺機器上跑。它們在處理成TB(1024GB)甚至上PB(1024TB)級別資料時就會特別吃力。

第一個解決了這個問題的公司是谷歌。谷歌解決這個問題的思路就是分散式。谷歌分別於2003-2004年發表了三篇重量級的論文,奠定了大資料的基礎。

簡單的說,谷歌通過論文公佈了以下三個工具如何創造:

  1. 分散式檔案系統:Google File System
  2. 分散式平行計算框架:Google MapReduce
  3. 分散式資料庫:BigTable

這個就是大資料技術的開始。從谷歌的這個原點開始,大資料經過多年發展,形成了今天的全貌。

可以用以下三個分類來去解構整個大資料生態:

  1. 分散式儲存:把檔案切成多份,分佈地儲存到多臺機器上。常用的元件有:HDFS,HBase等。
  2. 分散式計算:把資料計算的任務切分成多個,分配到多臺機器上計算。常用的元件有:MapReduce,Spark,Storm,Flink等。
  3. 分散式工具:資料輔助類工具,資源排程管理工具等。常見的元件有:YARN,Hive,Flume,Sqoop,Elastic Search,ZooKeeper等。

大資料整個生態體系非常龐大,相關的產品不勝列舉,讓人看著眼花繚亂,有種物種大爆發的感覺。但是也並非無跡可尋。 我們理解大資料生態,從這三個方面去理解就會輕鬆很多。本文也是嚴格按照這個方式來講述。

豈止於大,一文讀懂大資料及其在推薦系統的應用

02 本文講述需要用的資料表

鑑於大資料生態過於龐大複雜,為了使得文章更加淺顯易懂,本文不對技術概念做過多的描述,而是直接到操作層面,以圖示的方式講解。因為要講述的是資料系統,我這裡建一張資料表USER,用這張資料表在各個系統中處理過程來給大家講述大資料各個元件的工作原理和機制。

豈止於大,一文讀懂大資料及其在推薦系統的應用

03 Hadoop

整個網際網路技術生態圈中,谷歌是超級績優生。每次發表論文,都會引起眾多人員前來“抄作業”。Hadoop之父Doug Cutting和他的團隊就是其中一個。他花了兩年的業餘時間,照著谷歌的論文實現了一個分散式資料系統,並用自己兒子的大象毛絨玩具的名字給這個系統命名為Hadoop。Hadoop的Logo也是個頭大象。

豈止於大,一文讀懂大資料及其在推薦系統的應用

後來到了2006年,Hadoop被引入Apache基金會,成為一個開源的頂級專案。隨著Hadoop的不斷髮展,在Hadoop專案中,誕生了HBase,Hive,Pig,Zookeeper等子專案,並先後被Apache基金會將其獨立升級成為頂級專案。

同時,Apache基金會也不斷兼收幷蓄其他大資料專案,基本把絕大多數優秀的大資料專案都收入麾下,大有天下武功出少林的味道。大資料各種開源元件中,Apache旗下的才是少林正宗。

閒話不多說,我們來講Hadoop。

現在的Hadoop主要分三個部分:

  1. 分散式儲存:HDFS(Hadoop Distributed File System),一個高可靠、高吞吐量的分散式檔案系統,實現海量資料儲存。
  2. 分散式計算:MapReduce,一個分散式離線平行計算計算框架,實現海量計算。
  3. 分散式工具:YARN,一個叢集資源排程管理的框架,實現硬體資源的調配。

04 圖解分散式

這裡先具象的解釋下,什麼是大資料的分散式長什麼樣?

我們在安裝Hadoop的時候,要把同一個Hadoop的軟體安裝包,安裝在三臺以上不同的機器上。安裝好後,我們就可以得到一個Hadoop 分散式叢集

如下圖,我們將Hadoop的三個元件,安裝在叢集每一臺機器上,這個叢集有七臺機器。每一臺機器叫一個 節點。這七個節點中,要選出一個做老大,我們有什麼事情先找這個老大,這個就是 主節點。因為主節點很重要,它要是掛了,整個叢集就掛了。所以一般主節點配置兩臺,一臺備份。其他五個節點叫做 從節點。在Hadoop中,主節點命名為Master,從節點為Slave。

豈止於大,一文讀懂大資料及其在推薦系統的應用

05 分散式檔案系統:HDFS

下面將Hadoop的第一個元件HDFS。HDFS作為分散式的檔案系統,它是以文字的方式來儲存資料的,也就是說,資料一般會跟我們的TXT檔案那樣。一個檔案會被按照設定,切分成不同的資料塊,然後每個資料塊會被複製成多份,然後分散式地存到不同的節點中。HDFS把叢集節點分成兩類:NameNode和DataNode。

  • NameNode可以理解成資料目錄,它記錄了每個資料塊在哪臺機器的哪個位置。這個功能由主節點承擔。
  • DataNode顧名思義就是存資料的節點了。

下面以USER資料表為例,舉例說明HDFS的運作過程。實際的系統中,因為NameNode負荷比較重,會設定一個SecondaryNameNode來協助NameNode的工作(注意是協助,而不是備份)。

豈止於大,一文讀懂大資料及其在推薦系統的應用

上圖中:

  1. HDFS先把深藍色的文字資料切分成三份。每份資料按照系統設定,如64MB或128MB一塊。
  2. 將三份資料塊複製成三份,這樣就有九份資料。
  3. 把上一步得到的九份資料劃分到不同的DataNode中,並建好目錄。
  4. 按照儲存分配,把各個資料塊儲存。

HDFS優點:資料容量大,是大資料最主要的資料儲存方式。很多其他元件都是建立在HDFS的基礎上,應用非常廣泛。

HDFS的缺點:它是個檔案系統,而不是資料庫系統,不能像關聯式資料庫系統那樣建立索引等工具提升處理速度和定位到資料位置。因為資料記錄的形式是一行一行的字串,沒辦法定位,不支援對資料的直接修改。

06 分散式離線計算引擎:MapReduce

MapReduce是專門負責分散式計算的,它是是一個組合詞,可以分成兩個部分:Map和Reduce。

簡單的說,Map就是把要計算的資料分解成多個計算任務,而Reduce則是Map過程得到的結果進行彙總。假設現在我們要計算在USER表中,男女各有多少人。

MapReduce計算詳細過程如下:

豈止於大,一文讀懂大資料及其在推薦系統的應用

上圖中:

  1. Splitting階段,把資料分成三塊。Splitting一般就是在HDFS儲存時的切分的基礎上再次切分。
  2. Mapper則為每個切分的資料塊建一個Mapping任務,逐條地計算每條資料的結果,然後在磁碟中存起來。
  3. Shuffling也就是將Mapping階段的結果進行分揀,shuffle任務要等Mapping完全完成後才能開展。
  4. Reducing就是將分揀好的資料,進行彙總。

通過這種方式,MapReduce獲得了強大的運算能力。

MapReduce優點:計算能力強大,運算耗費成本低廉,在運算能力一般的機器上也能執行。

MapReduce缺點:它誕生的年代,記憶體還很貴,在計算的過程中,中間結果要不斷存入磁碟中,以減少記憶體的壓力,但是這樣導致了MapReduce運算速度比較慢。另外就是程式碼不簡潔,學習曲線比較陡,後面在HIVE部分會講述。

07 資源管理排程系統:YARN

YARN的全稱是Yet Another Resource Negotiator,直譯就是另一種資源協調者。

看名字就知道,他是Hadoop中其中一種資源排程器。它的最重要的元件是ResourceManager,通過這個元件,YARN可以為我們的MapReduce任務進行資源分配,分配的資源就是一個個的計算容器,每個計算的任務就在這個容器中跑。由於優秀,後來YARN進一步被髮揚光大,成了Hadoop以外的很多大資料元件的資源排程框架。

08 資料分析和資料倉儲工具:HIVE

在MapReduce的中,處理資料作業的程式是要通過JAVA來實現的,但是JAVA在寫MapReduce的過程並不簡潔。像我們前面提到的統計資料表中男女人數這個簡單的操作,需要嚴格按照Input到Reducing這五步來實現,程式碼一般長達上百行。

但是統計這個資料結果,對於SQL來說,就是一句話的事:SELECT sex,COUNT(1) FROM USER GROUP BY sex。

為了不再寫又長又煩的JAVA,Hive應運而生。Hive元件就主要做的事情是,將SQL程式碼轉譯成MapReduce,然後放入YARN構建的容器裡面跑出結果。

這樣,我們要統計USER表中的男女人數的時候,就不用寫JAVA實現也能調動MapReduce了,這裡我們畫圖說明一下:

豈止於大,一文讀懂大資料及其在推薦系統的應用

另外,Hive除了轉譯SQL的功能外,它也可以用來建資料庫和資料表。一個資料庫擁有的能力它都有,而且還可以處理大量的資料,所以一般還會將Hive用來建資料倉儲。資料倉儲的主要功能,就是把歷史資料都存進去,可以反覆地統計計算使用。資料倉儲最主要的特徵就是資料量特別大。

由於它是構建於HADOOP的基礎上,Hive可計算的容量大,運算能力強,但是速度不快。Hive也不能直接修改資料。對Hive進行資料的修改操作非常費時。

最後,介紹一下Hive和MySql的區別:

  • MySql是關係型資料庫,它適合用於聯機事務資料管理。如使用者註冊,修改暱稱等資料操作,可以讓使用者對資料進行實時快速地增刪改查。
  • HIVE是建立的HADOOP基礎上的資料倉儲工具。它適合計算大容量資料的場景,因為計算速度比較慢,不能用來進行實時響應的事務性場景。

09 離線計算和流式計算DAG計算引擎:SPARK

Spark是分散式計算引擎,是大資料生態體系中的一個速度快,功能強大的一個元件。Spark整個框架非常龐大,提供能非常豐富的離線計算和流式計算能力。

本小節先介紹Spark的離線計算功能。

得益於摩爾定律下的硬體基礎設施的升級,記憶體變得越來越便宜,與MapReduce主要把中間結果不斷寫入磁碟不同,Spark主要把資料放在記憶體中計算。這樣Spark在速度上比起MapReduce有上千倍的提升。

當記憶體不足的時候,Spark也會需要將中間結果存入磁碟。但是在這種情況下,Spark在速度上比起MapReduce也有上百倍的提升。因為Spark提供了RDD,DataFrame,DataSet這樣的資料表工具,併為這些資料表提供了一系列高效計算的運算元,有效提升了速度。多個運算元疊加就成了一個DAG(Directed Acyclic Graph),所以Spark也被成為DAG計算引擎。

下面介紹Spark的計算流程。

因為RDD,DataFrame,DataSet都是類似關聯式資料庫的資料表,流程機制都差不多,這裡選用DataFrame來解釋。當Spark處理USER表的資料時,會經過以下過程:

豈止於大,一文讀懂大資料及其在推薦系統的應用

上圖中:

  1. 資料讀取:資料讀取可以從文字,HDFS,HIVE,JSON等多種格式中讀取。
  2. 轉換成DataFrame:把讀取的資料錶轉換成Spark的內建格式DataFrame,並上圖中命名為USER_DF。有了DataFrame就可以直接對它進行運算元操作。上圖中用到的groupby和count都是運算元。運算元的作用就是執行某類計算的操作。
  3. groupby運算元運算:groupby就是分組的運算元。它實現了按照男女對資料進行了分組,得到一個分組後的新DataFrame,上圖中命名為GROUPBY_DF。每次運算元運算後,都得到一個新的DataFrame。
  4. count運算元運算:從上一步的結果中,再次進行個數計算,得出最後結果RESULT_DF。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70015517/viewspace-2877225/,如需轉載,請註明出處,否則將追究法律責任。

相關文章