Spark性能优化合理设置并行度

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值