柚子快報激活碼778899分享:Hadoop 基礎(chǔ)原理
柚子快報激活碼778899分享:Hadoop 基礎(chǔ)原理
Hadoop 基礎(chǔ)原理
基本介紹Hadoop 的必要性Hadoop 核心組件Hadoop 生態(tài)系統(tǒng)中的附加組件
HDFSHDFS 集群架構(gòu)HDFS 讀寫流程HDFS 寫流程HDFS 讀流程
NameNode 持久化機(jī)制
MapReduce底層原理示例
Hadoop 是一個由 Apache 基金會開發(fā)的分布式系統(tǒng)基礎(chǔ)架構(gòu),主要解決海量數(shù)據(jù)的存儲和計算問題,廣義上 Hadoop 指的是 Hadoop 生態(tài)圈,包含 HDFS、Hive、MapReduce 多種組件
基本介紹
Hadoop 的必要性
Hadoop 主要解決了海量數(shù)據(jù)的存儲問題
高可用性:底層會維護(hù)多個數(shù)據(jù)副本,所以即使 Hadoop 某個計算元素或存儲出現(xiàn)故障,也不會導(dǎo)致數(shù)據(jù)的丟失。高擴(kuò)展性: 在集群間分配任務(wù)數(shù)據(jù),可方便的擴(kuò)展數(shù)以千計的節(jié)點。高效性: 在 MapReduce 的思想下,Hadoop 是并行工作的,以加快任務(wù)處理速度。高容錯性: 能夠自動將失敗的任務(wù)重新分配。
一個 block 塊在 NameNode 中占150byte(固定),過多小文件會占用 NameNode 內(nèi)存 小文件的尋址時間大于讀取時間 不支持并發(fā)寫和隨機(jī)寫 一個文件只能有一個寫,不允許多線程同時寫
Hadoop 核心組件
Hadoop 核心組件包含以下兩種
HDFS:高可靠、高吞吐的分布式文件系統(tǒng)MapReduce:分布式離線并行計算框架
Hadoop 生態(tài)系統(tǒng)中的附加組件
我們后端開發(fā)接觸的比較多的是Hadoop 生態(tài)系統(tǒng)中的附加組件,Sqoop 以及 Hive,分別用來同步數(shù)據(jù)和查詢數(shù)據(jù)
Sqoop:Hadoop(Hive)與傳統(tǒng)數(shù)據(jù)庫(Mysql)之間傳輸數(shù)據(jù)的工具,支持批量導(dǎo)入和導(dǎo)出數(shù)據(jù) Flume 高可用、高可靠分布式的海量日志采集、聚合和傳輸系統(tǒng)Spark:是一個通用的分布式計算框架,支持內(nèi)存計算,可以顯著提高數(shù)據(jù)處理速度。它支持多種計算模式,包括批處理、流處理、機(jī)器學(xué)習(xí)等HBase:HBase 是一個分布式的、面向列的 NoSQL 數(shù)據(jù)庫,建立在 HDFS 之上。它提供了實時讀寫訪問,適合處理大規(guī)模數(shù)據(jù)集Hive:是基于 Hadoop 的數(shù)據(jù)倉庫工具,它提供了一種 SQL-like 的查詢語言(HiveQL),使用戶可以方便地進(jìn)行數(shù)據(jù)查詢和分析。它可以將 HiveQL 轉(zhuǎn)換為 MapReduce 任務(wù)執(zhí)行
HDFS
HDFS 是 Hadoop 的分布式文件系統(tǒng),解決了海量數(shù)據(jù)的存儲問題
HDFS 集群架構(gòu)
HDFS 使用 Master/Slave 架構(gòu),架構(gòu)邏輯比較類似 Kafka、ES 等 Apache 的其他項目
一般一個集群有一個 NameNode 和一定數(shù)目 DataNode 組成,Namenode 是 HDFS 集群主節(jié)點,Datanode 是 HDFS 集群從節(jié)點,兩種角色各司其職,共同協(xié)調(diào)完成分布式的文件存儲服務(wù)
HDFS 中文件在物理上是分塊存儲,通過 dfs.blocksize 配置,2.x之后的版本默認(rèn)128M
HDFS 中文件在邏輯上是連續(xù)的,提供一個文件目錄樹
HDFS 讀寫流程
HDFS 寫流程
1,客戶端向 NameNode 發(fā)送寫數(shù)據(jù)請求(包含待上傳文件名和將要上傳的路徑) 2,NameNode 檢查路徑是否存在,文件是否重名等(假設(shè)滿足上傳條件) 3,NameNode 向客戶端響應(yīng)數(shù)據(jù),可以上傳文件 4,客戶端根據(jù)文件大小進(jìn)行切分成一個個 block 塊,并向 NameNode 發(fā)送提交即將上傳 block1 的請求 5,NameNode 查詢 DataNode 信息,規(guī)劃 block1 的存儲位置 6,NameNode 向客戶端返回 block1 可以存儲的數(shù)據(jù)節(jié)點 ip 列表 7,客戶端直接請求數(shù)據(jù)節(jié)點1上傳 block1,數(shù)據(jù)節(jié)點1存儲 block1 完畢并根據(jù) ip 列表將 block1 發(fā)送給數(shù)據(jù)節(jié)點8,數(shù)據(jù)節(jié)點2存儲完畢 block1 并根據(jù) ip 列表將 block1 發(fā)送給數(shù)據(jù)節(jié)點3,數(shù)據(jù)節(jié)點3存儲完成響應(yīng)數(shù)據(jù)給數(shù)據(jù)節(jié)點2,數(shù)據(jù)節(jié)點2將響應(yīng)數(shù)據(jù)給數(shù)據(jù)節(jié)點1,數(shù)據(jù)節(jié)點1將存儲結(jié)果返回給 NameNode 和客戶端 9,重復(fù)第四步上傳下一個block 我知道你們想問什么,為什么 HDFS 的寫流程必須一個個的上傳塊,不能并發(fā)上傳嗎?這是設(shè)計者對于 HDFS 寫少讀多場景的這種考量。該場景如此設(shè)計的好處:
1,每個數(shù)據(jù)塊的寫入是原子操作,即要么成功寫入,要么完全不寫入。這確保了數(shù)據(jù)的一致性。如果并發(fā)寫入需要考量并發(fā)安全性問題 2,集群默認(rèn)全同步,數(shù)據(jù)高可靠
HDFS 讀流程
1,客戶端向 NameNode 請求下載文件 2,NameNode 返回目標(biāo)文件的元數(shù)據(jù) 3,客戶端根據(jù)元數(shù)據(jù)請求 DataNode 讀取數(shù)據(jù) block 4,DataNode 向客戶端傳輸數(shù)據(jù) 5,重復(fù)第三步,直到所有的塊傳輸完成 6,客戶端根據(jù)元數(shù)據(jù)組裝 block 塊完成讀取數(shù)據(jù)
NameNode 持久化機(jī)制
NameNode 元數(shù)據(jù)的存儲位置是在內(nèi)存中,但是內(nèi)存一旦斷電元數(shù)據(jù)將丟失,因此必須將內(nèi)存中的元數(shù)據(jù)存儲在磁盤中用于備份,這里引入額外一個概念叫 Fsimagem
Fsimagem 為內(nèi)存元數(shù)據(jù)的備份。若內(nèi)存的元數(shù)據(jù)發(fā)生改變,如果同時更新 Fsimage 會降低效率,如果不更新會發(fā)生數(shù)據(jù)不一致問題
針對上述問題,最終邏輯是不更新 Fsimage 文件,為解決數(shù)據(jù)不一致問題,引入 edits 文件,該文件只記錄操作并且采用追加寫的形式,即每當(dāng)內(nèi)存的元數(shù)據(jù)發(fā)生改變的同時記錄本次操作記錄追加到磁盤中的 edits,這樣內(nèi)存元數(shù)據(jù)等于磁盤的 Fsimage + edits
當(dāng) NameNode 啟動時先滾動 edits 并生成一個空的 edits.inprogress,會將 Fsimage 和 edits 文件加載到內(nèi)存中進(jìn)行合并,之后的操作(增刪)將追加到 edits.inprogress 中
其行為類似 redis 的 RDB 和 AOF 機(jī)制
MapReduce
MapReduce 是一種編程模型和分布式計算框架,是開發(fā)基于 Hadoop 的數(shù)據(jù)分析應(yīng)用的核心框架。MapReduce 的主要用途包括:
大數(shù)據(jù)處理:處理和分析 PB 級別的數(shù)據(jù),如日志分析、數(shù)據(jù)挖掘、統(tǒng)計分析等數(shù)據(jù)轉(zhuǎn)換:將原始數(shù)據(jù)轉(zhuǎn)換為所需的格式,如 ETL(Extract, Transform, Load)任務(wù)數(shù)據(jù)索引:構(gòu)建大規(guī)模數(shù)據(jù)的索引,如搜索引擎的網(wǎng)頁索引機(jī)器學(xué)習(xí):處理大規(guī)模的訓(xùn)練數(shù)據(jù),進(jìn)行模型訓(xùn)練和預(yù)測
總之,只要是統(tǒng)計或者計算 Hadoop 中的數(shù)據(jù),都會用到 MapReduce。Hive(基于 Hadoop 的數(shù)據(jù)倉庫工具,它提供了一種 SQL-like 的查詢語言,使得用戶可以方便地進(jìn)行數(shù)據(jù)查詢和分析)底層對接 MapReduce 來執(zhí)行查詢和數(shù)據(jù)處理任務(wù)。Hive 的查詢最終會被轉(zhuǎn)換成一個或多個 MapReduce 作業(yè)來執(zhí)行
底層原理
MapReduce 實現(xiàn)分布式計算分成2個階段,Map(映射)和 Reduce(歸約)
第一個階段 MapTask 并發(fā)實例,完全并行運行,互不干擾。首先會將輸入數(shù)據(jù)分割成多個小塊,每個小塊稱為一個切片(split)。每個切片的大小通常與 HDFS 的塊大?。J(rèn) 128MB)一致。這么做使數(shù)據(jù)能夠并行處理,提高處理速度。
隨后我們對輸入數(shù)據(jù)進(jìn)行處理,生成中間鍵值對(key-value pairs)。每個 Map 任務(wù)從輸入切片中讀取數(shù)據(jù),對每條記錄調(diào)用用戶定義的 Map 函數(shù),生成中間鍵值對
第二個階段 ReduceTask 完全并行運行,數(shù)據(jù)依賴上一個階段所有 MapTask 并發(fā)實例輸出。將 Map 任務(wù)生成的中間鍵值對進(jìn)行分區(qū)、排序和合并
分區(qū)(Partitioning):根據(jù)鍵的哈希值將中間鍵值對分配到不同的 Reduce 任務(wù)中排序(Sorting):對每個分區(qū)內(nèi)的鍵值對按鍵進(jìn)行排序合并(Merging):將來自不同 Map 任務(wù)的相同鍵的鍵值對合并在一起
MapReduce 編程模型只能包含一個 Map 階段一個 Reduce 階段,但可以實現(xiàn)多個 MapReduce 串行運行
示例
上面的描述可能有些抽象,讓大家有很多問題,比如為啥 ReduceTask 也可以并行執(zhí)行?如果 MapTask 的產(chǎn)物是鍵值對的話,那么存放在 HDFS 的關(guān)系型表會怎么轉(zhuǎn)換成鍵值對然后暴露給我們?接下來舉個例子讓大家更加深入的了解問題:
假設(shè)我們有一個關(guān)系型表 users,其結(jié)構(gòu)如下:
user_idnameagecity1Alice25New York2Bob30London3Carol22New York4Dave28Tokyo
假設(shè)我們要計算每個城市的用戶數(shù)量:
SELECT city, COUNT(*) AS user_count
FROM users
GROUP BY city;
在這個例子中,Map 階段會將每行數(shù)據(jù)轉(zhuǎn)換為鍵值對,其中鍵是城市名稱,值是用戶 ID。例如:
輸入行:1, Alice, 25, New York。輸出鍵值對:(New York, 1)輸入行:2, Bob, 30, London。輸出鍵值對:(London, 2)輸入行:3, Carol, 22, Paris。輸出鍵值對:(New York, 3)輸入行:4, Dave, 28, Tokyo。輸出鍵值對:(Tokyo, 4)
Map 階段結(jié)束我們就得到很多鍵值對,在 Reduce 階段,Hive 會將 Map 任務(wù)生成的中間結(jié)果按鍵進(jìn)行分組,相同城市的鍵值對會被分到一個 ReduceTask 中:
(New York, [1,3]) -> (New York, 2)(London, [2]) -> (London, 1)(Tokyo, [4]) -> (Tokyo, 1)
ReduceTask 輸出最后的處理結(jié)果。所以一個 sql 在 Hive 中的執(zhí)行流程和普通 db 中是完全不一樣的。通過上面的 case 我們可以看出,先 map 后 reduce 事實上就是想利用并發(fā)的能力處理大量數(shù)據(jù),Hadoop 的創(chuàng)作者們將我們所有的查詢操作都抽象成了這完全可以并行執(zhí)行的兩步
柚子快報激活碼778899分享:Hadoop 基礎(chǔ)原理
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。