1 Hadoop文件和block的关系,split与block的关系,一个map对应一个split分片吗?
1.1 Hadoop文件和block的关系
在介绍hadoop写文件的时候我们经常会说首先分割文件为多个块;那么是怎么分割的呢?这里其实不要有过的纠结,这里的块是block,是hdfs中切块的大小,属于物理划分,默认128M,在hadoop-default.xml配置中有体现,也可以修改。
1.2 什么是split,它与block的关系
首先,split是mapreduce中的概念,而block是hdfs中切块的大小。
totalSize:是整个Map-Reduce job所有输入的总大小。
numSplits:来自job.getNumMapTasks(),即在job启动时用org.apache.hadoop.mapred.JobConf.setNumMapTasks(intn)设置的值,给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,可理解为一个block块,这样得出的一个splits的size就是blockSize,即一个块一个map,有多少块就有多少map。
split的大小是默认和hdfs的block块大小一致,但是可以通过配置文件自己设置: 其中有俩个配置文件(如下):
--minsize 默认大小为1
mapreduce.input.fileinputformat.split.minsize
--maxsize 默认大小为Long.MAXValue
ma