5G 時代,運營商網絡不斷提速,成本越來越低,流量越來越便宜。
給 網際網路、物聯網、網際網路+ 各個行業的高速發展創造了非常好的有利條件,同時也產生了海量數據。
如何做好數據分析,計算,提取有價值信息,大數據技術一直是一個熱門賽道
今天我們就對 Hadoop、Hive、Spark 做下分析對比
Hadoop
Hadoop 稱為大數據技術的基石。
由兩部分組成,分布式存儲(HDFS)和分布式計算(MapReduce)
HDFS 有兩個關鍵組件:
1、NameNode
負責分布式文件系統的元數據(MetaData)管理,如:文件路徑名、數據塊的 ID 以及存儲位置等信息,相當於作業系統中文件分配表(FAT)的角色
2、DataNode
負責文件數據的存儲和讀寫操作,HDFS 將文件數據分割成若干數據塊(Block),每個 DataNode 存儲一部分數據塊,從而將一個大文件分割存儲在整個 HDFS 集群中
HDFS的高可用設計:數據存儲故障容錯、磁碟故障容錯、DataNode故障容錯、NameNode故障容錯
MapReduce 既是一個編程模型,又是一個計算框架。
包含 Map 和 Reduce 兩個過程。
計算過程:
- 首先,將輸入的內容轉換為 < key , Value > 健值對
- 將相同的 key 集中在一起,形成 < key,List<value> >
- 最後,將 List<value> 進行歸約合併,輸出零或多個 < key , Value >
public void map(Object key, Text value, Context context)
public void reduce(Text key, Iterable<IntWritable> values, Context context )
轉換成代碼落地,分別繼承 Mapper 和 Reducer 兩個類,然後實現裡面的兩個默認方法,完成業務邏輯。
所有的複雜的業務全部抽象成 Map 和 Reduce 這兩個函數計算,當我們面對複雜的具體業務功能通過 Map 和 Reduce 的多次 自由組合,從而實現業務邏輯。
當然,上面的程序在分布式系統中需要引擎調度,該計算框架也稱為 MapReduce
所以,MapReduce 即是 編程模型,MapReduce 代碼程序,也是調度分布式計算的引擎框架。
亮點:
- 數據不出門,算法滿天跑。每次任務計算,只需要將對應的任務分發到數據所在的伺服器上。避免大數據傳輸的性能損耗。
- 引入 shuffle 機制,將不同伺服器的中間計算結果,通過 Partitioner 用 Key 的哈希值對 Reduce 任務數取模,分組路由到 Reduce 伺服器上,進行合併計算
- 框架自帶調度引擎
不足:
- 每次 Map 任務的計算結果都會寫入到本地文件系統,速度會慢些
- 如果實現複雜的業務邏輯,通過 Map -- Reduce 的多次自由組合,開發成本還是有些大。
Tom哥有話說:
Hadoop 作為大數據框架的鼻祖,在海量數據處理方面確實讓我們眼前一亮。
但是完美總是需要持續打磨,Hadoop在處理速度、開發門檻等方面有很多不足。慢慢的隨著達爾文進化論,市場上開始百花齊放,各種優秀的大數據框架陸續出現。
Hive
大數據時代,數據分析師崗位非常多,這幫人擅長通過 SQL 來進行數據分析和統計。
SQL 方式操控數據簡單、直接,比起 MapReduce代碼 ,大大降低了編程難度,提升了開發效率。
Hive 通過執行引擎 Driver 將數據表的信息記錄在 Metastore 元數據組件中(包含表名、欄位名、欄位類型、關聯的HDFS文件路徑)
運行過程:
- 通過 Hive 的命令行工具或 JDBC,提交 SQL 語句
- Driver 將語句提交給編譯器,進行 SQL解析、語法分析、語法優化等一系列操作,生成函數的 DAG(有向無環圖)
- 根據執行計劃,生成一個 MapReduce 任務作業
- 最後,提交給 Hadoop MapReduce 計算框架處理
Tom哥有話說:
Hive 可以直白理解為 Hadoop 的 API 包裝,採用 SQL 語法實現業務,底層依然 Map Reduce 引擎來執行,但是轉換邏輯被 Hive 作為通用模塊實現掉了。
我們發現 Hive 本質上並沒有什麼技術創新,只是將 資料庫 和 MapReduce 兩者有效結合,但是卻給上層的程式設計師提供了極大的開發便利。
雖然,在性能方面沒有質的飛躍,但是由於開發門檻大大降低,在離線批處理占有非常大市場。
Spark
無論是 MapReduce 還是 Hive 在執行速度上其實是很慢的,但是沒有比較就沒有傷害,直到 Spark 框架的橫空出現,人們的意識也發生了重大改變。
Spark 將大數據集合抽象成一個 RDD 對象,然後提供了 轉換、動作 兩大類算子函數,對RDD進行處理,並得到一個新的 RDD,然後繼續後續疊代計算,像 Stream 流一樣依次執行,直到任務結束。內部也是採用分片處理,每個分片都會分配一個執行線程。
傳統的面向對象編程思路:
將一個數據集合作為入參傳遞給一個函數方法,經過運算,返回一個新的數據集合。然後將這個新的數據集合作為入參傳遞給下一個函數方法,直到最後計算完成,輸出結果。
如果這個數據集有 1億條,總共兩次函數運算,每一個函數運算,都要遍歷1億次,那麼總的時間複雜度是 2億次。
函數式編程思路:
將數據集合轉換成流,每個元素依次經過上面兩個函數處理,最後得到一個新的結果集合。整個流程只需要遍歷一趟,那麼總的時間複雜度是 1億次。
面對海量的數據以及較多的算子組合運算,這種性能累計提升還是非常明顯的。
Spark 的一些亮點:
- 引入惰性計算,只有當開發者調用了 Actions 算子,之前的轉換算子才會執行。
- 以 shuffle 為邊界,將 DAG 切分多個階段,一個階段里的多個算子(如:textFile、flatMap、map)可以合併成一個任務,然後採用上面的函數編程思想處理數據分片
- 使用 內存 存儲中間計算結果
藉助這些亮點優化,Spark 比 MapReduce 運行速度快很多。上圖是邏輯回歸機器學習算法的運行時間比較 ,Spark 比 MapReduce 快 100 多倍
當然Spark 為了保留 Hive 的SQL優勢,也推出了 Spark SQL,將 SQL 語句解析成 Spark 的執行計劃,在 Spark 上執行。
Tom哥有話說:
Spark 像個孫猴子一樣橫空出世,也是有先天條件的。Hadoop 早期受內存容量和成本制約很大,但隨著科技進步,到了Spark時期內存條件已經具備,架構思路也可以直接按照內存的玩法標準來設計。
有時候就是這樣,趕上一個好時候,豬都能飛上天。要想成功,天時地利人和,缺一不可。
來源:https://mp.weixin.qq.com/s/B18HwyMHx-91_5ZyT4KXDQ