hadoop 分片與分塊,map task和reduce task的理解

分塊:Block

  HDFS存儲系統中,引入了文件系統的分塊概念(block),塊是存儲的最小單位,HDFS定義其大小為64MB。與單磁盤文件系統相似,存儲在 HDFS上的文件均存儲為多個塊,不同的是,如果某文件大小沒有到達64MB,該文件也不會占據整個塊空間。在分布式的HDFS集群上,Hadoop系統保證一個塊存儲在一個datanode上。

  把File劃分成Block,這個是物理上真真實實的進行了劃分,數據文件上傳到HDFS里的時候,需要劃分成一塊一塊,每塊的大小由hadoop-default.xml里配置選項進行劃分。一個大文件可以把劃分后的所有塊存儲到同一個磁盤上,也可以在每個磁盤上都存在這個文件的分塊。

這個就是默認的每個塊64M:

<property>  <name>dfs.block.size</name>  <value>67108864</value>  <description>The default block size for new files.</description>  
</property>  

數據劃分的時候有冗余,即進行備份,個數是由以下配置指定的。具體的物理劃分步驟由Namenode決定。

1 <property>  
2   <name>dfs.replication</name>  
3   <value>3</value>  
4   <description>Default block replication.   
5   The actual number of replications can be specified when the file is created.  
6   The default is used if replication is not specified in create time.  
7   </description>  
8 </property>  

分片:splits

  由InputFormat這個接口來定義的,其中有個getSplits方法。這里有一個新的概念:fileSplit。每個map處理一個fileSplit,所以有多少個fileSplit就有多少個map(map數并不是單純的由用戶設置決定的)。

我們來看一下hadoop分配splits的源碼:

?

 1 long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits);
 2 long minSize = Math.max(job.getLong("mapred.min.split.size", 1), minSplitSize);
 3 
 4 for (FileStatus file: files) {
 5   Path path = file.getPath();
 6   FileSystem fs = path.getFileSystem(job);
 7   if ((length != 0) && isSplitable(fs, path)) { 
 8     long blockSize = file.getBlockSize();
 9     long splitSize = computeSplitSize(goalSize, minSize, blockSize);
10     
11     long bytesRemaining = length;
12     while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {
13       String[] splitHosts = getSplitHosts(blkLocations,length-bytesRemaining, splitSize, clusterMap);
14       splits.add(new FileSplit(path, length-bytesRemaining, splitSize, splitHosts));
15       bytesRemaining -= splitSize;
16     }
17 
18     if (bytesRemaining != 0) {
19       splits.add(new FileSplit(path, length-bytesRemaining, bytesRemaining, blkLocations[blkLocations.length-1].getHosts()));
20     }
21   } else if (length != 0) {
22     String[] splitHosts = getSplitHosts(blkLocations,0,length,clusterMap);
23     splits.add(new FileSplit(path, 0, length, splitHosts));
24   } else { 
25     //Create empty hosts array for zero length files
26     splits.add(new FileSplit(path, 0, length, new String[0]));
27   }
28 }
29 
30 return splits.toArray(new FileSplit[splits.size()]);
31 
32 protected long computeSplitSize(long goalSize, long minSize, long blockSize) {
33     return Math.max(minSize, Math.min(goalSize, blockSize));
34 }

totalSize:是整個Map-Reduce job所有輸入的總大小。

numSplits:來自job.getNumMapTasks(),即在job啟動時用org.apache.hadoop.mapred.JobConf.setNumMapTasks(int n)設置的值,給M-R框架的Map數量的提示。

goalSize:是輸入總大小與提示Map task數量的比值,即期望每個Mapper處理多少的數據,僅僅是期望,具體處理的數據數由下面的computeSplitSize決定。

minSplitSize:默認為1,可由子類復寫函數protected void setMinSplitSize(long minSplitSize) 重新設置。一般情況下,都為1,特殊情況除外

minSize:取的1和mapred.min.split.size中較大的一個。

blockSize:HDFS的塊大小,默認為64M,一般大的HDFS都設置成128M。

splitSize:就是最終每個Split的大小,那么Map的數量基本上就是totalSize/splitSize。

接下來看看computeSplitSize的邏輯:首先在goalSize(期望每個Mapper處理的數據量)和HDFS的block size中取較小的,然后與mapred.min.split.size相比取較大的

?

  一個片為一個splits,即一個map,只要搞清楚片的大小,就能計算出運行時的map數。而一個split的大小是由goalSize, minSize, blockSize這三個值決定的。computeSplitSize的邏輯是,先從goalSize和blockSize兩個值中選出最小的那個(比如一般不設置map數,這時blockSize為當前文件的塊size,而goalSize是文件大小除以用戶設置的map數得到的,如果沒設置的話,默認是1),在默認的大多數情況下,blockSize比較小。然后再取blockSize和minSize中最大的那個。而minSize如果不通過”mapred.min.split.size”設置的話(”mapred.min.split.size”默認為0),minSize為1,這樣得出的一個splits的size就是blockSize,即一個塊一個map,有多少塊就有多少map。

?

?

input_file_num : 輸入文件的個數
(1)默認map個數
如果不進行任何設置,默認的map個數是和blcok_size相關的。
default_num = total_size / block_size;
(2)期望大小
可以通過參數
mapred.map.tasks來設置程序員期望的map個數,但是這個個數只有在大于default_num的時候,才會生效。
goal_num =mapred.map.tasks;
(3)設置處理的文件大小
可以通過mapred.min.split.size 設置每個task處理的文件大小,但是這個大小只有在大于
block_size的時候才會生效。
split_size = max(
mapred.min.split.size,
block_size);split_num = total_size / split_size;
(4)計算的map個數
compute_map_num = min(split_num, max(default_num, goal_num))
除了這些配置以外,mapreduce還要遵循一些原則。 mapreduce的每一個map處理的數據是不能跨越文件的,也就是說max_map_num <= input_file_num。 所以,最終的map個數應該為:
final_map_num = min(compute_map_num, input_file_num)
經過以上的分析,在設置map個數的時候,可以簡單的總結為以下幾點:
(1)如果想增加map個數,則設置mapred.map.tasks 為一個較大的值。
(2)如果想減小map個數,則設置mapred.min.split.size 為一個較大的值。

map task

如何調整map數量:

有了2的分析,下面調整Map的數量就很容易了。

減小Map-Reduce job 啟動時創建的Mapper數量

當處理大批量的大數據時,一種常見的情況是job啟動的mapper數量太多而超出了系統限制,導致Hadoop拋出異常終止執行。解決這種異常的思路是減少mapper的數量。具體如下:

  輸入文件size巨大,但不是小文件

  這種情況可以通過增大每個mapper的input size,即增大minSize或者增大blockSize來減少所需的mapper的數量。增大blockSize通常不可行,因為當HDFS被hadoop namenode -format之后,blockSize就已經確定了(由格式化時dfs.block.size決定),如果要更改blockSize,需要重新格式化HDFS,這樣當然會丟失已有的數據。所以通常情況下只能通過增大minSize,即增大mapred.min.split.size的值。

  輸入文件數量巨大,且都是小文件

  所謂小文件,就是單個文件的size小于blockSize。這種情況通過增大mapred.min.split.size不可行,需要使用FileInputFormat衍生的CombineFileInputFormat將多個input path合并成一個InputSplit送給mapper處理,從而減少mapper的數量。具體細節稍后會更新并展開。

增加Map-Reduce job 啟動時創建的Mapper數量

增加mapper的數量,可以通過減小每個mapper的輸入做到,即減小blockSize或者減小mapred.min.split.size的值。

?

參考資料:

http://blog.csdn.net/strongerbit/article/details/7440111

http://blog.csdn.net/clerk0324/article/details/50887866

http://blog.csdn.net/yeruby/article/details/20068731

?http://zhidao.baidu.com/link?url=fLPxBdClbJ0R0-VGGiSbXR4bx9tlhadShKNYQ76CNrShD7Q7zsxr5b_df9gl7l5LA3VsXTkbeTvtOlj1fQY_yNx7bzopbfrW_tSbzN2J6Se

轉載于:https://www.cnblogs.com/qinwangchen/p/5837940.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256456.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256456.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256456.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SOLIDWORKS——參數化建模

https://www.sohu.com/a/259742200_100042821 知識點&#xff1a;投影曲線、曲面填充、掃描、外觀設置 建模步驟 1.先在工具——方程式里輸入一個直徑的變量A120 。 2.在前視基準面上草繪圓&#xff0c;畫一條直徑。直徑等于變量A。 3.旋轉&#xff0c;選擇粉色區域。 4.上視…

Arch 常用工具

一、網絡瀏覽pacman -S firefox firefox-i18n注&#xff1a;該命令中的前者為 Firefox 主程序,后者為語言包。pacman -S opera二、圖像編輯pacman -S gimp #圖像編輯軟件首選 GIMPpacman -S inkscape #矢量圖形編輯軟件Inkscapepacman -S scrot #…

Androd安全——反編譯技術完全解析

0&#xff0e;前言單純從技術角度上來講&#xff0c;掌握反編譯功能確實是一項非常有用的技能。另外既然別人可以反編譯程序&#xff0c;我們當然有理由應該對程序進行一定的保護&#xff0c;因此代碼混淆也是我們必須要掌握的一項技術。看完此篇如果對代碼混淆也感興趣&#x…

python——shape 與reshape

轉載自:https://blog.csdn.net/u010916338/article/details/84066369 shape()和reshape()都是數組array中的方法 numpy中reshape函數的三種常見相關用法 numpy.arange(n).reshape(a, b) 依次生成n個自然數&#xff0c;并且以a行b列的數組形式顯示np.arange(16).reshape(2,…

誤刪了microsoft visual c++后如何正常運行matlab

誤刪了microsoft visual c后如何正常運行matlab 本人在卸載visual studio2013的時候&#xff0c;因為這個軟件卸載的過程中出現一些問題&#xff0c;誤將visual c當成VS的組件一同刪除了。但是在打開matlab 時發現出錯&#xff0c;matlab打開后會出現下面的界面。 出現這個問題…

iScreenLocker 3.1.8 安卓鎖屏通知--蘋果一樣的體驗

*軟件介紹:蘋果鎖屏通知(iScreenLocker)是一款android上ios風格的鎖屏軟件。它顛覆安智通知設計&#xff0c;將原來狀態欄的通知搬到鎖屏界面上來&#xff0c;能夠在桌面輕松收發短信,微博,微信等消息。它獨有的消息喚醒功能。能使手機從待機界面喚醒而消耗非常少的電量。手指輕…

JSP慕課網階段用戶登錄小例子(不用數據庫)

getAttribute和setAttribute一起使用&#xff0c;而getParameter用于取得如request傳來的參數。 Web是請求/響應架構的使用&#xff0c;而request和response就是在服務器端生成的相應的兩個對象&#xff0c;request能夠獲取客戶端傳遞的參數及相關的一些信息&#xff0c;而resp…

機器學習python——python基礎

目錄 1、常用庫 2、shape與reshape&#xff0c;dtype 3、range、arange、linspace、logspace 4、數組的計算、切片 5、繪圖基本設置 6.三維繪圖 1、常用庫 numpy、scipy、matplotlib、math 2、shape與reshape&#xff0c;dtype https://blog.csdn.net/qq_45769063/arti…

win10環境下如何給visual studio 2013永久配置opencv3.1.0環境

win10環境下如何給visual studio 2013永久配置opencv3.1.0環境 本人在給visual studio 2013配置opencv 環境下遇到過一些問題&#xff0c;比如配置不成功或者不能永久配置opencv環境。先將自己的配置經驗分享于此&#xff0c;希望同道中的好友可以用上。 首先自行下載Visual s…

屬性名、變量名與 內部關鍵字 重名 加

procedure TForm4.btn3Click(Sender: TObject); varMyQj: TQJson;MyPrinter: TPrinter; beginMyQj : TQJson.Create;tryMyPrinter.name : A號打印機;MyPrinter.status : enabled;MyPrinter.&type : yes;MyQj.FromRecord<TPrinter>(MyPrinter);Memo1.Lines.Add(MyQj.A…

機器學習——支持向量機SVM之線性模型

目錄 一、沒有免費的午餐定理 二、支持向量機SVM&#xff08;support vector machine&#xff09; 1、線性模型和非線性模型 2、如何在線性模型中畫出一條直線&#xff08;優化過程——vplink&#xff09; 1&#xff09;多少條&#xff1f; 2&#xff09;如何畫出最好的直…

Oauth2.0和1.0區別

1.0的授權分3步, A)客戶端到授權服務器請求一個授權令牌(request token&secret) B)引導用戶到授權服務器請求授權 C)用訪問令牌到授權服務器換取訪問令牌(access token&secret) D)用訪問令牌去訪問得到授權的資源 2.0的用戶授權過程有2步&#xff0c; A)引導用戶到授權…

選導師,定方向

選導師&#xff0c;定方向。 看文獻看到9.40&#xff0c;實在是看不下去&#xff0c;索性寫一些自己這近兩年來的研究生生涯的一些感悟&#xff0c;希望對還在迷茫中的你們有一點點的啟示&#xff08;如果談不上啟示&#xff0c;那就當給你們一點安慰&#xff09;。 ** 選導師…

在apache中設置訪問目錄后進入的默認頁面為index.php

找到apache的配置文件httpd.conf后找到 DirectoryIndex index.html index.php 在其中添加index.php, 轉載于:https://www.cnblogs.com/itdi/p/5844517.html

spring@PropertySource用法

v測試例子 package com.hjzgg.auth.config;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annot…

機器學習——支持向量機SVM之非線性模型(低維到高維映射)

目錄 一、非線性模型的最優化問題 1、非線性模型最優化模型 2、兩個概念 1&#xff09;正則項&#xff08;regularization term&#xff09; 2&#xff09;調參參數 2、高維映射 1&#xff09;定義及作用 2&#xff09;高維映射后的最優化模型 3&#xff09;異或問題&…

html表單中get與post之間的區別

當用戶在 HTML 表單 (HTML Form) 中輸入信息并提交之后&#xff0c;有兩種方法將信息從瀏覽器傳送到 Web 服務器 (Web Server)。 一種方法是通過 URL&#xff0c;另外一種是在 HTTP Request 的 body 中。 前一種方法&#xff0c;我們使用 HTML Form 中的 method "get&quo…

世界坐標系,攝像機坐標系、圖像坐標系關系匯總

**攝像機標定&#xff1a;**在計算機視覺研究領域&#xff0c;攝像機標定是一個重要的環節。攝像機標定就是求取攝像機內外參數的過程。 世界坐標系&#xff1a;絕對坐標系&#xff0c;一般的三維場景都由這個坐標系來表示。攝像機可以放置在環境中的任何位置&#xff0c;因此可…

SpringMVC-HelloWorld

2&#xff0e;5、Hello World入門 2.5.1、準備開發環境和運行環境&#xff1a; ☆開發工具&#xff1a;eclipse ☆運行環境&#xff1a;tomcat6.0.20 ☆工程&#xff1a;動態web工程&#xff08;springmvc-chapter2&#xff09; ☆spring框架下載&#xff1a; spring-framework…

CSVN備份初體驗

備份方法挺多的&#xff0c;目前我知道有四種 其一&#xff1a; 首先復制舊csvn服務器上repositories下的版本庫文件夾到新csvn服務器repositories文件夾下面&#xff08;做以下修改時最好把csvn服務停掉&#xff09; 然后復制舊csvn的svn_auth_file到新csvn上&#xff08;相當…