什麼叫大數據,「大」,說的並不只是數據的「多」!不能用數據到了多少TB ,多少PB 來講。html
對於大數據,能夠用四個詞來表示:大量,多樣,實時,不肯定。node
也就是數據的量龐大,數據的種類繁雜多樣話,數據的變化飛快,數據的真假存疑。服務器
大量:這個你們都知道,想百度,淘寶,騰訊,Facebook,Twitter等網站上的一些信息,這確定算是大數據了,都要存儲下來。網絡
多樣:數據的多樣性,是說數據多是結構型的數據,也多是非結構行的文本,圖片,視頻,語音,日誌,郵件等。負載均衡
實時:大數據須要快速的,實時的進行處理。若是說對時間要求低,那弄幾個機器,對小數據進行處理,等個十天半月的出來結果,這樣也沒有什麼意義了。框架
不肯定: 數據是存在真僞的,各類各樣的數據,有的有用,有的沒用。很難辨析。分佈式
根據以上的特色,咱們須要一個東西,來:函數
1.存儲大量數據oop
2.快速的處理大量數據佈局
3.從大量數據中進行分析
因而就有了這樣一個模型hadoop。
1.Hadoop是Apache旗下的一套開源軟件平臺,是用來分析和處理大數據的軟件平臺。
2.Hadoop提供的功能:利用服務器集羣,根據用戶的自定義業務邏輯, 對海量數據進行分佈式處理。
3.Hadoop的核心組件:由底層往上分別是 HDFS、Yarn、MapReduce。
4.廣義上來講,Hadoop一般指的是指一個更普遍的概念->Hadoop生態 圈。
5.雲計算是分佈式計算、並行計算、網格計算、多核計算、網絡存儲、虛 擬化、負載均衡等傳統計算機技術和互聯網技術融合發展的產物。藉助 IaaS(基礎設施即服務)、PaaS(平臺即服務)、SaaS(軟件即服務)等業 務模式,把強大的計算能力提供給終端用戶。
6.現階段,雲計算的兩大底層支撐技術爲虛擬化和大數據技術。
7.HADOOP則是雲計算的PaaS層的解決方案之一,並不等同於PaaS,更不等同於雲計算自己。
8.HADOOP應用於數據服務基礎平臺建設。
9.HADOOP用於用戶畫像。
10.HADOOP用於網站點擊流日誌數據挖掘
這就至關於一個生態系統,或者能夠當作一個操做系統XP,win7,win10
HDFS和MapReduce爲操做系統的核心,Hive,Pig,Mathout,Zookeeper,Flume,Sqoop,HBase等,都是操做系統上的一些軟件,或應用。
HDFS是塊級別的分佈式文件存儲系統。是hadoop中數據存儲管理的基礎,具備高度容錯性,能檢測和應對硬件故障。
包含四個部分:HDFS Client、NameCode(nn)、DataNode(dn)、Secondary NameCode(2nn)
NameNode(nn):元數據節點,存儲文件的元數據。如文件名、文件目錄結構,文件屬性(生成時間、副本數、文件權限),以及每一個文件的塊列表和塊所在獲得DataNode等;管理HDFS的名稱空間和數據塊映射信息,配置副本策略,處理客戶端請求;
它是描述數據的數據,至關於圖書館的檢索系統。
DataNode(dn):數據節點,在本地文件系統存儲文件塊數據,以及塊數據的校驗和。
存儲實際的數據,彙報存儲信息給namenode,至關於書櫃。
Secondary NameNode(2nn):用來監控HDFS狀態的輔助後臺程序,每隔一段時間獲取HDFS元數據的快照。輔助namenode,分擔其工做量:按期合併fsimage和fsedits,推送給namenode。
從圖上來看,HDFS的簡單原理。
Rack1,Rack2,Rack3是三個機架;
1,2,3,4,5,6,7,8,9,10,11,12 是機架上的十二臺服務器。
Block A, Block B, Block C爲三個信息塊,也就是要存的數據。
從總體佈局上來看,信息塊被分配到機架上。看似很均勻。這樣分配的目的,就是備份,防止某一個機器宕機後,單點故障的發生。
HDFS有不少特色:
① 保存多個副本,且提供容錯機制,副本丟失或宕機自動恢復。默認存3份。
② 運行在廉價的機器上。
③ 適合大數據的處理。多大?多小?HDFS默認會將文件分割成block,64M爲1個block。而後將block按鍵值對存儲在HDFS上,並將鍵值對的映射存到內存中。若是小文件太多,那內存的負擔會很重。(從2.7.3版本開始,官方關於Data Blocks 的說明中,block size由64 MB變成了128 MB的。)
如上圖所示,HDFS也是按照Master和Slave的結構。分NameNode、SecondaryNameNode、DataNode這幾個角色。
HDFS Client:就是客戶端。
一、提供一些命令來管理、訪問 HDFS,好比啓動或者關閉HDFS。
二、與 DataNode 交互,讀取或者寫入數據;讀取時,要與NameNode 交互,獲取文件的位置信息;寫入 HDFS 的時候,Client 將文件切分紅 一個一個的Block,而後進行存儲。
NameNode:是Master節點,是大領導。管理數據塊映射;處理客戶端的讀寫請求;配置副本策略;管理HDFS的名稱空間;
SecondaryNameNode:是一個小弟,分擔大哥namenode的工做量;是NameNode的冷備份;合併fsimage和fsedits而後再發給namenode。
DataNode:Slave節點,奴隸,幹活的。負責存儲client發來的數據塊block;執行數據塊的讀寫操做。
熱備份:b是a的熱備份,若是a壞掉。那麼b立刻運行代替a的工做。
冷備份:b是a的冷備份,若是a壞掉。那麼b不能立刻代替a工做。可是b上存儲a的一些信息,減小a壞掉以後的損失。
fsimage:元數據鏡像文件(文件系統的目錄樹。)
edits:元數據的操做日誌(針對文件系統作的修改操做記錄)
namenode內存中存儲的是=fsimage+edits。
SecondaryNameNode負責定時默認1小時,從namenode上,獲取fsimage和edits來進行合併,而後再發送給namenode。減小namenode的工做量。
有一個文件FileA,100M大小。Client將FileA寫入到HDFS上。
HDFS按默認配置。
HDFS分佈在三個機架上Rack1,Rack2,Rack3。
a. Client將FileA按64M分塊。分紅兩塊,block1和Block2;
b. Client向nameNode發送寫數據請求,如圖藍色虛線①------>。
c. NameNode節點,記錄block信息。並返回可用的DataNode,如粉色虛線②--------->。
Block1: host2,host1,host3
Block2: host7,host8,host4
原理:
NameNode具備RackAware機架感知功能,這個能夠配置。
若client爲DataNode節點,那存儲block時,規則爲:副本1,同client的節點上;副本2,不一樣機架節點上;副本3,同第二個副本機架的另外一個節點上;其餘副本隨機挑選。
若client不爲DataNode節點,那存儲block時,規則爲:副本1,隨機選擇一個節點上;副本2,不一樣副本1,機架上;副本3,同副本2相同的另外一個節點上;其餘副本隨機挑選。
d. client向DataNode發送block1;發送過程是以流式寫入。
流式寫入過程,
1>將64M的block1按64k的package劃分;
2>而後將第一個package發送給host2;
3>host2接收完後,將第一個package發送給host1,同時client想host2發送第二個package;
4>host1接收完第一個package後,發送給host3,同時接收host2發來的第二個package。
5>以此類推,如圖紅線實線所示,直到將block1發送完畢。
6>host2,host1,host3向NameNode,host2向Client發送通知,說「消息發送完了」。如圖粉紅顏色實線所示。
7>client收到host2發來的消息後,向namenode發送消息,說我寫完了。這樣就真完成了。如圖黃色粗實線
8>發送完block1後,再向host7,host8,host4發送block2,如圖藍色實線所示。
9>發送完block2後,host7,host8,host4向NameNode,host7向Client發送通知,如圖淺綠色實線所示。
10>client向NameNode發送消息,說我寫完了,如圖黃色粗實線。。。這樣就完畢了。
分析,經過寫過程,咱們能夠了解到:
①寫1T文件,咱們須要3T的存儲,3T的網絡流量貸款。
②在執行讀或寫的過程當中,NameNode和DataNode經過HeartBeat進行保存通訊,肯定DataNode活着。若是發現DataNode死掉了,就將死掉的DataNode上的數據,放到其餘節點去。讀取時,要讀其餘節點去。
③掛掉一個節點,不要緊,還有其餘節點能夠備份;甚至,掛掉某一個機架,也不要緊;其餘機架上,也有備份。
讀操做就簡單一些了,如圖所示,client要從datanode上,讀取FileA。而FileA由block1和block2組成。
那麼,讀操做流程爲:
a. client向namenode發送讀請求。
b. namenode查看Metadata信息,返回fileA的block的位置。
block1:host2,host1,host3
block2:host7,host8,host4
c. block的位置是有前後順序的,先讀block1,再讀block2。並且block1去host2上讀取;而後block2,去host7上讀取;
上面例子中,client位於機架外,那麼若是client位於機架內某個DataNode上,例如,client是host6。那麼讀取的時候,遵循的規律是:
優選讀取本機架上的數據。
Yarn顧名思義 管理資源的 那麼具備足夠的通用性,能夠支持其餘的分佈式計算模式。
Yarn還能很方便的管理諸如Hive、Hbase、Pig、Spark/Shark等應用。
Yarn可使各類應用互不干擾的運行在同一個Hadoop系統中,實現整個集羣資源的共享。
包含兩個進程:Nodemanager,ResourceManager
mapreduce是一種採用分而治之的分佈式計算框架,用於處理數據量大的計算。
如一複雜的計算任務,單臺服務器沒法勝任時,可將此大任務切分紅一個個小的任務,小任務分別在不一樣的服務器上並行的執行;最終再彙總每一個小任務的結果
MapReduce由兩個階段組成:
Map階段(切分紅一個個小的任務)
Reduce階段(彙總小任務的結果)
用戶只需實現map()和reduce()兩個函數,便可實現分佈式計算
執行流程圖以下:
jobtracker
master節點,只有一個,管理全部做業,任務/做業的監控,錯誤處理等,將任務分解成一系列任務,並分派給tasktracker。
tacktracker
slave節點,運行 map task和reducetask;並與jobtracker交互,彙報任務狀態。
map task
解析每條數據記錄,傳遞給用戶編寫的map()並執行,將輸出結果寫入到本地磁盤(若是爲map—only做業,則直接寫入HDFS)。
reduce task
從map 它深入地執行結果中,遠程讀取輸入數據,對數據進行排序,將數據分組傳遞給用戶編寫的reduce函數執行
原理圖以下:
整體來講:是個總分總的結構,先分解成多個小任務,在map階段處理完成後,彙總成少數個小任務server在Reduce階段處理進行排序 分組等操做。
Map階段解說:先把一個大任務分解split成多個小任務
(1) 讀取HDFS中的文件。每一行解析成一個<k,v>。每個鍵值對調用一次map函數。<0,hello you> <1,hello me>
(2)覆蓋map(),接收(1)產生的<k,v>,進行處理,轉換爲新的<k,v>輸出。 <hello,1> <you,1> <hello,1> <me,1>
(3)對(2)輸出的<k,v>進行分區。默認分爲一個區。
(4)對不一樣分區中的數據進行排序(按照k)、分組。分組指的是相同key的value放到一個集合中。 排序後:<hello,1> <hello,1> <me,1> <you,1> 分組後:<hello,{1,1}><me,{1}><you,{1}>
(5)(可選)對分組後的數據進行歸約。
Rduce階段解說:把map階段的結果進行彙總
(1)多個map任務的輸出,按照不一樣的分區,經過網絡copy到不一樣的reduce節點上。
(2)對多個map的輸出進行合併、排序。覆蓋reduce函數,接收的是分組後的數據,實現本身的業務邏輯,<hello,2> <me,1> <you,1> 處理後,產生新的<k,v>輸出。
(3)對reduce輸出的<k,v>寫到HDFS中。
參考文獻:
https://www.cnblogs.com/laov/p/3434917.html
https://www.jianshu.com/p/f1e785fffd4d,
https://blog.csdn.net/qq_39783601/article/details/104928348,
https://blog.csdn.net/zcb_data/article/details/80402411,
https://www.cnblogs.com/ahu-lichang/p/6645074.html.