大數據是支持一系列技術(如各種Hadoop項目、NoSQL產品,甚至MPP數據庫系統)的術語,它通過驅動更好的分析和從數據中獲得有價值的信息為世界各地的組織機構極大地降低了成本,同時提供了新的見解和產品。在經濟衰退時期,企業更希望從己有資產中獲得更大的價值,而不是投資新的資產。大數據,特別是Hadoop,就是實現這個目標的理想手段。
什么是Hadoop?
Hadoop是一個由Apache基金會所開發的分布式系統基礎架構。用戶可以在不了解分布式底層細節的情況下,開發分布式程序。充分利用集群的威力進行高速運算和存儲。
2006年Hadoop項目誕生。Hadoop其最初只是雅虎公司用來解決網頁搜索問題的一個項目,后來因其技術的高效性,被ApacheSoftware Foundation公司引入并成為開源應用。Hadoop本身不是一個產品,而是由多個軟件產品組成的一個生態系統,這些軟件產品共同實現全面功能和靈活的大數據分析。Hadoop為用戶提供了一個可靠的共享存儲和分析系統。從技術上看,Hadoop由兩項關鍵服務構成:采用Hadoop分布式文件系統(HDFS)的可靠數據存儲服務,以及利用一種叫做MapReduce技術的高性能并行數據處理服務。這兩項服務的共同目標是,提供一個使對結構化和復雜數據的快速、可靠分析變為現實的基礎。
為什么要用Hadoop?
關系型數據庫(RDBMS)大部分價格高昂,要用RDBMS存儲不停增長的大數據,就必須無限量的擴充存儲容量。相比之下,Hadoop是開源軟件,無需license,只要是X86 CPU linux操作系統的話,都可以安裝Hadoop。現在的RDBMS采取的是在儲存數據的服務器中集中處理數據的方式;而Hadoop是將數據儲存在多臺的服務器中,在存儲數據的多臺服務器中同時處理數據。
九十年代的硬盤擁有1370MB的存儲空間和4.4MB/s的傳送速度,讀取整個硬盤數據需要的時間為五分鐘;現在的硬盤擁有1TB的存儲和100MB/s左右的傳輸速度,讀取整個硬盤數據的時間需要兩個半小時以上。
硬盤的容量增長迅速,但是access數據庫管理系統的發展卻跟不上。讀取花費時間長,使用時速度慢。為了克服這樣的問題,就有了現在的多臺服務器中分布式存儲數據然后以并行的方式處理。例如美國時代雜志在2008年度利用Amazon的EC2、S2以及Hadoop僅在一天之內,用了1萬美元就將130年間1100萬張新聞成功地轉換成了PDF文件。
Hadoop族群有哪些?
MapReduce:分布式處理和資源管理。
Hadoop MapReduce是一個用于編寫并行處理大數據集的應用程序的軟件框架。MapReduce作業將分割大型數據集并將數據組織成鍵值對進行處理。
為了充分利用Hadoop提供的并行處理優勢,我們需要將數據的查詢表示成 MapReduce 作業,它是客戶端需要執行的一個工作單元:它包括數據的輸入、MapReduce程序和配置信息。Hadoop將作業分成若干個小任務來執行,其中包括兩類任務:map任務和reduce任務。
有兩類節點控制著作業執行過程:—個jobtracker及一系列tasktracker。jobtracker 通過調度tasktracker上運行的任務,來協調所有運行在系統上的作業。tasktracker在運行任務的同時將運行進度報告發送給jobtracker,jobtracker由此記錄毎項作業任務的整體進度情況。如果其中一個任務失敗,jobtracker可以在另外一個 tasktracker節點上重新調度該任務。
Hadoop將MapReduce的輸入數據劃分成等長的小數據塊,稱為輸入分片(inputsplit) 或簡稱分片。Hadoop為每個分片構建一個map任務,并由該任務來運行用戶自定義的map函數從而處理分片中的毎條記錄。
擁有許多分片,意味著處理每個分片所需要的時間少于處理整個輸入數據所花的時間。因此,如果我們并行處理每個分片,且每個分片數據比較小,那么整個處理過程將獲得更好的負載平衡,因為一臺較快的計算機能夠處理的數據分片比一臺較慢的計算機更多,且成一定的比例。即使使用相同的機器,處理失敗的作業或其他同時運行的作業也能夠實現負載平衡,并且如果分片被切分得更細,負載平衡的質量會更好。
另一方面,如果分片切分得太小,那么管理分片的總時間和構建map任務的總時間將決定著作業的整個執行時間。對于大多數作業來說,一個合理的分片大小趨向于HDFS的一個塊的大小,默認是64 MB,不過可以針對集群調整這個默認值。
HDFS(Hadoop Distributed FileSystem)
Hadoop分布式文件系統(HDFS)是一種分布式文件系統,采用MapReduce,是 Hadoop 生態系統的核心。HDFS是HDInsight上Hadoop群集的標準文件系統。
HDFS以流式數據訪問模式來存儲超大文件,運行于商用硬件集群上。它的構建思路是這樣的:一次寫入、多次讀取是最髙效的訪問模式。數據集通常由數據源生成或從數據源復制而來,接著長時間在此數據集上進行各類分析。每次分析都將涉及該數據集的大部分數據甚至全部,因此讀取整個數據集的時間延遲比讀取第一條記錄的時間延遲更重要。當數據集的大小超過一臺獨立物理計算機的存儲能力時,就有必要對它進行分區(partition)并存儲到若干臺單獨的計算機上。管理網絡中跨多臺計算機存儲的文件系統稱為分布式文件系統(distributedfilesystem)。該系統架構于網絡之上,勢必會引入網絡編程的復雜性,因此分布式文件系統比普通磁盤文件系統更為復雜。例如,使文件系統能夠容忍節點故障且不丟失任何數據,就是一個極大的挑戰。
Hadoop在存儲有輸入數據(HDFS中的數據)的節點上運行map任務,可以獲得最佳性能。這就是所謂的數據本地化優化(datalocality optimization)。現在我們應該清楚為什么最佳分片的大小應該與塊大小相同:因為它是確保可以存儲在單個節點上的最大輸入塊的大小。如果分片跨越兩個數據塊,那么對于任何一個HDFS節點,基本上都不可能同時存儲這兩個數據塊,因此分片中的部分數據需要通過網絡傳輸到map任務節點,與使用本地數據運行整個map任務相比,這種方法顯然效率更低。
map任務將其輸出寫入本地硬盤,而非HDFS。這是為什么?因為map的輸出是中間結果:該中間結果由reduce任務處理后才產生最終輸出結果,而且一旦作業完成,map的輸出結果可以被刪除。因此,如果把它存儲在HDFS中并實現備份,難免有些小題大做。如果該節點上運行的map任務在將map中間結果傳送給reduce 任務之前失敗,Hadoop將在另一個節點上重新運行這個map任務以再次構建map 中間結果。
HBase:一個分布式、按列存儲數據庫。
HBase是一個在HDFS上開發的面向列的分布式數據庫。如果需要實時地隨機訪問超大規模數據集,就可以使用HBase應用。
雖然數據庫存儲和檢索的實現可以選擇很多不同的策略,但是絕大多數解決辦法,特別是關系數據庫技術的變種,不是為大規模可伸縮的分布式處理而設計的。很多廠商提供了復制(replication)和分區(partitioning)解決方案。讓數據庫能夠從單個節點上擴展出去,但是這些附加的技術大都屬于“事后”的解決辦法,而且非常難以安裝和維護。并且這些解決辦法常常要犧牲一些重要的RDBMS的特性。在一個“擴展的”RDBMS上,鏈接、復雜查詢、觸發器、視圖以及外鍵約束這些功能要么運行開銷大,要么根本無法用。
HBase從另一個方向來解決可伸縮性的問題。它自底向上地進行構建,能夠簡單地通過增加節點來達到線性擴展。HBase并不是關系型數據庫,它不支持SQL,但是在特定的問題空間里,它能夠做到RDBMS不能做的事:在廉價硬件構成的集群上管理超大規模的稀疏表。
Pig:更簡單的MapReduce 轉換腳本。
Apache Pig是一個高級平臺,允許你使用一種簡單腳本語言(稱為PigLatin)對超大型數據集執行復雜的MapReduce轉換。Pig轉換PigLatin腳本,使其可以在Hadoop內運行。可以創建用戶定義的函數(UDF)來擴充Pig Latin。
Pig為大型數據集的處理提供了更高層次的抽象。MapReduuce使程序員能夠自己定義一個map函數和一個緊跟其后的reduce函數。但是,你必須使你的數據處理過程與這一連續的map和reduce模式向匹配。很多時候,數據處理需要多個MapReduce過程才能實現。而使得數據處理過程與該模式匹配可能很困難。有了pig,就能使用更為豐富的數據結構。這些數據結構往往都是多值和嵌套的。Pig還提供了一套更強大的數據交換操作,包括在MapReduce中被忽略的鏈接操作。
Pig包括兩部分:
1、 用于描述數據流的語言,稱為Pig Latin。
2、 用于運行Pig Latin程序的執行環境。當前有兩個換進:單JVM中的本地執行環境和Hadoop集群中的分布式執行環境。
Pig Latin程序由一系列的“操作”(operation)或“變換”(transformation)組成。每個操作或變換對輸入進行數據處理,并產生輸出結果。從整體上看,這些操作描述了一個數據流。Pig執行環境把數據流翻譯為可執行的內部表示并運行它。在Pig內部,這些變換操作被轉換成一系列MapReduce作業,在多數情況下并不需要知道這些轉換是如何進行的。這樣一來,便可以將精力集中在數據上,而非執行細節上。
Pig是一種探索大規模數據集的腳本語言。MapReduce的一個缺點是開發周期太長,寫mapper和reduce,對代碼進行編譯和打包,提交作業,獲取結果,這整個過程非常耗時。即使使用streaming能在這一過程中去除代碼的編譯和打包步驟,仍不能改善這一情況。Pig的誘人之處在于僅用控制臺上的五六行Pig Latin代碼就能夠處理TB級的數據。
然而,Pig并不適用所欲的數據處理任務。和MapReduce一樣。它是為數據批處理而設計的。如果想執行的查詢只涉及一個大型數據中心的一小部分數據,Pig的表現并不會很好。這是因為它要掃描整個數據集或其中的很大一部分。
Avro (Microsoft .NET Libraryfor Avro):Microsoft.NET 環境的數據序列化。
Microsoft .NET Library for Avro針對 Microsoft.NET 環境序列化實現了ApacheAvro緊湊的二進制數據交換格式。它使用JavaScript對象表示法(JSON)定義與語言無關的架構,以支持語言互操作性,這意味著以一種語言序列化的數據可以用另一種語言讀取。有關格式的詳細信息可以在ApacheAvro規范中找到。Avro文件格式支持分布式MapReduce編程模型。文件是“可拆分的”,也就是說,你可以在文件中任意設置一個點,然后即可從某一特定塊開始讀取。
Hive和HCatalog:與結構化查詢語言(SQL) 類似的查詢,以及表和存儲管理層。
Apache Hive是構建于Hadoop上的一個數據倉庫軟件,允許使用類似于 SQL 的語言(稱為 HiveQL)來查詢和管理分布式存儲中的大型數據集。Hive(類似于Pig)是一種基于 MapReduce的抽象。在運行時,Hive會將查詢轉換為一系列MapReduce作業。Hive比Pig在概念上更接近于關系數據庫管理系統,因此適用于結構化程度更高的數據。對于非結構化數據,Pig是更佳的選擇。
Hive的設計目的是為了讓精通SQL技能(但java編程技能相對較弱)的分析師能夠對Facebook存放在HDFS中的大規模數據集執行查詢。今天Hive已經是一個成功的Apache項目,很多組織把它用作一個通用的,可伸縮的數據處理平臺。
Apache HCatalog是Hadoop的表和存儲管理層,為用戶提供數據的關系視圖。在HCatalog 中,你可以讀取和寫入采用可以寫入HiveSerDe(序列化程序-反序列化程序)的任何格式的文件。
Mahout:機器學習。
Apache Mahout是在Hadoop上運行的一種可擴展的計算機學習算法庫。計算機學習應用程序采用統計學原理,使系統學習數據并使用以往的結果來確定將來的行為。
Oozie:工作流管理。
Apache Oozie是一個管理Hadoop作業的工作流協調系統。它與Hadoop堆棧集成,支持 MapReduce、Pig、Hive和Sqoop的Hadoop作業。它也能用于安排特定于某系統的作業,例如Java程序或shell腳本。
Phoenix:基于HBase 的關系數據庫層。
Apache Phoenix是基于HBase的關系數據庫層。Phoenix提供JDBC驅動程序以允許用戶直接查詢和管理SQL表。Phoenix將查詢和其他語句轉換為本機NoSQLAPI調用(而不是使用MapReduce),因此可以在NoSQL存儲之上實現更快的應用程序。
Sqoop:數據導入和導出。
Apache Sqoop是一種用于在Hadoop和關系數據庫(如SQL)或其他結構化數據存儲之間盡可能高效地傳輸批量數據的工具。
ZooKeeper:協調分布式系統中的進程。
Apache ZooKeeper通過數據寄存器的共享層次結構命名空間(znode)協調大型分布式系統中的進程。Znode包含協調流程所需的少量元數據信息:狀態、位置、配置,等等。
摘自丨云角
云角成立于2012年,是一家專注于公有云和混合云平臺的遷移、運維和軟件開發的高科技企業,立志成為全球領先的云計算軟件和服務提供商。