回覆列表
  • 1 # 鮮棗課堂

    1998年9月4日,Google公司在美國矽谷成立。正如大家所知,它是一家做搜尋引擎起家的公司。

    無獨有偶,一位名叫Doug Cutting的美國工程師,也迷上了搜尋引擎。他做了一個用於文字搜尋的函式庫(姑且理解為軟體的功能元件),命名為Lucene。

    左為Doug Cutting,右為Lucene的LOGO

    早期的時候,這個專案被髮布在Doug Cutting的個人網站和SourceForge(一個開源軟體網站)。後來,2001年底,Lucene成為Apache軟體基金會jakarta專案的一個子專案。

    Apache軟體基金會,搞IT的應該都認識

    2004年,Doug Cutting再接再勵,在Lucene的基礎上,和Apache開源夥伴Mike Cafarella合作,開發了一款可以代替當時的主流搜尋的開源搜尋引擎,命名為Nutch。

    Nutch是一個建立在Lucene核心之上的網頁搜尋應用程式,可以下載下來直接使用。它在Lucene的基礎上加了網路爬蟲和一些網頁相關的功能,目的就是從一個簡單的站內檢索推廣到全球網路的搜尋上,就像Google一樣。

    Nutch在業界的影響力比Lucene更大。

    大批網站採用了Nutch平臺,大大降低了技術門檻,使低成本的普通計算機取代高價的Web伺服器成為可能。甚至有一段時間,在矽谷有了一股用Nutch低成本創業的潮流。

    隨著時間的推移,無論是Google還是Nutch,都面臨搜尋物件“體積”不斷增大的問題。

    尤其是Google,作為網際網路搜尋引擎,需要儲存大量的網頁,並不斷最佳化自己的搜尋演算法,提升搜尋效率。

    Google搜尋欄

    在這個過程中,Google確實找到了不少好辦法,並且無私地分享了出來。

    2003年,Google發表了一篇技術學術論文,公開介紹了自己的谷歌檔案系統GFS(Google File System)。這是Google公司為了儲存海量搜尋資料而設計的專用檔案系統。

    第二年,也就是2004年,Doug Cutting基於Google的GFS論文,實現了分散式檔案儲存系統,並將它命名為NDFS(Nutch Distributed File System)。

    還是2004年,Google又發表了一篇技術學術論文,介紹自己的MapReduce程式設計模型。這個程式設計模型,用於大規模資料集(大於1TB)的並行分析運算。

    第二年(2005年),Doug Cutting又基於MapReduce,在Nutch搜尋引擎實現了該功能。

    2006年,當時依然很厲害的Yahoo(雅虎)公司,招安了Doug Cutting。

    這裡要補充說明一下雅虎招安Doug的背景:2004年之前,作為網際網路開拓者的雅虎,是使用Google搜尋引擎作為自家搜尋服務的。在2004年開始,雅虎放棄了Google,開始自己研發搜尋引擎。所以。。。

    加盟Yahoo之後,Doug Cutting將NDFS和MapReduce進行了升級改造,並重新命名為Hadoop(NDFS也改名為HDFS,Hadoop Distributed File System)。

    這個,就是後來大名鼎鼎的大資料框架系統——Hadoop的由來。而Doug Cutting,則被人們稱為Hadoop之父。

    Hadoop這個名字,實際上是Doug Cutting他兒子的黃色玩具大象的名字。所以,Hadoop的Logo,就是一隻奔跑的黃色大象。

    我們繼續往下說。

    還是2006年,Google又發論文了。

    這次,它們介紹了自己的BigTable。這是一種分散式資料儲存系統,一種用來處理海量資料的非關係型資料庫。

    Doug Cutting當然沒有放過,在自己的hadoop系統裡面,引入了BigTable,並命名為HBase。

    好吧,反正就是緊跟Google時代步伐,你出什麼,我學什麼。

    所以,Hadoop的核心部分,基本上都有Google的影子。

    2008年1月,Hadoop成功上位,正式成為Apache基金會的頂級專案。

    同年2月,Yahoo宣佈建成了一個擁有1萬個核心的Hadoop叢集,並將自己的搜尋引擎產品部署在上面。

    7月,Hadoop打破世界紀錄,成為最快排序1TB資料的系統,用時209秒。

    此後,Hadoop便進入了高速發展期,直至現在。

    Hadoop的核心架構

    Hadoop的核心,說白了,就是HDFS和MapReduce。HDFS為海量資料提供了儲存,而MapReduce為海量資料提供了計算框架。

    Hadoop核心架構

    讓我們來仔細看看,它們分別是怎麼工作的。

    首先看看HDFS。

    整個HDFS有三個重要角色:NameNode(名稱節點)、DataNode(資料節點)和Client(客戶機)。

    典型的主從架構,用TCP/IP通訊

    NameNode:是Master節點(主節點),可以看作是分散式檔案系統中的管理者,主要負責管理檔案系統的名稱空間、叢集配置資訊和儲存塊的複製等。NameNode會將檔案系統的Meta-data儲存在記憶體中,這些資訊主要包括了檔案資訊、每一個檔案對應的檔案塊的資訊和每一個檔案塊在DataNode的資訊等。

    DataNode:是Slave節點(從節點),是檔案儲存的基本單元,它將Block儲存在本地檔案系統中,儲存了Block的Meta-data,同時週期性地將所有存在的Block資訊傳送給NameNode。

    Client:切分檔案;訪問HDFS;與NameNode互動,獲得檔案位置資訊;與DataNode互動,讀取和寫入資料。 

    還有一個Block(塊)的概念:Block是HDFS中的基本讀寫單元;HDFS中的檔案都是被切割為block(塊)進行儲存的;這些塊被複制到多個DataNode中;塊的大小(通常為64MB)和複製的塊數量在建立檔案時由Client決定。

    我們來簡單看看HDFS的讀寫流程。

    首先是寫入流程:

    1 使用者向Client(客戶機)提出請求。例如,需要寫入200MB的資料。

    2 Client制定計劃:將資料按照64MB為塊,進行切割;所有的塊都儲存三份。

    3 Client將大檔案切分成塊(block)。

    4 針對第一個塊,Client告訴NameNode(主控節點),請幫助我,將64MB的塊複製三份。

    5 NameNode告訴Client三個DataNode(資料節點)的地址,並且將它們根據到Client的距離,進行了排序。

    6 Client把資料和清單發給第一個DataNode。

    7 第一個DataNode將資料複製給第二個DataNode。

    8 第二個DataNode將資料複製給第三個DataNode。

    9 如果某一個塊的所有資料都已寫入,就會向NameNode反饋已完成。

    10 對第二個Block,也進行相同的操作。

    11 所有Block都完成後,關閉檔案。NameNode會將資料持久化到磁碟上。

    讀取流程:

    1 使用者向Client提出讀取請求。

    2 Client向NameNode請求這個檔案的所有資訊。

    3 NameNode將給Client這個檔案的塊列表,以及儲存各個塊的資料節點清單(按照和客戶端的距離排序)。

    4 Client從距離最近的資料節點下載所需的塊。

    (注意:以上只是簡化的描述,實際過程會更加複雜。)

    再來看MapReduce。

    MapReduce其實是一種程式設計模型。這個模型的核心步驟主要分兩部分:Map(對映)和Reduce(歸約)。

    當你向MapReduce框架提交一個計算作業時,它會首先把計算作業拆分成若干個Map任務,然後分配到不同的節點上去執行,每一個Map任務處理輸入資料中的一部分,當Map任務完成後,它會生成一些中間檔案,這些中間檔案將會作為Reduce任務的輸入資料。Reduce任務的主要目標就是把前面若干個Map的輸出彙總到一起並輸出。

    是不是有點暈?我們來舉個例子。

    上圖是一個統計詞頻的任務。

    1 Hadoop將輸入資料切成若干個分片,並將每個split(分割)交給一個map task(Map任務)處理。

    2 Mapping之後,相當於得出這個task裡面,每個詞以及它出現的次數。

    3 shuffle(拖移)將相同的詞放在一起,並對它們進行排序,分成若干個分片。

    4 根據這些分片,進行reduce(歸約)。

    5 統計出reduce task的結果,輸出到檔案。

    如果還是沒明白的吧,再舉一個例子。

    一個老師有100份試卷要閱卷。他找來5個幫手,扔給每個幫手20份試卷。幫手各自閱卷。最後,幫手們將成績彙總給老師。很簡單了吧?

    MapReduce這個框架模型,極大地方便了程式設計人員在不會分散式並行程式設計的情況下,將自己的程式執行在分散式系統上。

    哦,差點忘了,在MapReduce裡,為了完成上面這些過程,需要兩個角色:JobTracker和TaskTracker。

    JobTracker用於排程和管理其它的TaskTracker。JobTracker可以運行於叢集中任一臺計算機上。TaskTracker 負責執行任務,必須運行於 DataNode 上。

    1.0版本與2.0版本

    2011年11月,Hadoop 1.0.0版本正式釋出,意味著可以用於商業化。

    但是,1.0版本中,存在一些問題:

    1 擴充套件性差,JobTracker負載較重,成為效能瓶頸。

    2 可靠性差,NameNode只有一個,萬一掛掉,整個系統就會崩潰。

    3 僅適用MapReduce一種計算方式。

    4 資源管理的效率比較低。

    所以,2012年5月,Hadoop推出了 2.0版本 。

    2.0版本中,在HDFS之上,增加了YARN(資源管理框架)層。它是一個資源管理模組,為各類應用程式提供資源管理和排程。

    此外,2.0版本還提升了系統的安全穩定性。

    所以,後來行業裡基本上都是使用2.0版本。目前Hadoop又進一步發展到3.X版本。

    Hadoop的生態圈

    經過時間的累積,Hadoop已經從最開始的兩三個元件,發展成一個擁有20多個部件的生態系統。

    在整個Hadoop架構中,計算框架起到承上啟下的作用,一方面可以操作HDFS中的資料,另一方面可以被封裝,提供Hive、Pig這樣的上層元件的呼叫。

    我們簡單介紹一下其中幾個比較重要的元件。

    Hive:是一個數據倉庫工具,可以將結構化的資料檔案對映為一張資料庫表,透過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合資料倉庫的統計分析。

    Pig:是一個基於Hadoop的大規模資料分析工具,它提供的SQL-LIKE語言叫Pig Latin,該語言的編譯器會把類SQL的資料分析請求轉換為一系列經過最佳化處理的MapReduce運算。

    Ambari:Hadoop管理工具,可以快捷地監控、部署、管理叢集。

    Sqoop:用於在Hadoop與傳統的資料庫間進行資料的傳遞。

    Mahout:一個可擴充套件的機器學習和資料探勘庫。

    再上一張圖,可能看得更直觀一點:

    Hadoop的優點和應用

    總的來看,Hadoop有以下優點:

    高可靠性:這個是由它的基因決定的。它的基因來自Google。Google最擅長的事情,就是“垃圾利用”。Google起家的時候就是窮,買不起高階伺服器,所以,特別喜歡在普通電腦上部署這種大型系統。雖然硬體不可靠,但是系統非常可靠。

    高擴充套件性:Hadoop是在可用的計算機叢集間分配資料並完成計算任務的,這些叢集可以方便地進行擴充套件。說白了,想變大很容易。

    高效性:Hadoop能夠在節點之間動態地移動資料,並保證各個節點的動態平衡,因此處理速度非常快。

    高容錯性:Hadoop能夠自動儲存資料的多個副本,並且能夠自動將失敗的任務重新分配。這個其實也算是高可靠性。

    低成本:Hadoop是開源的,依賴於社群服務,使用成本比較低。

    基於這些優點,Hadoop適合應用於大資料儲存和大資料分析的應用,適合於伺服器幾千臺到幾萬臺的叢集執行,支援PB級的儲存容量。

    Hadoop的應用非常廣泛,包括:搜尋、日誌處理、推薦系統、資料分析、影片影象分析、資料儲存等,都可以使用它進行部署。

    目前,包括Yahoo、IBM、Facebook、亞馬遜、阿里巴巴、華為、百度、騰訊等公司,都採用Hadoop構建自己的大資料系統。

    除了上述大型企業將Hadoop技術運用在自身的服務中外,一些提供Hadoop解決方案的商業型公司也紛紛跟進,利用自身技術對Hadoop進行最佳化、改進、二次開發等,然後對外提供商業服務。

    比較知名的,是Cloudera公司。

    它創辦於2008年,專業從事基於Hadoop的資料管理軟體銷售和服務,還提供Hadoop相關的支援、諮詢、培訓等服務,有點類似於RedHat在Linux世界中的角色。前面我們提到的Hadoop之父,Doug Cutting,都被這家公司聘請為首席架構師。

    Hadoop和Spark

    最後,我再介紹一下大家關心的Spark。

    Spark同樣是Apache軟體基金會的頂級專案。它可以理解為在Hadoop基礎上的一種改進。

    它是加州大學伯克利分校AMP實驗室所開源的類Hadoop MapReduce的通用並行框架。相對比Hadoop,它可以說是青出於藍而勝於藍。

    前面我們說了,MapReduce是面向磁碟的。因此,受限於磁碟讀寫效能的約束,MapReduce在處理迭代計算、實時計算、互動式資料查詢等方面並不高效。但是,這些計算卻在圖計算、資料探勘和機器學習等相關應用領域中非常常見。

    而Spark是面向記憶體的。這使得Spark能夠為多個不同資料來源的資料提供近乎實時的處理效能,適用於需要多次操作特定資料集的應用場景。

    在相同的實驗環境下處理相同的資料,若在記憶體中執行,那麼Spark要比MapReduce快100倍。其它方面,例如處理迭代運算、計算資料分析類報表、排序等,Spark都比MapReduce快很多。

    此外,Spark在易用性、通用性等方面,也比Hadoop更強。

    所以,Spark的風頭,已經蓋過了Hadoop。

    結語

    以上,就是小棗君關於大資料相關技術的介紹。

    小棗君個人覺得,相比於雲計算技術來說,大資料的應用範圍比較有限,並不是所有的公司都適用,也不是所有的業務場景都適用,沒有必要跟風追捧,更不能盲目上馬。

    対於個人來說,大資料系統的架構非常龐大,內容也非常複雜,入門起來會比較吃力(實踐練習倒是門檻很低,幾臺電腦足矣)。所以,如果不是特別渴望朝這個方向發展,可以不必急於學習它。或者說,可以先進行初步的瞭解,後續如果真的要從事相關的工作,再進行深入學習也不遲。

  • 2 # 菜菜菜鳥

    Hadoop擁有強大的生態,作為一種分散式系統架構,Hadoop適用於低成本、大規模的資料分析環境,能夠接受海量資料的儲存和運算,雖然Spark改進了很多MapReduce的演算法,但實際上更多的是作為Hadoop的一種補充。從效能方面來比較,Spark在於運算速度快。Spark還可以執行批次處理,然而它真正擅長的是處理流工作負載、互動式查詢和機器學習。

    相比MapReduce基於磁碟的批次處理引擎,Spark賴以成名之處是其資料實時處理功能。Spark與Hadoop及其模組相容。實際上,在Hadoop的專案頁面上,Spark就被列為是一個模組。Spark有自己的頁面,因為雖然它可以透過YARN(另一種資源協調者)在Hadoop叢集中執行,但是它也有一種獨立模式。它可以作為 Hadoop模組來執行,也可以作為獨立解決方案來執行。MapReduce和Spark的主要區別在於,MapReduce使用持久儲存,而Spark使用彈性分散式資料集(RDDS)。

    Spark之所以如此快速,原因在於它在記憶體中處理一切資料。沒錯,它還可以使用磁碟來處理未全部裝入到記憶體中的資料。

  • 3 # 西蒙先生

    回答這個問題之前,首先要搞明白spark和Hadoop各自的定義以及用途,搞明白這個之後這個問題的答案也就出來了。

    首先Apache Spark 是專為大規模資料處理而設計的快速通用的計算引擎

    Hadoop是一個由Apache基金會所開發的分散式系統基礎架構

    Spark是一個計算引擎,主要用來做資料計算用。其核心模組包括Spark Core,Spark Streaming(流式計算),MLlib(叢集學習),GraphX(圖計算模組)。

    Hadoop主要包括HDFS(分散式儲存)、MapReduce(平行計算引擎)、Yarn(資源排程)。

    由此看來,Spark≈MapReduce,同時Spark相比於MapReduce有著更方便的函式處理,在計算速度,開發效率上更有著無法比擬的優勢。Spark也支援外部的記憶體管理元件(Alluxio等),不排除未來Spark也提供分散式檔案儲存,目前來看沒戲。其現在的發展目標主要集中在機器學習這塊,已經提供了一體化的機器學習平臺。這一點Flink還差點事。目前在國內更多的應用場景是Spark+Hadoop,即使用Spark來做資料計算,用Hadoop的HDFS來做分散式檔案儲存,用Yarn來做資源排程。

  • 中秋節和大豐收的關聯?
  • 辛酉政變中,慈禧如何聯合奕訢搞掉顧命八大臣?