作業的要求來自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3319
1.用自己的話闡明Hadoop平台上HDFS和MapReduce的功能、工作原理和工作過程。
HDFS:首先,hdfs是一個檔案系統,用于存儲檔案,通過統一的命名空間——目錄樹來定位檔案;
其次,它是分布式的,由很多伺服器聯合起來實作其功能,叢集中的伺服器有各自的角色;
工作過程:分為分為寫操作和讀操作兩步
(1)寫操作:用戶端要向hdfs寫入資料,首先要跟namenode通信以确認可以寫檔案并獲得接收檔案block的datanode,然後,用戶端按照順序将檔案block逐個傳給相應datanode,并由接收到block的datanode負責向其他datanode複制block副本
(2)讀操作:用戶端跟namenode通信查詢中繼資料,找到檔案塊所在的datanode伺服器,挑選一台datanode(就近原則,然後随機)伺服器,請求建立socket流,datanode開始發送資料(從磁盤裡面讀取資料放入流,以packet為機關做校驗),用戶端以packet為機關接收,先在本地緩存,然後寫入目标檔案。
工作原理:
(1)寫操作:
1.根據NameNode通信請求上傳檔案,NameNode檢查目标檔案是否已存在,父目錄是否存在
2.NameNode傳回是否可以上傳
3.client會将檔案分成相應的塊,請求第一個 block該傳輸到哪些DataNode伺服器上 (NameNode節點會記錄block資訊,并告知Client可用的DataNode)
4.client向DataNode發送相應的塊,發送過程是以流式寫入
(2)讀操作:
1.client向NameNode發送讀請求;
2.NameNode檢視Metadata資訊,傳回fileA的block的位置:
3.資料從DataNode讀取對應的block的流
4.block的位置是有先後順序的,先讀block1,再讀block2。而且block1去host2上讀取;然後block2,去host7上讀取。

MapReduce:MapReduce模型主要運用于處理海量的資料資訊,其主要包含Mapper類和Reducer類兩個抽象類。Mapper類主要負責對資料的分析處理,最終轉化為key-value資料對;Reducer類主要擷取key-value資料對,然後處理統計,得到結果。
工作過程:首先向JobTracker請求一個新的作業ID;然後檢查輸出說明(如輸出目錄已存在)、輸出劃分(如輸入路徑不存在);JobTracker配置好所有需要的資源,然後把作業放入到一個内部的隊列中,并對其進行初始化,初始化包括建立一個代表該正在運作的作業對象(封裝任務和記錄資訊),以便跟蹤任務的狀态和程序;作業排程器擷取分片資訊,每個分片建立一個map任務。TaskTracker會執行一個簡單的循環定期發送heartbeat給JobTracker,心跳間隔可自由設定,通過心跳JobTracker可以監控TaskTracker是否存活,同時也能獲得TaskTracker處理的狀态和問題,同時也能計算出整個Job的狀态和進度。當JobTracker獲得了最後一個完成指定任務的TaskTracker操作成功的通知時候,JobTracker會把整個Job狀态置為成功,然後當用戶端查詢Job運作狀态時候(注意:這個是異步操作),用戶端會查到Job完成的通知的。
工作原理:輸入分片(input split)、map階段、combiner階段、shuffle階段、reduce階段
1.input split:在map計算之前,程式會根據輸入檔案計算split,每個input split針對一個map任務。input split存儲的并非是資料本身,而是一個分片長度和一個記錄資料的位置的數組。
2.map階段:即執行map函數。
3.combiner階段:這是一個可選擇的函數,實質上是一種reduce操作。combiner是map的後續操作,主要是在map計算出中間檔案前做一個簡單的合并重複key值的操作。
4.shuffle階段:指從map輸出開始,包括系統執行排序即傳送map輸出到reduce作為輸入的過程。另外針對map輸出的key進行排序又叫sort階段。map端shuffle,簡單來說就是利用combiner對資料進行預排序,利用記憶體緩沖區來完成。reduce端的shuffle包括複制資料和歸并資料,最終産生一個reduce輸入檔案。shuffle過程有許多可調優的參數來提高MapReduce的性能,其總原則就是給shuffle過程盡量多的記憶體空間。
5.reduce階段:即執行reduce函數并存到hdfs檔案系統中。
2.HDFS上運作MapReduce
1)準備文本檔案,放在本地/home/hadoop/wc
這裡準備的是《悲慘世界》第一章的英文文本,命名為hgg0603.txt
2)編寫map函數和reduce函數,在本地運作測試通過
3)啟動Hadoop:HDFS, JobTracker, TaskTracker
4)把文本檔案上傳到hdfs檔案系統上 user/hadoop/input
5)streaming的jar檔案的路徑寫入環境變量,讓環境變量生效
6)建立一個shell腳本檔案:streaming接口運作的腳本,名稱為run.sh
7)source run.sh來執行mapreduce
8)檢視運作結果