1.用自己的話闡明Hadoop平台上HDFS和MapReduce的功能、工作原理和工作過程。
HDFS的概念: Hadoop分布式檔案系統(HDFS)被設計成适合運作在通用硬體(commodity hardware)上的分布式檔案系統、HDFS是一個高度容錯性的系統,适合部署在廉價的機器上。HDFS能提供高吞吐量的資料通路,非常适合大規模資料集上的應用。
HDFS的系統結構:

Master
和 Slave
結構。
分為三個角色:
NameNode
、 SecondaryNameNode
DataNode
。 Master節點:
1. 管理資料塊映射;
2. 處理用戶端的讀寫請求;
3. 配置副本政策;
4. 管理HDFS的名稱空間。
5. namenode 記憶體中存儲的是 = fsimage + edits。
Slave節點:
1. 存儲client發來的資料塊block;
2. 執行資料塊的讀寫操作。
HDFS的檔案讀取原理,詳細解析如下:
1、首先調用FileSystem對象的open方法,其實擷取的是一個DistributedFileSystem的執行個體。
2、DistributedFileSystem通過RPC(遠端過程調用)獲得檔案的第一批block的locations,同一block按照重複數會傳回多個locations,這些locations按照Hadoop拓撲結構排序,距離用戶端近的排在前面。
3、前兩步會傳回一個FSDataInputStream對象,該對象會被封裝成 DFSInputStream對象,DFSInputStream可以友善的管理datanode和namenode資料流。用戶端調用read方 法,DFSInputStream就會找出離用戶端最近的datanode并連接配接datanode。
4、資料從datanode源源不斷的流向用戶端。
5、如果第一個block塊的資料讀完了,就會關閉指向第一個block塊的datanode連接配接,接着讀取下一個block塊。這些操作對用戶端來說是透明的,從用戶端的角度來看隻是讀一個持續不斷的流。
6、如果第一批block都讀完了,DFSInputStream就會去namenode拿下一批blocks的location,然後繼續讀,如果所有的block塊都讀完,這時就會關閉掉所有的流。
MapReduce的概念:MapReduce是一種程式設計模型,用于大規模資料集(大于1TB)的并行運算,是面向大資料并行處理的計算模型、架構和平台,用Map和Reduce兩個函數程式設計實作基本的并行計算任務,提供了抽象的操作和并行程式設計接口,以簡單友善地完成大規模資料的程式設計和計算處理.
MapReduce的工作原理:
map task
程式會根據InputFormat将輸入檔案分割成splits,每個split會作為一個map task的輸入,每個map task會有一個記憶體緩沖區,
輸入資料經過map階段處理後的中間結果會寫入記憶體緩沖區,并且決定資料寫入到哪個partitioner,當寫入的資料到達記憶體緩沖
區的的閥值(預設是0.8),會啟動一個線程将記憶體中的資料溢寫入磁盤,同時不影響map中間結果繼續寫入緩沖區。在溢寫過程中,
MapReduce架構會對key進行排序,如果中間結果比較大,會形成多個溢寫檔案,最後的緩沖區資料也會全部溢寫入磁盤形成一個溢寫
檔案(最少有一個溢寫檔案),如果是多個溢寫檔案,則最後合并所有的溢寫檔案為一個檔案。
reduce task
當所有的map task完成後,每個map task會形成一個最終檔案,并且該檔案按區劃分。reduce任務啟動之前,一個map task完成後,
就會啟動線程來拉取map結果資料到相應的reduce task,不斷地合并資料,為reduce的資料輸入做準備,當所有的map tesk完成後,
資料也拉取合并完畢後,reduce task 啟動,最終将輸出輸出結果存入HDFS上。
2.HDFS上運作MapReduce
1.檢視是否已經安裝python:
2.在/home/hadoop/路徑下建立wc檔案夾,在檔案夾内建立mapper.py、reducer.py、run.sh和文本檔案HarryPotter.txt:
3.檢視mapper.py reducer.py run.sh的内容:
4)修改mapper.py和reducer.py檔案的權限:
4.在本地運作測試map函數和reduce函數
5.啟動Hadoop:HDFS, JobTracker, TaskTracker
6.streaming的jar檔案的路徑寫入環境變量,讓環境變量生效
7.source run.sh來執行mapreduce
8.檢視運作結果: