作業要求來自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3319
1.用自己的話闡明Hadoop平台上HDFS和MapReduce的功能、工作原理和工作過程。
- MapReduce的概念:
MapReduce是一個軟體架構,基于該架構能夠容易地編寫應用程式,這些應用程式能夠運作在由上千個商用機器組成的大叢集上,并以一種可靠的,具有容錯能力的方式并行地處理上TB級别的海量資料集。
- MapReduce的功能:
MapReduce的思想就是“分而治之”。Mapper負責“分”,即把複雜的任務分解為若幹個“簡單的任務”來處理。“簡單的任務”包含三層含義:一是資料或計算的規模相對原任務要大大縮小;二是就近計算原則,即任務會配置設定到存放着所需資料的節點上進行計算;三是這些小任務可以并行計算,彼此間幾乎沒有依賴關系。Reducer負責對map階段的結果進行彙總。
- MapReduce的工作原理:
(1)MapReduce角色
•Client:作業送出發起者。
•JobTracker:初始化作業,配置設定作業,并且是與TaskTracker通信,最後是協調整個作業。
•TaskTracker:保持JobTracker通信,在配置設定的資料片段上執行MapReduce任務。
(2)送出作業
•在作業送出之前,是需要對作業進行配置
•程式代碼,主要是自己書寫的MapReduce程式。
•輸入輸出路徑
•其他配置,比如輸出壓縮等這些
•當配置完成後,可以是通過JobCliNET來進行最後的一個送出
(3)作業的一個初始化
•當用戶端送出完成後,JobTracker它就會将作業加入到隊列裡面,然後是進行排程,它的預設的排程方法是FIFO調試方式。
(4)任務的配置設定
•需要知道TaskTracker和JobTracker它們之間的通信與任務的配置設定它是通過心跳機制完成的。
•有趣的是TaskTracker它是會主動向JobTracker詢問是否是有作業是需要完成的,若自己是可以做的,則就會申請到作業任務,這個任務可以使Map也可能是Reduce任務。
(5)任務的一個執行過程
•當申請到任務後,TaskTracker它就會做如下事情:
- 需要是拷貝代碼到本地
- 拷貝任務的資訊到本地
- 啟動JVM運作任務
(6)狀态與任務的更新
•任務在運作過程中,它是首先會将自己的狀态彙報給TaskTracker,然後由TaskTracker彙總告之JobTracker。
•需要知道的是任務的一個進度是通過計數器來實作的。
(7)最後是作業的完成
•JobTracker它是在接受到最後一個任務運作完成後,它才會将任務标志為成功。
•這個時候會做删除中間結果等善後處理工作。
總的來說,需要了解的是MapReduce是一種程式設計的模型,并且是用于大規模資料集(大于1TB)的并行運算。從基本的概念“Map(映射)”和“Reduce(化簡)”和他們的主要思想,這些都是從函數式程式設計語言裡借來的,還有從矢量程式設計語言裡借來的特性。可以友善程式設計人員在不會分布式并行程式設計的情況下,将自己的程式運作在分布式系統上。
- MapReduce的工作過程:
在MapReduce整個過程可以概括為以下過程:
輸入 --> map --> shuffle --> reduce -->輸出
輸入檔案會被切分成多個塊,每一塊都有一個map task
map階段的輸出結果會先寫到記憶體緩沖區,然後由緩沖區寫到磁盤上。預設的緩沖區大小是100M,溢出的百分比是0.8,也就是說當緩沖區中達到80M的時候就會往磁盤上寫。如果map計算完成後的中間結果沒有達到80M,最終也是要寫到磁盤上的,因為它最終還是要形成檔案。那麼,在往磁盤上寫的時候會進行分區和排序。一個map的輸出可能有多個這個的檔案,這些檔案最終會合并成一個,這就是這個map的輸出檔案。
流程說明如下:
1、輸入檔案分片,每一片都由一個MapTask來處理
2、Map輸出的中間結果會先放在記憶體緩沖區中,這個緩沖區的大小預設是100M,當緩沖區中的内容達到80%時(80M)會将緩沖區的内容寫到磁盤上。也就是說,一個map會輸出一個或者多個這樣的檔案,如果一個map輸出的全部内容沒有超過限制,那麼最終也會發生這個寫磁盤的操作,隻不過是寫幾次的問題。
3、從緩沖區寫到磁盤的時候,會進行分區并排序,分區指的是某個key應該進入到哪個分區,同一分區中的key會進行排序,如果定義了Combiner的話,也會進行combine操作
4、如果一個map産生的中間結果存放到多個檔案,那麼這些檔案最終會合并成一個檔案,這個合并過程不會改變分區數量,隻會減少檔案數量。例如,假設分了3個區,4個檔案,那麼最終會合并成1個檔案,3個區
5、以上隻是一個map的輸出,接下來進入reduce階段
6、每個reducer對應一個ReduceTask,在真正開始reduce之前,先要從分區中抓取資料
7、相同的分區的資料會進入同一個reduce。這一步中會從所有map輸出中抓取某一分區的資料,在抓取的過程中伴随着排序、合并。
8、reduce輸出
2.HDFS上運作MapReduce
1)準備文本檔案,放在本地/home/hadoop/wc
本次實驗準備的文本文檔為96-zyd.txt,内容如下圖所示。

2)編寫map函數和reduce函數,在本地運作測試通過
編輯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)檢視運作結果
每位同學準備不一樣的大一點英文文本檔案,每個步驟截圖交上部落格上。
上述步驟測試通過之後,可以嘗試對文本做處理之後再統計次數,如标點符号、停用詞等。
有能力的同學嘗試對之前爬蟲爬取的文本,在Hadoop上做中文詞頻統計。