轉自:https://blog.csdn.net/Dr_Guo/article/details/51150278
看了很多博客,感覺沒有一個說的很清楚,所以我來整理一下。
先看一下這個圖
輸入分片(Input Split):在進行map計算之前,mapreduce會根據輸入文件計算輸入分片(input split),每個輸入分片(input split)針對一個map任務,輸入分片(input split)存儲的並非數據本身,而是一個分片長度和一個記錄數據的位置的數組。
Hadoop 2.x默認的block大小是128MB,Hadoop 1.x默認的block大小是64MB,可以在hdfs-site.xml中設置dfs.block.size,注意單位是byte。
分片大小範圍可以在mapred-site.xml中設置,mapred.min.split.size mapred.max.split.size,minSplitSize大小默認爲1B,maxSplitSize大小默認爲Long.MAX_VALUE = 9223372036854775807
那麼分片到底是多大呢?
minSize=max{minSplitSize,mapred.min.split.size}
maxSize=mapred.max.split.size
splitSize=max{minSize,min{maxSize,blockSize}}
我們再來看一下源碼
答案是實際的文件大小,而非一個塊的大小。
有大神已經驗證這個答案了:http://blog.csdn.net/samhacker/article/details/23089157
1、往hdfs裏面添加新文件前,hadoop在linux上面所佔的空間爲 464 MB:
2、往hdfs裏面添加大小爲2673375 byte(大概2.5 MB)的文件:
2673375 derby.jar
3、此時,hadoop在linux上面所佔的空間爲 467 MB——增加了一個實際文件大小(2.5 MB)的空間,而非一個block size(128 MB):
4、使用hadoop dfs -stat查看文件信息:
這裏就很清楚地反映出: 文件的實際大小(file size)是2673375 byte, 但它的block size是128 MB。
5、通過NameNode的web console來查看文件信息:
結果是一樣的: 文件的實際大小(file size)是2673375 byte, 但它的block size是128 MB。
6、不過使用‘hadoop fsck’查看文件信息,看出了一些不一樣的內容—— ‘1(avg.block size 2673375 B)’:
值得注意的是,結果中有一個 ‘1(avg.block size 2673375 B)’的字樣。這裏的 'block size' 並不是指平常說的文件塊大小(Block Size)—— 後者是一個元數據的概念,相反它反映的是文件的實際大小(file size)。以下是Hadoop Community的專家給我的回覆:
“The fsck is showing you an "average blocksize", not the block size metadata attribute of the file like stat shows. In this specific case, the average is just the length of your file, which is lesser than one whole block.”
最後一個問題是: 如果hdfs佔用Linux file system的磁盤空間按實際文件大小算,那麼這個”塊大小“有必要存在嗎?
其實塊大小還是必要的,一個顯而易見的作用就是當文件通過append操作不斷增長的過程中,可以通過來block size決定何時split文件。以下是Hadoop Community的專家給我的回覆:
“The block size is a meta attribute. If you append tothe file later, it still needs to know when to split further - so it keeps that value as a mere metadata it can use to advise itself on write boundaries.”
補充:我還查到這樣一段話
原文地址:http://blog.csdn.net/lylcore/article/details/9136555
一個split的大小是由goalSize, minSize, blockSize這三個值決定的。computeSplitSize的邏輯是,先從goalSize和blockSize兩個值中選出最小的那個(比如一般不設置map數,這時blockSize爲當前文件的塊size,而goalSize是文件大小除以用戶設置的map數得到的,如果沒設置的話,默認是1)。
DirectX5.0最新遊戲編程指南 DirectDraw教程篇 一、配置DirectX SDK
- holyfire
- 2001-04-16 09:37:00
- 3342
Hadoop-2.4.1源碼分析--MapReduce作業切片(Split)過程
- u010010428
- 2016-05-21 16:43:51
- 2308
MapReduce Input Split(輸入分/切片)詳解 - CSDN博客
- 2018-4-9
解析如何讀取文件形成InputSplit - CSDN博客
- 2018-4-14
Hadoop InputFormat定製時必須知道的原理---如何劃分split,split如何調度,如何讀取
- chenhuijie666
- 2014-05-21 15:55:31
- 1242
Hadoop中 MapReduce中InputSplit的分析 - CSDN博客
- 2018-4-17
Hadoop InputFormat定製時必須知道的原理---如何劃分sp..._CSDN博客
- 2018-3-23
hadoop 文件分塊,block與split關係
- soony_007
- 2013-10-09 19:57:36
- 3997
hadoop block split 區別
- baolibin528
- 2015-03-16 15:16:31
- 695
Hadoop源碼解析之: TextInputFormat如何處理跨split的行 - CSDN博客
- 2018-4-5