MapReduce的工作原理,详细解释WordCount程序
本篇文章主要說兩部分:簡單介紹MapReduce的工作原理;詳細解釋WordCount程序。
在《Hadoop in action》一書中,對MapReduce計算模型有了很好的描述,在這里我們直接引用過來:“
在 Hadoop 中,用于執(zhí)行 MapReduce 任務的機器角色有兩個:一個是 JobTracker;另一個是 TaskTracker, JobTracker是用于調(diào)度工作的, TaskTracker是用于執(zhí)行工作的。一個 Hadoop集群中只有一臺 JobTracker。
在分布式計算中, MapReduce 框架負責處理了并行編程中分布式存儲、工作調(diào)度、負載均衡、容錯均衡、容錯處理以及網(wǎng)絡通信等復雜問題,把處理過程高度抽象為兩個函數(shù):map 和 reduce,map 負責把任務分解成多個任務, reduce 負責把分解后多任務處理的結(jié)果匯總起來。
在 Hadoop 中,每個 MapReduce 任務都被初始化為一個 Job,每個 Job 又可以分為兩種階段: map 階段和 reduce 階段。這兩個階段分別用兩個函數(shù)表示,即 map 函數(shù)和 reduce 函數(shù)。 map 函數(shù)接收一個<key,value>形式的輸入,然后同樣產(chǎn)生一個<key,value>形式的中間輸出, Hadoop 函數(shù)接收一個如<key,(list ofvalues)>形式的輸入,然后對這個 value 集合進行處理,每個 reduce 產(chǎn)生 0 或 1 個輸出,reduce 的輸出也是<key,value>形式的。”
從上面的解釋我們可以看出:MapReduce把對大規(guī)模數(shù)據(jù)集的操作,分發(fā)給一個主節(jié)點(master)管理下的各個分節(jié)點(slaves)共同完成,然后通過整合各個節(jié)點的中間結(jié)果,得到最終結(jié)果。用 MapReduce 來處理的數(shù)據(jù)集(或任務)必須具備這樣的特點:待處理的數(shù)據(jù)集可以分解成許多小的數(shù)據(jù)集,而且每一個小數(shù)據(jù)集都可以完全并行地進行處理。整個過程都是按照<key, value>的形式來輸入輸出。
下圖很好的描述了MapReduce的工作過程:
下面我們結(jié)合一個簡單的實例來說明MapReduce的內(nèi)部運行流程,首先給出一個WordCount的數(shù)據(jù)流程圖:
Step1:輸入文件file1和file2先按照TextInputFormat形式被處理成兩個InputSplit,然后輸入到兩個map中。此時map的輸入格式為<key, value>的,需要指出的是此時的key為當前的行號(位移量),value為對應行的內(nèi)容;
Step 2:Map對每行的內(nèi)容進行切詞,每切下一個詞就將其組織成<word, 1>的形式輸出,注意每個word的value均為1;
Step 3:把map的輸出進入Reduce階段,TaskTracker會接收到<word, {1,1,1,…}>形式的數(shù)據(jù),reduce會進行統(tǒng)計頻數(shù),組織成<word, sum>的形式直接輸出。
在以上過程初始的輸入文件和最終輸出結(jié)果都是放在HDFS上的,但是中間的map程序只是寫到本地磁盤中,而不是寫到HDFS中。這是因為Map的輸出在Jpb完成后即可刪除了,因此不需要存儲到HDFS上。雖然存儲到HDFS上會比較安全,但是因為網(wǎng)絡傳輸會降低MapReduce任務的執(zhí)行效率,因此Map的輸出文件時寫在本地磁盤的。如果Map程序在沒來得及將數(shù)據(jù)傳送給Reduce時就崩毀了,那么JobTracker只需要另選一臺機器重新執(zhí)行這個Task就可以了(JobTracker是要有這個功能的,JobTracker調(diào)度任務給TaskTracker,TaskTracker執(zhí)行任務的時候,會返還進行報告,JobTracker則會記錄進度的進行狀況,如果某個TaskTracker上的任務執(zhí)行失敗了,那么JobTracker會把這個任務分配給另一個TaskTracker,直到任務執(zhí)行完成)。
WordCount程序是學習Hadoop的入門程序,我們有必要詳解一下。能夠完整的運行WordCount程序需要如下結(jié)果步驟:本地的文本文件上傳到HDFS上,WordCount程序?qū)崿F(xiàn)MapReduce過程,輸出結(jié)果到HDFS上。
Step 1:進入CentOS系統(tǒng)(上篇博文已經(jīng)介紹過在centos6.0上搭建hadoop框架),在本地新建一個file文件夾。在file文件夾中,新建兩個文本文件file1和file2. file1的內(nèi)容為Hello World,file2的內(nèi)容為Hello Hadoop。
Step 2:在HDFS上創(chuàng)建輸入文件夾,并把本地的file中文件上傳到集群的input目錄上;
Step 3:在集群上運行WordCount程序,以input為輸入目錄,以output為輸出目錄;
以上過程可以再centos的終端完成:
mkdir ~/file 在本地創(chuàng)建file文件夾
cd file
echo “Hello World” > file1.txt 在file1和file2文件中存放文本,
echo “Hello Hadoop” > file2.txt echo命令的作用是輸出內(nèi)容,> file1/2就是輸出到文件中
hadoop fs -mkdir input 在HDFS上創(chuàng)建輸入目錄文件夾
hadoop fs -put ~file/file*.txt input 上傳本地file文件夾中的文件到HDFS上
運行WordCount程序
hadoop jar /usr/local/hadoop/hadoop-0.20.2/hadoop-0.20.2-examples.jar wordcount input output
“hadoop jar”——執(zhí)行jar命令;
“/usr/local/hadoop/hadoop-0.20.2/hadoop-0.20.2-examples.jar”——WordCount所在的jar包的地址
“wordcount” 程序主類名
“input output” 輸入、輸出文件夾
hadoop fs -cat output/part-r-00000 查看輸出文件中的內(nèi)容
細心的讀者會發(fā)現(xiàn),hadoop框架下操作命令都是以hadoop fs -*的形式。下面我們就列舉一下hadoop fs -*命令:
1,hadoop fs –fs [local | ]:聲明hadoop使用的文件系統(tǒng),如果不聲明的話,使用當前配置文件配置的,按如下順序查找:hadoop jar里的hadoop-default.xml->HADOOPCONFDIR下的hadoop?default.xml?>HADOOP_CONF_DIR下的hadoop-default.xml->HADOOPC?ONFD?IR下的hadoop?default.xml?>HADOOP_CONF_DIR下的hadoop-site.xml。使用local代表將本地文件系統(tǒng)作為hadoop的DFS。如果傳遞uri做參數(shù),那么就是特定的文件系統(tǒng)作為DFS。
2,hadoop fs –ls :等同于本地系統(tǒng)的ls,列出在指定目錄下的文件內(nèi)容,支持pattern匹配。輸出格式如filename(full path) size.其中n代表replica的個數(shù),size代表大小(單位bytes)。
3,hadoop fs –lsr :遞歸列出匹配pattern的文件信息,類似ls,只不過遞歸列出所有子目錄信息。
4,hadoop fs –du :列出匹配pattern的指定的文件系統(tǒng)空間總量(單位bytes),等價于unix下的針對目錄的du –sb /*和針對文件的du –b ,輸出格式如name(full path) size(in bytes)。
5,hadoop fs –dus :等價于-du,輸出格式也相同,只不過等價于unix的du -sb。
6,hadoop fs –mv :將制定格式的文件 move到指定的目標位置。當src為多個文件時,dst必須是個目錄。
7,hadoop fs –cp :拷貝文件到目標位置,當src為多個文件時,dst必須是個目錄。
8,hadoop fs –rm [-skipTrash] :刪除匹配pattern的指定文件,等價于unix下的rm 。
9,hadoop fs –rmr [skipTrash] :遞歸刪掉所有的文件和目錄,等價于unix下的rm –rf 。
10,hadoop fs –rmi [skipTrash] :等價于unix的rm –rfi 。
11,hadoop fs –put … :從本地系統(tǒng)拷貝文件到DFS。
12,hadoop fs –copyFromLocal … :等價于-put。
13,hadoop fs –moveFromLocal … :等同于-put,只不過源文件在拷貝后被刪除。
14,hadoop fs –get [-ignoreCrc] [-crc] :從DFS拷貝文件到本地文件系統(tǒng),文件匹配pattern,若是多個文件,則dst必須是目錄。
15,hadoop fs –getmerge :顧名思義,從DFS拷貝多個文件、合并排序為一個文件到本地文件系統(tǒng)。
16,hadoop fs –cat :展示文件內(nèi)容。
17,hadoop fs –copyToLocal [-ignoreCrc] [-crc] :等價于-get。
18,hadoop fs –mkdir :在指定位置創(chuàng)建目錄。
19,hadoop fs –setrep [-R] [-w] <path/file>:設置文件的備份級別,-R標志控制是否遞歸設置子目錄及文件。
20,hadoop fs –chmod [-R] <MODE[,MODE]…|OCTALMODE> PATH…:修改文件的權(quán)限,-R標記遞歸修改。MODE為a+r,g-w,+rwx等,OCTALMODE為755這樣。
21,hadoop fs -chown [-R] [OWNER][:[GROUP]] PATH…:修改文件的所有者和組。-R表示遞歸。
22,hadoop fs -chgrp [-R] GROUP PATH…:等價于-chown … :GROUP …。
23,hadoop fs –count[-q] :計數(shù)文件個數(shù)及所占空間的詳情,輸出表格的列的含義依次為:DIR_COUNT,FILE_COUNT,CONTENT_SIZE,FILE_NAME或者如果加了-q的話,還會列出QUOTA,REMAINING_QUOTA,SPACE_QUOTA,REMAINING_SPACE_QUOTA。
總結(jié)
以上是生活随笔為你收集整理的MapReduce的工作原理,详细解释WordCount程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 库克现身北京三里屯Apple零售店:微博
- 下一篇: 小米发布2022年财报 总收入达2800