hadoop的HDFS和map-reduce

此處主要是將HDFS和map-reduce的基本原理寫在這兒,免得以後忘記了找不到

HDFS:

大體框架如下:

NameNode:記錄文件在DataNode的位置信息和元數據信息,類似index,真正的數據存儲在DataNode節點

DataNode:存儲的管理者,一次寫入,多次讀取(好處:不需要考慮一致性),將程序劃分爲許多大小爲64M的數據塊,分佈並冗餘存放在各個DataNode節點中

過程如下:

1,當客戶端發起讀任務時,查詢NameNode,查詢讀寫數據塊具體位置,NameNode將分佈信息返還給client

2,client再次一次對文件所在的DataNode發起讀命令,DataNode將文件一次傳入client

3,當發出的是寫命令時候,namenode還需要負責查詢是否有相同文件在系統中,沒有則分配磁盤快來存儲,HDFS中沒有修改一說,修改就是刪除原來的,重新存進去

4,爲了維護NameNode和DataNode指尖的一致性,DataNode還需要定時向NameNode發送心跳程序,以便NameNode能獲取各個存儲節點的實時信息

HDFS特性:

1充分考慮硬件特性——錯誤和故障頻發,所以設定了冗餘機制

2由於hadoop應用特性基本是大量讀,很少寫或者改,所以HDFS不支持修改,修改只是刪掉原來數據重新寫入

HDFS優缺點:

1,便宜的存儲了大量數據

2,流式訪問,超大型數據處理的利器

3,不支持超低延遲查詢

4,對大量小文件無法高效存儲(歸檔解決)

5,不支持同時寫(此問題在實際運用環境中其實不是很重要)


HDFS的命令行操作:

查詢文件:

buptpwy@buptpwy-Lenovo:~/下載/hadoop/hadoop-0.20.2$ bin/hadoop dfs -ls
Found 5 items
drwxr-xr-x   - buptpwy supergroup          0 2015-05-07 15:04 /user/buptpwy/book
drwxr-xr-x   - buptpwy supergroup          0 2015-05-09 20:17 /user/buptpwy/book-out
drwxr-xr-x   - buptpwy supergroup          0 2015-05-09 20:01 /user/buptpwy/book-outbin
drwxr-xr-x   - buptpwy supergroup          0 2015-05-05 15:24 /user/buptpwy/c50test
drwxr-xr-x   - buptpwy supergroup          0 2015-04-28 15:50 /user/buptpwy/out

值得注意的事,在hadoop中沒有當前目錄的概念,所以我們要查詢下級目錄得自己指定:

buptpwy@buptpwy-Lenovo:~/下載/hadoop/hadoop-0.20.2$ bin/hadoop dfs -ls book
Found 1 items
-rw-r--r--   1 buptpwy supergroup         62 2015-05-07 15:04 /user/buptpwy/book/book

上傳文件到HDFS:

buptpwy@buptpwy-Lenovo:~/下載/hadoop/hadoop-0.20.2$ bin/hadoop dfs -put /usr/local/hadoop/book/ book

-put後面第一個參數指定的是欲上傳的文件,第二個參數指定的是要上傳文件在HDFS的目錄

從HDFS下載文件:

buptpwy@buptpwy-Lenovo:~/下載/hadoop/hadoop-0.20.2$ bin/hadoop dfs -get haha ~/ 桌面/


第一個參數指定的是在HDFS的位置,第二個是自己鎖鑰存儲的位置

刪除HDFS文件:

buptpwy@buptpwy-Lenovo:~/下載/hadoop/hadoop-0.20.2$ bin/hadoop dfs -rmr haha
Deleted hdfs://localhost:9000/user/buptpwy/haha

用-rm不級聯刪除

查看HDFS中的某個文件:

buptpwy@buptpwy-Lenovo:~/下載/hadoop/hadoop-0.20.2$ bin/hadoop dfs -cat book/book/part

map-reduce

先想象下如下一種應用:我們有從1955年到2015年世界各地的天氣情況(有哪個地方氣溫多少,溼度多少氣壓多少等等),大小大概有30多個G,當我們要試圖找出每年9月份溫度超過30度的地方數怎麼辦?在hadoop或者說map-reduce系統中,我們用如下方法:

1.將超大文件傳到HDFS系統中,由HDFS分部到集羣中去(也就是將我們的數據傳入集羣)

2.編寫map程序,通過jobtracker傳送到各個節點運行,程序不是在發起訪問的節點執行的!由於這種並行才能加快處理速度。(也就是編寫程序,將每條9月份的記錄找出溫度超過90讀的以key-value鍵值隊傳送)

3.編寫suffler程序:此步驟不是必須,但是它可以將mapper的輸出做一些預處理,減輕reducer的工作壓力,也是在DataNode上執行(此處我們可以將相同年份的鍵值對合並)

4.reducer程序:將所有mapper或suffler輸出合併,做一個彙總計算並輸出結果,此處同樣不是在發起訪問節點執行!(將相同年份的鍵值合併。注:不同datanode傳來的數據中可能有年份相同的鍵值對)

5.將結果傳入hdfs文件系統。

mapper:分而治之,就近並行計算

reducer:彙總,總結mapper

suffler:減少數據傳送工作,可以沒有,可以多個,也可以沒有

具體的流程或者工作架構請看下圖:

1.申請作業,客戶端調用jobclient接口申請發起作業

2獲取作業ID,jobclient從jobtracker節點獲取作業ID

3.上傳MR資源:jobclien將我們要運行的MapReduce程序傳上HDFS系統

4.提交作業:將作業信息發送給jobtracker。

5.作業初始化

6.獲取分片信息,jobtracker從HDFS中獲取哪些節點執行MR程序

7.任務分配,把任務分配給tasktracker(其實就是DataNode)。

8.取回MR資源。TaskTracker從HDFS中取得MR程序

9,10 加載環境並執行


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章