split和block的区别以及maptask和reducetask个数设定

split和block的区别以及maptask和reducetask个数设定,第1张

job.split中包含split的个数由FileInputFormat.getSplits计算出,方法的逻辑如下:

1. 读取参数mapred.map.tasks,这个参数默认设置为0,生产系统中很少修改。

2. 计算input文件的总字节数,总字节数/(mapred.map.tasks==0 ? 1: mapred.map.tasks )=goalsize

3. 每个split的最小值minSize由mapred.min.split.size参数设置,这个参数默认设置为0,生产碰桥系统中很少修改。

4. 调用computeSplitSize方法,计算出splitsize= Math.max(minSize, Math.min(goalSize, blockSize)),通常这个值=blockSize,输入的局瞎文件较小,文件字节数之和小于blocksize时,splitsize=输入文件字节数之和。

5. 对于input的每个文件,计算split的个数。

a) 文件大小/splitsize>1.1,创建一个split,这个split的字节数=splitsize,文件剩余字节数=文件大小-splitsize

b) 文件剩余字节数/splitsize<1.1,剩余的部分作为一个split

举例说明:

1. input只有一个文件,大小为100M,splitsize=blocksize,则split数为2,第一个split为64M,第二个为36M

2. input只有一个文件,大小为65M,splitsize=blocksize,则split数为1,split大小为65M

3. input只有一个文件,大小为129M,splitsize=blocksize,则split数为2,第一个split为64M,第二个为65M(最后一个split的大小可能超过splitsize)

4. input只有一个文件,大小为20M ,splitsize=blocksize,则split数为1,split大小为20M

5. input有两个文件,大小为100M和20M,splitsize=blocksize,则split数为3,第一个文件分为两个split,第一个split为64M,第二个为36M,第二个文件为一个split,大小为20M

6. input有两个文件,大小为25M和20M,splitsize=blocksize,则split数为2,第一个文件为一个split,大小为25M,第二个文件为一个split,大小为20M

假设一个job的input大小固定为100M,当只包含一个文件时,split个数为2,maptask数为2,但当包含10个10M的文件时,maptask数笑腊猛为10。

下面来分析reducetask,纯粹的mapreduce task的reduce task数很简单,就是参数mapred.reduce.tasks的值,hadoop-site.xml文件中和mapreduce job运行时不设置的话默认为1。

在HIVE中运行sql的情况又不同,hive会估算reduce task的数量,估算方法如下:

通常是ceil(input文件大小/1024*1024*1024),每1GB大小的输入文件对应一个reduce task。

特殊的情况是当sql只查询count(*)时,reduce task数被设置成1。

写成多行便型空慧于调试中间卜答结果:

line=`wc -l file.txt | cut -d' ' -f1`

[ $line -le 50 ] &&exit 1 #小于等亏颂于50行则没必要分割

let n=line/50

split -l $n file.txt

多种方举档迟法..

1.split后,是存放在数组中. 使用ubound来测蠢搏试数正李组的最大下标,然后加上1,就知道分割的数量了.(因为数组默认是从0开始的)

2.split语句是要指定分割符的, 你可以先用len(字符串)- len(replace(字符串,分割符,""))来测得有多少个分割符, 就知道分割的数量了, 这个应该是在分割符的数量上+2


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12212408.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存