歡迎你們前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~ 算法
本文討論大數據處理生態系統和相關的架構棧,包括對適應於不一樣任務的多種框架特性的調研。除此以外,文章還從多個層次對框架進行深刻研究,如存儲,資源管理,數據處理,查詢和機器學習。sql
使用門檻的下降是互聯網上數據最初增加的驅動力。隨着智能手機和平板電腦等一系列新設備的出現,這一趨勢得以增強。在第一代數據增加的基礎上,社交媒體平臺推進數據量以指數級增加,這也就是所謂由社交媒體釋放的第二次增加浪潮。信息分享平臺的協做特質促成了數據分享的病毒式增加。第三次的增加則很大程度上來自於智能互聯設備的的快速增長,而這也將帶來史無前例的數據擴張。此外,科學領域的進步和更加廉價的計算力已經爲包括醫療科學、物理學、天文學和基因學在內的諸多領域帶來了新的應用。在這些領域中,收集的數據被用來驗證假說,推進新的發現和創造。shell
數據獲取和存儲的快速擴張將咱們帶到了一個新的階段——將數據處理爲有意義的解釋。處理大量數據的現實須要致使了對可擴展及並行系統的需求。這些系統可以以更高的速度和更大的規模處理數據。開源技術就是大規模數據處理所需高性能計算技術的不二之選。本文將爲大數據處理棧不一樣層次可用的開源框架及組件作整體的介紹。數據庫
隨着愈來愈多的大數據(以數量,速度和種類三個V爲特徵)的生成和收集,各類各樣系統開始發展,以期挖掘出這些數據的巨大而多樣的潛力。儘管許多系統表現出了相同的特性,但它們每每有着不一樣的設計哲學,這也帶來了更大的選擇空間。企業決定數據策略的戰略指導原則之一就是採用通用的數據存儲層,這將便利不一樣框架對數據的運用,同時數據也可以跨框架共享。圖1展現了一個典型的數據處理架構棧。apache
這個架構棧也能夠被視爲一個多階段的數據處理流水線,如圖2所示。非結構化的數據每每有多樣的格式,例如文本數據、圖片、視頻和音頻等。而這些數據也有包括交易記錄、網絡日誌、公衆網站、數據庫、多種設備和工具以及其餘相聯繫的數據在內的多種數據源。通過清洗和錯誤檢查後,這些數據會進入數據存儲層。接下來的任務就是利用下一部分描述的框架對數據進行反覆和交互式的處理。處理過程自己可能會有多個子階段,期間有可能伴隨着與存儲層的交互。它能夠進一步使用統計算法探索和建模來推導和驗證假設。用數據對算法進行訓練,而後將其用於預測建模。當有新的數據集進入系統時,這些算法能夠進行週期性的訓練。數據集進一步用於探索性分析,從而發現潛藏的知識和看法。在處理和探索過程當中,經過使用可視化工具對處理後的數據集進行可視化,促進對於數據的理解,並可將其用於與利益相關者的溝通。編程
存儲層中的數據能夠被組織內的不一樣利益相關者複用。大數據一般是不肯定的,而多數處理框架已經適應了這一特性。事實上,這個特性正是一個框架成功的關鍵因素。下面,讓咱們討論這些不一樣層次的框架和庫。後端
讓咱們從存儲和數據層開始。這是大數據棧是最重要的組成要素和基礎。正如其名,大數據一般以其大量的數據爲特徵,而這要求巨大乃至理論上無限的存儲容量。促成更便宜的存儲和計算資源的技術進步,致使了集羣存儲和計算平臺的出現。這些平臺擺脫了存儲限制,並實質上實現了無限量的數據存儲。這些平臺不受傳統數據建模和模式設計範例的限制。它們一般是無模式的,容許存儲全部形式的數據(結構化,半結構化和非結構化)。這使得建立更具動態性的系統成爲可能,分析人員也能夠擺脫現有模型的限制對數據進行探索。數組
這是Hadoop生態系統中的可擴展的、具備容錯性的分佈式文件系統。將商用服務器添加到集羣中便可擴展HDFS。已知的最大集羣包括了大約4500個節點和高達128PB的數據。HDFS支持並行讀取和寫入數據。HDFS系統中的帶寬隨節點數量線性變化。經過存儲在系統中的多個數據副本實現內置冗餘。這些文件被分解成塊(Blocks)並像文件同樣存儲在集羣中。爲了實現可靠性,這些文件會被複制多份。HDFS具備主/從體系結構,在集羣中有一個稱爲NameNode的組件,該組件做爲主服務器。NameNode管理文件系統命名空間(文件,目錄和塊以及它們的關係)。命名空間存儲在內存中,而且按期將更改保存到磁盤中。除此以外,還有一些稱爲DataNode的從屬組件,在集羣中的每一個節點都有一個這樣的組件。這些進程管理特定計算節點所依賴的存儲。性能優化
隨着Web不斷髮展並變得更易於訪問,現有的關係數據庫技術沒法知足Web 2.0的大量數據和併發需求。這已經成爲顯而易見的事實。爲了知足這一需求,「不只僅是數據查詢(Not only SQL)」數據庫做爲存儲和管理系統的新選擇出現了。相比於HDFS和Hadoop最爲數據分析領域實時或批量處理引擎,NoSQL數據庫本質上是應用於基於先後端系統的Web應用的數據存儲層,特別那些須要有大量併發處理能力的Web應用。服務器
這些數據庫的特色包括他們一般是無結構的(或者僅須要極少的結構設計)、水平可擴展以及依賴於事件一致性模型而不是即時一致性模型。
如今出現了四種基本的NoSQL架構,他們是
這是一個跨集羣框架和做業提供可靠內存數據共享的平臺。Tachyon實質上位於諸如HDFS之類的存儲平臺之上,所以可跨羣集框架和做業提供之內存爲中心的數據處理功能。儘管Spark等一些現有的集羣計算框架已經實現了在內存中進行數據處理,但這一方案存在三個關鍵的缺陷,促成了Tachyon的發展:
Tachyon正是爲了解決上述問題而得以發展。它經過與存儲層創建血統關係(lineage)實現。它能夠在內存中只存儲一個數據副本,這些數據副本可在全部框架(如Spark,MapReduce等)中使用。此外,它經過依賴於血統關係的從新計算來實現容錯功能。
將數據保存到存儲層後,下一步就是處理這些數據,並從中造成看法。咱們將在這裏比較幾個框架。
是大數據處理框架的祖師爺,而且已經成爲這些技術聚集的事實上的平臺。該平臺的成本效益和可擴展性徹底符合業界大規模數據處理的需求。此外,平臺的可靠性,社區支持和圍繞該平臺產生的生態系統使該平臺獲得更普遍的採用。
Hadoop生態系統有三個主要目標:
是MapReduce編程範式的實現(由Google論文推廣)。這種編程範式意在經過大型集羣並行處理超大型數據集,同時確保可靠性和容錯性。MapReduce() 範式自己是一個創建在確保可靠性和可擴展性的分佈式文件系統之上的概念。一個MapReduce() 程序包括兩個程序 Map() 和Reduce()。Map() 過程並行處理輸入數據集併產生處理後的輸出。因爲Map() 階段發生在一個很是大的分佈式數據集上,散佈在一個巨大的節點集羣中,隨後執行Reduce() 階段,該階段聚合來自於多個Map節點排序後的數據集,這個框架以及底層的HDFS系統可以處理以PB爲單位運行的,分佈在數千個節點上的超大型數據集。
是一個數據處理系統,結合了Hadoop HDFS層的可擴展性和強大功能以及做爲關係型數據庫基石的的聲明式特性和性能優化。Flink提供了一個運行時系統,它是Hadoop MapReduce框架的替代選擇。
是一個分佈式數據處理引擎,創建在Yarn(Hadoop 2.0生態系統)之上。Tez將數據處理工做流程建模爲分佈式非循環圖(Distributed Acyclic Graphs, DAGs)。憑藉這一獨特功能,Tez可以讓開發人員直觀地將複雜的數據處理做業建模爲一系列任務,同時利用Hadoop 2.0生態系統的基礎資源管理功能。
是大數據處理的分佈式執行引擎,可提供處理內存中的大型數據集的高效抽象。雖然基於Yarn的MapReduce提供了使用集羣計算資源的抽象方法,但它在須要複用數據的迭代算法和交互式數據挖掘算法中缺少效率。Spark以RDD(彈性分佈式數據集)的形式實現內存中的容錯數據抽象。這中種存儲在內存中的並行數據結構形式存在。RDD經過追蹤轉換過程(血統,lineage)而不是實際數據實現容錯功能。若是有一個部分在丟失後須要回覆,則只須要在這個數據集上執行變換。這比跨節點複製數據集以提升容錯性要高效得多。據推測,這比Hadoop MR快100倍。
Spark還爲批處理,流數據處理,交互式數據挖掘提供了統一的框架,還包括Java,Scala和Python中的API在內。它提供了一個交互式命令行工具(shell)。經過這一工具可使用快速查詢功能、用於機器學習的庫(MLLib和GraphX)、用於圖形數據處理的API、SparkSQL(一種聲明性查詢語言)和SparkStreaming(用於流數據處理的流式API)。SparkStreaming是一個用於實時處理事件流的系統。SparkStreaming將流處理視爲微批處理(microbatch)數據集。輸入流被分紅預設時長的批次。這些批處理被輸入到底層的Spark系統中,而且經過與Spark批處理編程範式相同的方式進行處理。這使得實時處理所需的極低延遲和實時集成批處理特性得以實現。
是一個用於實時處理連續數據流的系統。它具備高度可擴展性,容錯能力,並實現了可靠處理的概念,從而不會丟失任何事件。Hadoop提供了批量處理數據的框架,而Storm在流式事件數據實現了一樣的功能。它使用有向無環圖(DAG),並藉助噴嘴(spouts, 輸入數據源)和閃電(bolts)的概念來定義數據處理流水線或拓撲。流是流經這些處理流水線的元組。Storm集羣由三部分組成:
隨着集羣編程框架逐漸演變爲解決大數據處理問題的主要手段,另外一個問題伴隨着更大規模的實用嘗試而開始出現。使用這些計算框架編程變得愈來愈複雜且難以維護。技能可伸縮性成爲另外一個值得關注的問題,由於有許多人熟悉熟悉SQL和腳本等技能的領域專業知識。所以,集羣計算框架的更高層次的編程抽象開始出現,它們對低層次的編程API進行抽象。本部分討論了其中一些框架。
是MapReduce的高級語言實現。語言接口從用高級語言編寫的查詢命令在內部生成MapReduce程序,從而抽象出MapReduce和HDFS的基本內容。Pig實現了PigLatin,這是一種相似過程式的語言接口,而Hive提供了Hive查詢語言(HQL),它是一種與SQL相似的聲明式語言接口。
Pig適合於爲迭代處理場景編寫數據處理流程。Hive採用聲明式SQL語言,可用於臨時數據查詢,探索性分析和商業智能(BI)。
是大數據處理生態系統的新進者。它提供了一個支持大數據近似查詢的交互式查詢處理平臺。隨着數據量呈指數級增加,愈來愈多的長期研究出如今這個領域,並聚焦於建立低延遲的計算模型。Apache Spark在朝這一方向發展,它致力於利用內存數據結構下降延遲。
Blink DB經過引入近似查詢的概念進一步壓縮延遲基準。在一些行業案例中,若是速度的能有所提高,少許的錯誤是能夠接受的。BlinkDB經過在原始數據集的樣本而非整個數據集上運行查詢。該框架能爲查詢定義可接受的錯誤界限,或指定時間限制。系統根據這些約束處理查詢並返回給定範圍內的結果。BlinkDB利用統計學採樣偏差的概念,即採樣偏差不隨整體規模而變化,而是取決於樣本量。所以,即使隨着數據量的增長,相同的樣本量總能以適當的水平反映整體的性質。這種想法帶來了使人難以置信的性能改善。因爲查詢的時間大部分是消耗在I/O過程當中,若是將樣本量設定爲原始數據的10%,處理速度就能夠提高10倍,同時偏差小於0.02%。BlinkDB構建在Hive Query引擎上,並支持Hadoop MR和Apache Shark執行引擎。BlinkDB對這種複雜的近似方法進行抽象,並提供了一種類SQL的命令結構。這種語言在用戶利用原始命令自定義的函數以外還支持標準的聚合,過濾,分組,聯合以及嵌套查詢。
集羣資源管理是大數據處理棧中的關鍵組件之一。現有的資源管理框架已經可以將支持多種上層框架的通用性與一些所需的重要特性結合起來。這些特性包括徹底不一樣的處理需求、數據控制的穩健性和無縫恢復。通用框架將避免在集羣內的不一樣框架之間複製大量數據。提供一個易於使用的管理接口一樣十分重要。下面我會介紹幾個實現了這一功能的資源管理框架。
Hadoop 1.0徹底根據MapReduce範式而構建的引擎。隨着Hadoop被普遍接受爲分佈式大數據批處理系統的平臺,其餘計算模式(如消息傳遞接口,圖形處理,實時流處理,臨時和迭代處理等)的需求也不斷增加。MapReduce做爲一種編程範式,並不支持這些要求。所以,新的(以及其餘現有的)框架開始發展。另外,HDFS做爲大數據存儲系統獲得了普遍接受,而爲其餘框架單獨設計存儲結構並無什麼意義。於是Hadoop社區致力改進現有平臺,從而使其不只僅侷限於MapReduce。這一努力的成果就是Hadoop 2.0,它將資源管理與應用程序管理分離開來。資源管理系統被命名爲Yarn。Yarn一樣是主從架構,資源管理器做爲主服務,負責管理對集羣上不一樣應用程序的資源分配。從屬組件稱爲NodeManager,在羣集中的每一個節點上運行,並負責啓動應用程序所需的計算容器。ApplicationMaster是框架特定的實體。它負責協調ResourceManager中的資源並與節點管理器一塊兒提交和監視應用程序任務。ApplicationMaster是框架特定的實體。它負責協調ResourceManager中的資源並與節點管理器一塊兒提交和監視應用程序任務。
這種解耦容許其餘框架與MapReduce一塊兒工做,訪問和共享同一集羣上的數據,從而有助於提升集羣利用率。
是一種通用的集羣資源管理框架,能夠管理數據中心中的全部資源。Mesos採用與Yarn不一樣的方式調度工做。Mesos實現了一個兩級調度機制,主服務器向框架調度器提供資源,框架決定是否接受或拒絕它們。這個模型使得Mesos變得具備良好可擴展性和通用性,而且容許框架能很好地知足特定的目標,好比數據局部性。Mesos是一個主/從架構,Mesos主服務器(master)在其中一個節點上運行,而且與多個備用主服務器相配合,以便在出現故障時進行接管。主服務器管理集羣節點上的從屬進程以及在節點上運行任務的框架。運行在Mesos上的框架有兩個組件:在主服務器上註冊的框架調度器,以及在Mesos從服務器上啓動的框架執行器。在Mesos中,從服務器向主服務器報告所提供的可用資源。Mesos 主服務器查找分配策略並根據策略向框架提供資源。該框架根據其目標和須要運行的任務能夠徹底接受,部分或甚至拒絕分配。若是有的話,它會發回一個接受的響應和要運行的任務。Mesos主服務器將這些任務轉發給相應的從服務器,這些從服務器將所提供的資源分配給執行者,而後執行器啓動任務。
若是不能最終提供商業價值,將努力付出在大數據上將毫無心義。機器學習使系統可以學習或處理大量數據,並可以將其應用於預測未知輸入數據集上的結果。在顯示生活中,已經有許多機器學習系統的案例,例如定向廣告,推薦引擎,「下一個最佳報價/行爲」,自學自治系統等。下面這個領域的一些框架。
旨在提供一個可伸縮的機器學習平臺。它實現了多種」開箱即用「算法,並提供了一個實現自定義算法的框架。儘管Apache Mahout是最先的機器學習庫之一,但它最初是做爲爲MapReduce編程範例而編寫的。然而,MapReduce不太適合機器學習算法的迭代特性,所以並無取得很大的成功。當Spark開始展露頭角時,Mahout已被移植到Apache Spark,並從新命名爲Spark MLLib,且再也不使用Hadoop MapReduce。
是一個可擴展的機器學習平臺。它創建在在Spark的上層,可視爲Spark Core執行引擎的擴展。Spark MLLib已是Spark Core的本地擴展實現,所以它有許多優點。Spark MLLib有幾種爲ML問題編寫的算法,例如分類,迴歸,協同過濾,聚類,分解等。
是一種可擴展的機器學習服務器。它提供了一個框架,可加快機器學習應用程序的原型設計和生產應用。它基於Apache Spark構建,並利用Spark MLLib所提供多種機器學習算法的實現。它提供了一個接口將訓練過的預測模型抽象爲一種服務,而這是經過基於事件服務器的架構提供的。它還提供了一種將分佈式環境中持續訓練訓練模型的方法。生成的事件是實時收集的,而且能夠用來做爲批處理做業從新訓練模型。客戶端應用程序能夠經過REST API查詢服務,並JSON響應返回預測結果。
問答相關閱讀
此文已由做者受權騰訊雲+社區發佈,原文連接:https://cloud.tencent.com/dev...