快手一面:講一講 Hadoop、Hive、Spark 之間的關係?

架構師之道 發佈 2022-05-25T01:46:15.177429+00:00

5G 時代,運營商網絡不斷提速,成本越來越低,流量越來越便宜。給 網際網路、物聯網、網際網路+ 各個行業的高速發展創造了非常好的有利條件,同時也產生了海量數據。

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 ) 

轉換成代碼落地,分別繼承 MapperReducer 兩個類,然後實現裡面的兩個默認方法,完成業務邏輯。

所有的複雜的業務全部抽象成 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 切分多個階段,一個階段里的多個算子(如:textFileflatMapmap)可以合併成一個任務,然後採用上面的函數編程思想處理數據分片
  • 使用 內存 存儲中間計算結果

藉助這些亮點優化,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

關鍵字: