精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從HDFS和MapReduce兩方面了解Hadoop

大數(shù)據(jù) Hadoop
本文主要從 HDFS 和 MapReduce 兩個(gè)大的方面講解了 Hadoop 的相關(guān)知識(shí),并且編寫了一個(gè)簡(jiǎn)單的 MapReduce 程序,最后還深入了解了一下 MapReduce 程序的運(yùn)行原理以及 Shuffle 相關(guān)的內(nèi)容。

簡(jiǎn)介

Hadoop 是一個(gè)能夠?qū)Υ罅繑?shù)據(jù)進(jìn)行分布式處理的軟件框架,框架最核心的設(shè)計(jì)就是:HDFS 和 MapReduce。HDFS 為海量的數(shù)據(jù)提供了存儲(chǔ),而 MapReduce 則為海量的數(shù)據(jù)提供了計(jì)算。這篇文章就主要從 HDFS 和 MapReuce 兩個(gè)大的方面展開(kāi)對(duì) Hadoop 講解,當(dāng)然為了直觀的測(cè)試 HDFS 提供的豐富的 API 以及我們編寫的 MapReduce 程序,在閱讀下面的內(nèi)容之前,你需要準(zhǔn)備一臺(tái)安裝了 Hadoop 的機(jī)器(也可以是虛擬機(jī)),如果你還沒(méi)有安裝的話,可以參考《在 Ubuntu 上安裝 Hadoop》。

初識(shí) Hadoop

HDFS

HDFS 概念

在說(shuō) HDFS 之前我們先來(lái)解釋一下什么是 DFS,DFS 的全稱是 Distributed File System,翻譯過(guò)來(lái)就是分布式文件系統(tǒng),而 HDFS 就是 Hadoop 自帶的分布式文件系統(tǒng)。

相關(guān)名詞

為了后面大家更容易理解文章,這里使用一定的篇幅來(lái)簡(jiǎn)單的介紹一下與 HDFS 相關(guān)的一些組件或者名詞的概念。

  1. NameNode,管理節(jié)點(diǎn),管理系統(tǒng)的命名空間,維護(hù)著整個(gè)文件系統(tǒng)的結(jié)構(gòu)和目錄信息,通常情況下一個(gè) Hadoop 集群只會(huì)有一個(gè)工作的 NameNode。
  2. DataNode,工作節(jié)點(diǎn),文件系統(tǒng)的工作節(jié)點(diǎn),主要是根據(jù)需要進(jìn)行存儲(chǔ)或者檢索數(shù)據(jù)塊,并且定期向 NameNode 報(bào)告它們所存儲(chǔ)的數(shù)據(jù)塊列表。
  3. 數(shù)據(jù)塊,同我們常使用的磁盤上的文件系統(tǒng)一樣,HDFS 也有數(shù)據(jù)塊的概念,默認(rèn)的大小為 128M。
  4. 塊緩存,一般情況下,我們通過(guò) HDFS 從 DataNode 中檢索數(shù)據(jù)時(shí),DataNode 都是從磁盤中讀取,但是對(duì)于訪問(wèn)很頻繁的文件,它所對(duì)于的數(shù)據(jù)塊可能會(huì)被緩存到 DataNode 的內(nèi)存中,以加快讀取速度,這就是所謂的塊緩存。
  5. 聯(lián)邦 HDFS,其實(shí)這個(gè)就是為了解決 Hadoop 不適合存儲(chǔ)數(shù)量龐大的文件的問(wèn)題,同時(shí)由多個(gè) NameNode 來(lái)維護(hù)整個(gè)文件系統(tǒng)的系統(tǒng)樹(shù)以及文件和目錄,每個(gè) NameNode 負(fù)責(zé)管理文件系統(tǒng)命名空間中的一部分。

特性

下面我們就一起來(lái)看下 HDFS 有哪些特性:

  1. 存儲(chǔ)超大文件,由于 HDFS 是分布式的文件系統(tǒng),所以不受單臺(tái)機(jī)器的存儲(chǔ)大小的限制,可以存儲(chǔ)超大文件,目前已經(jīng)達(dá)到了 PB 級(jí)了。
  2. 流式訪問(wèn)數(shù)據(jù)。
  3. HDFS 對(duì)硬件的要求并不是很高,可以運(yùn)行在廉價(jià)的商用硬件上。
  4. 不適合低延遲的數(shù)據(jù)訪問(wèn),由于 Hadoop 的流式數(shù)據(jù)訪問(wèn),訪問(wèn)數(shù)據(jù)會(huì)有寫延遲,所以不太適合低時(shí)間延遲的數(shù)據(jù)訪問(wèn),一般情況下這種需求我們會(huì)使用關(guān)系型數(shù)據(jù)庫(kù)來(lái)實(shí)現(xiàn)。
  5. 不適合大量的小文件存儲(chǔ),原因是 NameNode 將文件系統(tǒng)的元數(shù)據(jù)存儲(chǔ)在內(nèi)存中,每存儲(chǔ)一個(gè)文件都需要在 NameNode 中存儲(chǔ)該文件的目錄、存儲(chǔ)在哪個(gè) DataNode 中等等的數(shù)據(jù)。所以如果文件的數(shù)量達(dá)到數(shù)十億的話 NameNode 的內(nèi)存很可能不夠用了。
  6. 不支持多用戶寫入,以及任意的修改文件,只可以在文件末尾添加內(nèi)容。

HDFS 的命令行操作

命令行接口是 HDFS 所有類型的接口中最簡(jiǎn)單的,也是每個(gè)開(kāi)發(fā)者都必須要掌握的。下面我們就列舉幾個(gè)簡(jiǎn)單的命令行操作,但是在操作前你必須按照***章的內(nèi)容安裝好了 Hadoop,并且啟動(dòng)了 HDFS。

創(chuàng)建目錄。

  • 清單 1. 創(chuàng)建目錄命令
  1. hadoop fs -mkdir /test 

查看目錄。

  • 清單 2. 創(chuàng)建目錄命令
  1. hadoop fs -ls / 

上傳文件,緊跟-put 后面的 test.txt 是要推送到 HDFS 中的文件,/test 是指定要推送到 HDFS 上哪個(gè)目錄下面。

  • 清單 3. 上傳文件
  1. hadoop fs -put test.txt /test 

刪除文件。

  • 清單 4. 上傳文件
  1. hadoop fs -rm /test/test.txt 

其實(shí)通過(guò)上面例舉的幾個(gè)命令我們可以看出 HDFS 的文件操作命令幾乎和 Linux 上的命令一致,這樣我們使用起來(lái)會(huì)很容易上手。

HDFS 的 JavaAPI

在 Java 項(xiàng)目中使用 HDFS 提供的 API 我們需要依賴 hadoop-common 和 hadoop-hdfs 兩個(gè)包,為了方便測(cè)試,我們這里還引入了 junit,篇幅原因這里就不對(duì)項(xiàng)目本身做太多的講解,這里附上項(xiàng)目源碼地址供大家參考。

讀取 HDFS 中文件的內(nèi)容。

  • 清單 5. JavaApi 讀取文件內(nèi)容 
  1.         @Test 
  2. public void read() throws IOException { 
  3.   // 文件地址。 
  4.   URI uri = URI.create("/test/test.txt"); 
  5.   // 用于接收讀取的數(shù)據(jù)流。 
  6.   FSDataInputStream in = null
  7.   try { 
  8.       in = fs.open(new Path(uri)); 
  9.       // ***的一個(gè) boolean 類型的參數(shù)是指是否在調(diào)用結(jié)束后關(guān)閉流,我們這里選擇在 finally 里面手動(dòng)關(guān)閉。 
  10.       IOUtils.copyBytes(in, System.out, 4096, false); 
  11.   } finally { 
  12.       IOUtils.closeStream(in); 
  13.   } 

不出意外的話,你可以在控制臺(tái)看到你指定文件的內(nèi)容。在這一步我遇到一個(gè)問(wèn)題,就是無(wú)法直接在 windows 下操作 HDFS,具體的解決方法可以參照這篇文章。FSDataInputStream.seek()方法還可以實(shí)現(xiàn)從文件輸入流的任意一個(gè)絕對(duì)位置讀取文件內(nèi)容,比如我們可以在上面代碼中添加如下的內(nèi)容來(lái)實(shí)現(xiàn)在控制臺(tái)重復(fù)打印文件內(nèi)容。

  • 清單 6. JavaApi 任意位置讀取文件內(nèi)容 
  1. in.seek(0); 
  2. tils.copyBytes(in, System.out, 4096, false); 

創(chuàng)建目錄

  • 清單 7. JavaApi 創(chuàng)建目錄 
  1. @Test 
  2. public void mkdir() throws IOException { 
  3. fs.mkdirs(new Path("/test/api")); 

查詢文件目錄。

  • 清單 8. JavaApi 查詢文件目錄 
  1. @Test 
  2. public void ls() throws IOException { 
  3. FileStatus[] fileStatuses = fs.listStatus(new Path("/")); 
  4. if (null == fileStatuses || fileStatuses.length == 0) { 
  5. return
  6. for (FileStatus fileStatus : fileStatuses) { 
  7. System.out.println(fileStatus.getPath() + "   " + fileStatus.getPermission()); 

這里引入一個(gè)類 FileStatus,這個(gè)類封裝了 HDFS 中文件和目錄的元數(shù)據(jù),包括文件長(zhǎng)度、塊大小、復(fù)本、修改時(shí)間、所有者以及權(quán)限信息。FileSystem 里面提供的 listStatus 方法可以獲取一個(gè)目錄下的所有目錄或者文件的 FileStatus,但是它不會(huì)遞歸獲取下級(jí)目錄的內(nèi)容,這里可以開(kāi)發(fā)你的想象自己實(shí)現(xiàn)一下(Tips:fileStatus.isDirectory()可以判斷這個(gè) fileStatus 是否是一個(gè)文件夾)。

刪除文件或目錄。

  • 清單 9. JavaApi 刪除文件或目錄 
  1. @Test 
  2. public void delete() throws IOException { 
  3.   fs.delete(new Path("/test/api"), false); 
  4. @Test 
  5. public void deleteNonEmptyDir() throws IOException { 
  6.   fs.delete(new Path("/test"), true); 

我們可以看到 fs.delete()這個(gè)方法有兩個(gè)參數(shù),***個(gè)參數(shù)很好理解,就是我們要?jiǎng)h除的目錄或者文件的地址。那么第二個(gè) Boolean 類型的參數(shù)呢,如果刪除的是文件或者空目錄這個(gè)參數(shù)實(shí)際上是會(huì)被忽略的,如果刪除的是非空目錄,只有在這個(gè)參數(shù)值為 true 的時(shí)候才會(huì)成功刪除。

創(chuàng)建文件和文件寫入。

我們通過(guò) FileSystem.create()方法來(lái)創(chuàng)建一個(gè)文件,這個(gè)方法會(huì)順帶著創(chuàng)建不存在的父級(jí)目錄,如果不需要這個(gè)的話,***是在創(chuàng)建之前調(diào)用 exists()方法來(lái)判斷一下,如果父級(jí)目錄不存在直接報(bào)錯(cuò)即可。

  • 清單 10. JavaApi 創(chuàng)建文件和文件寫入 
  1. @Test 
  2. public void create() throws IOException { 
  3. FSDataOutputStream out = null
  4. try { 
  5. out = fs.create(new Path("/test/api/test.txt")); 
  6. out.writeChars("hello hdfs."); 
  7. } finally { 
  8. IOUtils.closeStream(out); 

文件創(chuàng)建好后,可以通過(guò) append()方法在文件末尾添加內(nèi)容。

  • 清單 11. JavaApi 追加文件內(nèi)容 
  1. @Test 
  2. public void append() throws IOException { 
  3. FSDataOutputStream out = null
  4. try { 
  5. out = fs.append(new Path("/test/api/test.txt")); 
  6. out.writeChars("hello hdfs."); 
  7. } finally { 
  8. out.close(); 

從本地上傳文件到 HDFS。

  • 清單 12. JavaApi 上傳文件至 HDFS 
  1. @Test 
  2. public void copyFromLocal() throws IOException { 
  3. fs.copyFromLocalFile(new Path("d:/local.txt"), new Path("/test/api")); 

從 HDFS 上下載文件

  • 清單 13. JavaApi 從 HDFS 下載文件 
  1. @Test 
  2. public void copyToLocal() throws IOException { 
  3.   fs.copyToLocalFile(new Path("/test/api/local.txt"), new Path("E:/")); 

MapReduce 實(shí)戰(zhàn)

什么是 MapReduce

MapReduce 是一種編程模型,"Map(映射)"和"Reduce(歸約)",是它們的主要思想,我們通過(guò) Map 函數(shù)來(lái)分布式處理輸入數(shù)據(jù),然后通過(guò) Reduce 匯總結(jié)果并輸出。我們編寫一個(gè) MapReduce 程序的一般步驟是:

  1. 編寫 map 程序。
  2. 編寫 reduce 程序。
  3. 編寫程序驅(qū)動(dòng)。

本章節(jié)的目標(biāo)

本節(jié)中我們將使用 MapReduce 框架來(lái)編寫一個(gè)簡(jiǎn)單的例子,這個(gè)例子是用來(lái)統(tǒng)計(jì) HDFS 指定目錄下的文件中每個(gè)字符出現(xiàn)的次數(shù)并將統(tǒng)計(jì)結(jié)果輸出到 HDFS 的指定目錄中。點(diǎn)擊此處獲取本章節(jié)源代碼。

Map 程序

我們繼承 Mapper 類并重寫了其 map 方法。Map 階段輸入的數(shù)據(jù)是從 hdfs 中拿到的原數(shù)據(jù),輸入的 key 為某一行起始位置相對(duì)于文件起始位置的偏移量,value 為該行的文本。​​輸出的內(nèi)容同樣也為鍵-值對(duì),這個(gè)時(shí)候輸出數(shù)據(jù)的鍵值對(duì)的類型可以自己指定,在本例中 key 是 Text 類型的,value 是 LongWritable 類型的。輸出的結(jié)果將會(huì)被發(fā)送到 reduce 函數(shù)進(jìn)一步處理。

  • 清單 14. Map 程序 
  1. public class CharCountMapper extends Mapper< LongWritable, Text, Text, LongWritable> { 
  2.   @Override 
  3.   protected void map(LongWritable key, Text value, Context context) 
  4.   throws IOException, InterruptedException { 
  5.   // 將這一行文本轉(zhuǎn)為字符數(shù)組 
  6.   char[] chars = value.toString().toCharArray(); 
  7.   for (char c : chars) { 
  8.   // 某個(gè)字符出現(xiàn)一次,便輸出其出現(xiàn) 1 次。 
  9.   context.write(new Text(c + ""), new LongWritable(1)); 
  10.   } 
  11.   } 
  12.   } 

Reduce 程序

我們繼承 Reducer 類并重寫了其 reduce 方法。在本例中 Reduce 階段的輸入是 Map 階段的輸出,輸出的結(jié)果可以作為最終的輸出結(jié)果。相信你也注意到了,reduce 方法的第二個(gè)參數(shù)是一個(gè) Iterable,MapReduce 會(huì)將 map 階段中相同字符的輸出匯總到一起作為 reduce 的輸入。

  • 清單 15. Reduce 程序 
  1. public class CharCountReducer extends Reducer< Text, LongWritable, Text, LongWritable> { 
  2.     @Override 
  3.     protected void reduce(Text key, Iterable< LongWritable> values, Context context) 
  4.             throws IOException, InterruptedException { 
  5.         long count = 0; 
  6.         for (LongWritable value : values) { 
  7.             count += value.get(); 
  8.         } 
  9.         context.write(key, new LongWritable(count)); 
  10.     } 

驅(qū)動(dòng)程序

到目前為止,我們已經(jīng)有了 map 程序和 reduce 程序,我們還需要一個(gè)驅(qū)動(dòng)程序來(lái)運(yùn)行整個(gè)作業(yè)。可以看到我們?cè)谶@里初始化了一個(gè) Job 對(duì)象。Job 對(duì)象指定整個(gè) MapReduce 作業(yè)的執(zhí)行規(guī)范。我們用它來(lái)控制整個(gè)作業(yè)的運(yùn)作,在這里我們指定了 jar 包位置還有我們的 Map 程序、Reduce 程序、Map 程序的輸出類型、整個(gè)作業(yè)的輸出類型還有輸入輸出文件的地址。

  • 清單 16. 驅(qū)動(dòng)程序 
  1. public class CharCountDriver { 
  2.           public static void main(String[] args) throws Exception { 
  3.           Configuration configuration = new Configuration(); 
  4.           Job job = Job.getInstance(configuration); 
  5.           // Hadoop 會(huì)自動(dòng)根據(jù)驅(qū)動(dòng)程序的類路徑來(lái)掃描該作業(yè)的 Jar 包。 
  6.           job.setJarByClass(cn.itweknow.mr.CharCountDriver.class); 
  7.           // 指定 mapper 
  8.           job.setMapperClass(CharCountMapper.class); 
  9.           // 指定 reducer 
  10.           job.setReducerClass(CharCountReducer.class); 
  11.           // map 程序的輸出鍵-值對(duì)類型 
  12.           job.setMapOutputKeyClass(Text.class); 
  13.           job.setMapOutputValueClass(LongWritable.class); 
  14.           // 輸出鍵-值對(duì)類型 
  15.           job.setOutputKeyClass(Text.class); 
  16.           job.setOutputValueClass(LongWritable.class); 
  17.           // 輸入文件的路徑 
  18.           FileInputFormat.setInputPaths(job, new Path(args[0])); 
  19.           // 輸入文件路徑 
  20.           FileOutputFormat.setOutputPath(job, new Path(args[1])); 
  21.           boolean res = job.waitForCompletion(true); 
  22.           System.exit(res?0:1); 
  23.           } 
  24.           } 

執(zhí)行 MapReduce 作業(yè)

打包作業(yè),我們需要將我們的 MapReduce 程序打成 jar 包。

  • 清單 17. 打包作業(yè)
  1. mvn package -Dmaven.test.skip=true 

將 jar 包復(fù)制到 hadoop 機(jī)器上。

在 HDFS 上準(zhǔn)備好要統(tǒng)計(jì)的文件,我準(zhǔn)備的文件在 HDFS 上的/mr/input/目錄下,內(nèi)容為"hello hadoop hdfs.I am coming."。

執(zhí)行 jar。

  • 清單 18. 執(zhí)行作業(yè)
  1. hadoop jar mr-test-1.0-SNAPSHOT.jar cn.itweknow.mr.CharCountDriver /mr/input/ /mr/output/out.txt 

查看結(jié)果。

我們先看看輸出目錄,結(jié)果如下,最終輸出的結(jié)果就存放在/mr/output/part-r-00000 文件中。

圖 1. MapReduce 作業(yè)輸出目錄

從HDFS和MapReduce兩方面了解Hadoop

然后我們?cè)倏纯摧敵鑫募械木唧w內(nèi)容,如下所示:

圖 2. MapReduce 作業(yè)輸出結(jié)果

從HDFS和MapReduce兩方面了解Hadoop

MapReduce 運(yùn)行原理

我們可以將一個(gè) MapReduce 作業(yè)的運(yùn)行過(guò)程簡(jiǎn)單的拆分成 6 個(gè)過(guò)程,分別是作業(yè)的提交、作業(yè)初始化、任務(wù)分配、任務(wù)執(zhí)行、進(jìn)度和狀態(tài)的更新、作業(yè)完成。下面我就一起來(lái)具體了解下這么幾個(gè)步驟。

作業(yè)的提交

當(dāng)我們調(diào)用 job.submit()或者 job.waitForCompletion()方法(其內(nèi)部也會(huì)調(diào)用 submit()方法)的時(shí)候,會(huì)創(chuàng)建一個(gè) JobSubmitter 對(duì)象,在 JobSubmitter 內(nèi)部所實(shí)現(xiàn)的作業(yè)提交過(guò)程如下:

  1. 向資源管理器請(qǐng)求新的應(yīng)用 ID 作為 MapReduce 作業(yè)的作業(yè) ID。
  2. 檢查作業(yè)的輸出目錄,如果沒(méi)有指定輸出目錄或者輸出目錄已經(jīng)存在就會(huì)拋出錯(cuò)誤,這也就是為啥我們?cè)趫?zhí)行 MapReduce 作業(yè)時(shí)為啥需要保證指定的輸出目錄不存在。
  3. 將作業(yè)運(yùn)行所需要的資源文件(作業(yè) JAR 包,配置文件,輸入分片)復(fù)制到一起(一個(gè)以作業(yè) ID 命名的目錄下)。
  4. 調(diào)用 submitApplication()方法提交作業(yè)。​

作業(yè)的初始化

  1. 首先資源管理器會(huì)將作業(yè)請(qǐng)求傳遞給 YARN 調(diào)度器。
  2. 調(diào)度器會(huì)為作業(yè)分配一個(gè)容器。
  3. 資源管理器在節(jié)點(diǎn)管理器的管理下在容器中啟動(dòng) application master。
  4. application master 的主類 MRAppMaster 會(huì)創(chuàng)建多個(gè)簿記對(duì)象來(lái)跟蹤作業(yè)的進(jìn)度。
  5. 接收輸入分片。
  6. application master 為每個(gè)分片創(chuàng)建 map 任務(wù)以及確定 reduce 任務(wù),并且分配任務(wù) ID。

任務(wù)的分配

application master 會(huì)為創(chuàng)建的任務(wù)向資源管理器請(qǐng)求容器,先是為 map 任務(wù)請(qǐng)求資源,后為 reduce 任務(wù)請(qǐng)求資源。為 map 任務(wù)分配資源的時(shí)候需要考慮到數(shù)據(jù)本地化的局限,會(huì)盡量保證運(yùn)行的 map 任務(wù)所需要的數(shù)據(jù)塊存儲(chǔ)在當(dāng)前機(jī)器或者當(dāng)前機(jī)架中,這樣會(huì)極大的節(jié)省帶寬資源。而 reduce 任務(wù)則不存在這個(gè)限制。

任務(wù)的執(zhí)行

  1. 資源管理器為任務(wù)分配好容器后,application master 就通過(guò)與節(jié)點(diǎn)管理器通信啟動(dòng)容器。
  2. 在運(yùn)行任務(wù)之前,會(huì)將任務(wù)所需要的資源本地化。
  3. 運(yùn)行任務(wù)。

進(jìn)度和狀態(tài)的更新

任務(wù)在運(yùn)行的過(guò)程中,會(huì)對(duì)其精度保持追蹤,對(duì)與 map 任務(wù),其任務(wù)進(jìn)度就是已經(jīng)處理的輸入所占總輸入的比例。對(duì)與 reduce 任務(wù)來(lái)講就比較復(fù)雜了,因?yàn)檫@個(gè)部分包含資源復(fù)制階段、排序階段和 reduce 階段三個(gè)階段,每個(gè)階段都占整個(gè)完成比例的 1/3,也就是說(shuō)當(dāng)我們完成 reduce 的一半的時(shí)候進(jìn)度應(yīng)該為 5/6。對(duì)與狀態(tài)的更新,客戶端會(huì)每秒輪詢一次 application master 以接收***的任務(wù)狀態(tài)。

作業(yè)的完成

當(dāng) application master 收到作業(yè)***一個(gè)任務(wù)已經(jīng)完成的通知后,便把作業(yè)的狀態(tài)設(shè)置為"成功"。

為了方便大家理解,我這里將整個(gè)過(guò)程總結(jié)為一張圖,貼在這里僅供大家參考。

圖 3. MapReduce 程序運(yùn)行圖解

從HDFS和MapReduce兩方面了解Hadoop
點(diǎn)擊查看大圖

Shuffle

簡(jiǎn)介,什么是 Shuffle

MapReduce 程序會(huì)確保每個(gè) reduce 函數(shù)的輸入都是按鍵排序的。系統(tǒng)執(zhí)行排序以及將 map 函數(shù)的輸出傳給 reduce 函數(shù)的過(guò)程稱之為 shuffle。整個(gè) Shuffle 分為 Map 端和 Reduce 端,下圖是 MapReduce 的 Shuffle 的一個(gè)整體概覽圖,大家先看一下整個(gè)圖,我們后面再做進(jìn)一步的解釋說(shuō)明。

圖 4. Shuffle 概覽圖

從HDFS和MapReduce兩方面了解Hadoop
點(diǎn)擊查看大圖

Map 端 Shuffle

其實(shí) Map 函數(shù)產(chǎn)生的輸出會(huì)寫到磁盤上而不是 HDFS。但是它也不是簡(jiǎn)簡(jiǎn)單單的直接寫到磁盤,這中間有一個(gè)復(fù)雜的過(guò)程,下面我們就來(lái)拆解一下。

從上面的圖可以看到每個(gè) Map 任務(wù)都會(huì)有一個(gè)緩沖區(qū),這個(gè)緩沖區(qū)會(huì)臨時(shí)存儲(chǔ) map 函數(shù)輸出的內(nèi)容,緩沖區(qū)的個(gè)大小默認(rèn)是 100M,我們可以通過(guò) mapreduce.task.io.sort.mb 這個(gè)配置項(xiàng)配置,當(dāng)緩沖區(qū)中的內(nèi)容達(dá)到其設(shè)定的閾值(閾值的設(shè)置值是占整個(gè)緩沖區(qū)的大小,默認(rèn)為 0.8,我們可以通過(guò) mapreduce.map.sort.spill.percent 來(lái)配置)時(shí)就會(huì)產(chǎn)生溢出,這個(gè)時(shí)候會(huì)有一個(gè)后臺(tái)線程將緩沖區(qū)中的內(nèi)容分區(qū)(根據(jù)最終要傳給的 Reduce 任務(wù)分成不同的區(qū),分區(qū)的目的是將輸出劃分到不同的 Reducer 上去,后面的 Reducer 就會(huì)根據(jù)分區(qū)來(lái)讀取自己對(duì)應(yīng)的數(shù)據(jù))

然后區(qū)內(nèi)按照 key 排序,如果我們?cè)O(shè)置了 Combiner(Combiner 的本質(zhì)也是一個(gè) Reducer,其目的是對(duì)將要寫入到磁盤上的文件先進(jìn)行一次處理,這樣,寫入到磁盤的數(shù)據(jù)量就會(huì)減少。)

的話,這個(gè)時(shí)候會(huì)運(yùn)行 Combiner 函數(shù),***再寫入磁盤。而在這個(gè)過(guò)程中 Map 任務(wù)還會(huì)繼續(xù)往緩沖區(qū)中輸出內(nèi)容,如果出現(xiàn)緩沖區(qū)空間被占滿的情況,Map 任務(wù)就會(huì)阻塞直到緩沖區(qū)中的內(nèi)容被全部寫到磁盤中為止。

每次緩沖區(qū)溢出時(shí)都會(huì)新建一個(gè)新的溢出文件,這樣***其實(shí)是會(huì)出現(xiàn)多個(gè)溢出文件的,在 Map 任務(wù)結(jié)束前這些溢出文件會(huì)被合并到一個(gè)整的輸出文件。

Reduce 端 Shuffle

Reduce 端的 Shuffle 分為三個(gè)階段,復(fù)制階段、合并階段和 Reduce。

首先是復(fù)制階段,Reduce 任務(wù)需要集群上若干個(gè) map 輸出作為其輸入內(nèi)容,在每個(gè) Map 任務(wù)完成的時(shí)候 Reduce 任務(wù)就開(kāi)復(fù)制其輸出,上面也提到過(guò) Map 任務(wù)在寫入磁盤前會(huì)將輸出進(jìn)行根據(jù) Reduce 任務(wù)進(jìn)行分區(qū),所以這里 Reduce 任務(wù)在復(fù)制的時(shí)候只會(huì)復(fù)制自己的那個(gè)分區(qū)里的內(nèi)容。如果 Map 的輸出非常小,那么 Reduce 會(huì)直接將其復(fù)制到內(nèi)存中,否則會(huì)被復(fù)制到磁盤。

合并階段,因?yàn)橛泻芏嗟?Map 任務(wù),所以 Reduce 復(fù)制過(guò)來(lái)的 map 輸出會(huì)有很多個(gè),在這個(gè)階段主要就是將這些 Map 輸出合并成為一個(gè)文件。

Reduce 階段,這個(gè)階段主要就是執(zhí)行我們的 Reduce 函數(shù)的代碼了,并產(chǎn)生最終的結(jié)果,然后寫入到 HDFS 中。

在文章的***,提供我在撰寫本文的過(guò)程中所編寫的一些源代碼,供大家參考。也希望大家能夠從本文中收獲一些幫助。

結(jié)束語(yǔ)

本文主要從 HDFS 和 MapReduce 兩個(gè)大的方面講解了 Hadoop 的相關(guān)知識(shí),并且編寫了一個(gè)簡(jiǎn)單的 MapReduce 程序,***還深入了解了一下 MapReduce 程序的運(yùn)行原理以及 Shuffle 相關(guān)的內(nèi)容。

責(zé)任編輯:未麗燕 來(lái)源: IBM developerWorks中國(guó)
相關(guān)推薦

2010-04-26 15:37:18

DNS負(fù)載均衡

2009-11-05 15:18:19

WCF擴(kuò)展

2009-11-06 09:57:32

2010-04-20 14:55:41

負(fù)載均衡

2009-10-27 13:45:32

VB.NET C#區(qū)別

2009-10-09 17:30:11

服務(wù)器測(cè)試方法

2021-01-04 11:13:01

人臉識(shí)別

2021-11-18 23:33:17

API 抽象桌面

2009-10-10 13:46:44

服務(wù)器測(cè)試方法

2022-02-22 09:49:57

B 端設(shè)計(jì)趨勢(shì)視覺(jué)風(fēng)格

2014-01-22 09:28:19

IDC

2013-05-27 14:37:31

Hadoop 2.0.

2013-09-18 16:24:26

2011-11-21 10:37:51

虛擬化微軟虛擬化Hyper-V

2020-03-26 14:51:16

工信部移動(dòng)互聯(lián)網(wǎng)手機(jī)

2010-06-07 13:35:16

Hadoop簡(jiǎn)介

2018-04-15 15:47:18

2010-03-17 15:45:13

無(wú)線設(shè)備兼容性

2017-03-19 20:41:57

WebAssemblyJavaScript編程

2011-04-22 09:46:59

ASP.NET
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

真实原创一区二区影院| www视频在线看| 日韩中文字幕91| 日韩亚洲精品电影| 国产chinesehd精品露脸| 涩涩视频网站在线观看| 国产精品色眯眯| 国产欧美丝袜| 亚洲特级黄色片| 在线视频精品| 日韩小视频在线| 亚洲天堂网一区二区| 亚洲国产天堂| 色妞www精品视频| 白白操在线视频| 岛国视频免费在线观看| 国产成人精品aa毛片| 国产成人精品久久久| 精品在线免费观看视频| 成人在线电影在线观看视频| 亚洲精品v欧美精品v日韩精品 | 亚洲天堂黄色| 国产一区二区三区视频免费| 四虎国产精品永久免费观看视频| 偷拍中文亚洲欧美动漫| 亚洲高清免费视频| 中文字幕日韩精品久久| 国产三级在线| 99久久99久久精品免费观看| 91系列在线播放| 久久国产香蕉视频| 在线视频亚洲| 国语自产精品视频在免费| 北条麻妃在线观看视频| 精品国产一区二区三区小蝌蚪 | 综合在线视频| 一本大道久久加勒比香蕉| 亚洲最大的黄色网| 视频一区日韩精品| 日韩午夜在线观看| 中文字幕22页| 99久久99九九99九九九| 欧美午夜精品一区| 麻豆传传媒久久久爱| sis001欧美| 欧美日韩一区二区在线| 久久综合色视频| 里番在线播放| 亚洲一区二区三区爽爽爽爽爽| 自拍偷拍一区二区三区| 香蕉视频国产在线观看| 中文无字幕一区二区三区| 日韩中文字幕av在线| 国产中文字幕在线看| 2021中文字幕一区亚洲| 欧美连裤袜在线视频| 视频一区二区三区国产| 久久人人爽人人爽| 欧美视频1区| 国际av在线| 中文字幕免费观看一区| 亚洲韩国在线| 国产在线看片| 一区二区三区精品| 日韩 欧美 视频| segui88久久综合| 激情av一区二区| 丰满爆乳一区二区三区| 少妇淫片在线影院| 色域天天综合网| 亚洲免费一级视频| 亚洲精品tv| 精品久久久影院| 人妻丰满熟妇aⅴ无码| 免费不卡中文字幕在线| 主播福利视频一区| 天堂а√在线中文在线鲁大师| 亚洲电影影音先锋| 国内精品在线一区| 日本久久综合网| 久久国产剧场电影| aa成人免费视频| 六月婷婷综合网| 国产亚洲一本大道中文在线| 一级日韩一区在线观看| 午夜av在线播放| 日韩欧美在线视频观看| 亚洲涩涩在线观看| 久久夜色精品国产噜噜av小说| 日韩精品在线看| 欧美成人久久久免费播放| 欧美二区视频| 日韩av男人的天堂| 国产一区二区三区成人| 不卡在线视频中文字幕| 深田咏美在线x99av| 91精品久久| 色天天综合久久久久综合片| 原创真实夫妻啪啪av| 亚洲永久精品唐人导航网址| 久久伊人色综合| 国产www在线| 国产一区二区电影| 欧美男人的天堂| 在线三级中文| 欧美午夜电影网| 亚洲精品国产成人av在线| 成人一区而且| 国产91av在线| 97免费视频观看| 欧美h片在线观看| 在线日韩av| 91亚洲va在线va天堂va国 | 日本一区二区免费高清视频| av剧情在线观看| 91超碰这里只有精品国产| 欧美无人区码suv| 国内精品久久久久国产盗摄免费观看完整版| 91av视频在线| 亚洲国产综合网| 成人免费一区二区三区在线观看 | 美女18一级毛片一品久道久久综合| 欧美一区二区三区视频免费播放| 精品无码国产污污污免费网站| 欧美日韩精品一本二本三本| 国产欧美一区二区三区久久人妖 | 久久草在线视频| 久热精品视频在线观看一区| 欧美brazzers| 91麻豆国产精品久久| 超级碰在线观看| 精品久久国产一区| 日韩视频―中文字幕| 草莓视频18免费观看| av日韩在线网站| 久无码久无码av无码| 久久天堂久久| 久久综合九色九九| 国产精品一区二区av白丝下载| 国产女人18水真多18精品一级做| 日韩欧美自拍偷拍| 亚洲黄色小视频在线观看| 五月天亚洲色图| 欧美性资源免费| 亚洲 欧美 激情 另类| 午夜亚洲福利老司机| 日本精品一二三区| 亚洲五月婷婷| 国产原创精品| 国产中文在线播放| 亚洲精品久久久久国产| 在线观看国产亚洲| 99re免费视频精品全部| 六月丁香婷婷激情| 久久爱www成人| 国产精品久久久一区| jizz在线观看中文| 欧美剧在线免费观看网站| 91狠狠综合久久久| 狠狠色丁香久久婷婷综| 99精品视频网站| 成人香蕉社区| 777777777亚洲妇女| 免费播放片a高清在线观看| 色激情天天射综合网| 欧美日韩生活片| 国产酒店精品激情| www.日本少妇| 亚洲婷婷伊人| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 国产精品美女一区二区三区| 日本黄色的视频| 黄页网站一区| 欧美在线播放一区| 亚洲国产91视频| 精品无人区卡一卡二卡三乱码免费卡| 国产精品igao视频| 在线观看精品一区二区三区| 5月丁香婷婷综合| 日本熟妇一区二区| 国产女人18水真多18精品一级做| 五月花丁香婷婷| 极品尤物久久久av免费看| 久久久久高清| 色综合一区二区日本韩国亚洲 | 成年免费在线观看| 国产日韩精品视频一区| 青娱乐国产精品视频| 亚洲欧美bt| 大片在线观看网站免费收看| 欧美三级午夜理伦三级小说| 国产日本欧美在线观看| 久草在线资源福利站| 国产一区二区三区日韩欧美| 性欧美videos另类hd| 欧美性受xxxx| 日韩手机在线观看| 中文字幕亚洲一区二区av在线| 男人网站在线观看| 精品一区二区三区在线播放视频 | 免费视频网站www| 国产色婷婷亚洲99精品小说| 波多野结衣三级视频| 美女爽到高潮91| 18禁免费观看网站| 91精品综合| 日本欧洲国产一区二区| 日韩精品一区二区三区中文 | 亚洲日本视频在线| 国产精品久久久久91| 在线看片福利| 欧美激情区在线播放| 日本视频不卡| 亚洲天堂av综合网| 天堂中文在线观看视频| 欧美一区二区免费视频| 中文字幕精品无码亚| 欧美性猛交xxx| 日韩精品一区二区av| 亚洲欧美另类小说| 亚洲精品天堂网| 国产欧美一区二区三区沐欲| 精品一区二区视频在线观看| 国产成人免费视频网站| 91福利免费观看| 蜜臀久久99精品久久久画质超高清| 日本www在线播放| 一区二区自拍| 欧美人与动牲交xxxxbbbb| 国产精品久久久久一区二区三区厕所| 日韩av电影免费在线| 亚洲免费毛片| 欧美激情第六页| 西野翔中文久久精品国产| 国产精品久久久久久免费观看| 蜜桃精品一区二区三区| 91精品视频在线播放| 96sao精品免费视频观看| 国产精品视频在线观看| 亚洲电影有码| 国产精品日韩久久久久| 高清av一区二区三区| 国产精品三级久久久久久电影| 欧美精品高清| 国产国产精品人在线视| 国产精品扒开腿做爽爽爽视频软件| 日本成人免费在线| 韩国久久久久久| 国产精品久久精品| 亚洲欧美在线综合| 亚洲精品日韩av| 欧美高清一级片| 国产激情一区二区三区在线观看 | 国产亚洲精品成人av久久ww| 可以在线观看的av网站| 国产午夜精品一区理论片飘花| 成人18在线| 麻豆一区二区在线观看| 日本成人不卡| 88国产精品欧美一区二区三区| 欧美momandson| 国产精品白嫩初高中害羞小美女| av成人亚洲| 91在线观看免费| 国产主播性色av福利精品一区| 久久精品人成| 成人三级视频| 蜜臀在线免费观看| 在线精品一区| 美女网站免费观看视频| 久久电影网电视剧免费观看| 性一交一黄一片| 91麻豆精品在线观看| 91麻豆精品久久毛片一级| 一区二区三区在线视频观看| 天天操天天干视频| 欧美视频一区在线| 亚洲精品.www| 亚洲欧美一区二区三区在线| 国产1区2区3区在线| 欧美精品做受xxx性少妇| 色戒汤唯在线观看| 91久久久久久久久| 日本欧美韩国国产| 亚洲一区二区三区涩| 最新日韩在线| 亚洲性图一区二区| 99久久免费国产| 午夜激情视频在线播放| 狠狠久久亚洲欧美专区| 国产精品羞羞答答在线| 亚洲欧美日本另类| 青青青国内视频在线观看软件| 国产成人精品电影久久久| 亚洲国产欧美在线观看| 日韩中文字幕一区| 亚洲激情网址| 午夜免费看毛片| 久久亚洲一级片| 欧美极品视频在线观看| 91极品美女在线| 欧美77777| 久久精品视频99| 成人黄色免费短视频| 97人人澡人人爽| 四季av一区二区三区免费观看 | sis001欧美| 国产伦精品一区二区三区免费视频| 成人久久综合| 精品一卡二卡三卡| 粉嫩av亚洲一区二区图片| 男人的午夜天堂| 日本丶国产丶欧美色综合| 亚洲精品一区二区三区区别| 北条麻妃一区二区三区中文字幕| xxx欧美xxx| 韩国精品一区二区三区六区色诱| 911久久香蕉国产线看观看| 精品久久久噜噜噜噜久久图片| 97成人超碰视| 精品无码黑人又粗又大又长| 日韩一区二区在线观看视频播放| 番号集在线观看| 国产成人免费av| 五月激激激综合网色播| 国产欧美日韩小视频| 国产精品亚洲视频| 国产精品视频看看| 欧美天堂亚洲电影院在线播放| 欧美香蕉爽爽人人爽| 2019最新中文字幕| 啪啪国产精品| 青青草原av在线播放| 91在线播放网址| 欧美三级韩国三级日本三斤在线观看| 欧美变态tickling挠脚心| 天天色天天射天天综合网| 91免费国产网站| 图片小说视频色综合| 九色porny自拍| 国产精品久久久久久久久果冻传媒| 中文字幕日本视频| 伊人久久久久久久久久久| 视频在线日韩| 深田咏美在线x99av| 久久国产精品无码网站| 少妇视频一区二区| 欧美日韩黄色一区二区| 色综合久久久久综合一本到桃花网| 国产精品视频一| 国产精品久久久久久影院8一贰佰| 亚洲制服中文字幕| 一区二区日韩av| 天堂中文在线看| 国产精品欧美一区二区三区奶水| 99欧美视频| 四虎成人免费视频| 精品久久久久久久久久久久久久 | 色综合综合网| 手机在线成人免费视频| 亚洲三级小视频| 高清国产mv在线观看| 欧美一区二区三区……| 国产日产精品一区二区三区四区的观看方式 | a级片在线播放| 性欧美在线看片a免费观看| 亚洲宅男网av| www.com久久久| 亚洲超碰精品一区二区| 美国一级片在线免费观看视频| 国产精品日韩久久久久| 综合视频在线| 亚洲午夜福利在线观看| 欧美美女黄视频| 77thz桃花论族在线观看| 欧美日韩免费观看一区| 精品写真视频在线观看| 日本少妇bbwbbw精品| 国产一区av在线| 视频一区中文字幕精品| 国产精品无码一区二区在线| 欧美国产精品一区二区| 亚洲av无码国产精品久久不卡| 日产精品99久久久久久| 亚洲国产精品成人| 特级西西人体wwwww| 在线播放欧美女士性生活| 超碰在线99| 中文字幕中文字幕在线中一区高清| 成人天堂资源www在线| 这里只有精品国产| 久久久久久久久国产精品| 欧美一二区在线观看| xxxx黄色片| 欧美精品日韩一区| 中文字幕在线视频久| www.激情网| 中文字幕一区二区三区蜜月| 四季av日韩精品一区| 91亚洲精品久久久久久久久久久久|