输入数据:
一个包含35个文件的配置单元表(t)(每个文件约1.5gb,sequencefile)
文件在gs桶中
默认fs.gs.block.size=~128mb
所有其他参数都是默认值
实验1:
创建一个有2个worker的dataproc(每个worker有4个核心)
从t运行select count();
实验1结果:
创建了大约650个任务来读取配置单元表文件
每个任务读取约85mb的数据
实验2:
创建一个有64个worker的dataproc(每个worker有4个核心)
从t运行select count();
实验2结果:
创建了约24480个任务来读取配置单元表文件
每个任务读取~2.5mb数据(在我看来,1个任务读取2.5mb数据不是一个好主意,因为打开文件的时间可能比读取2.5mb要长。)
问题1:你知道spark是如何决定读取配置单元表数据文件的任务数的吗?我重复同样的实验,把同样的数据放在hdfs中,得到了相似的结果。
我的理解是,读取配置单元表文件的任务数应该与hdfs中的块数相同。问题2:这是正确的吗?问题3:当数据在gs存储桶(而不是hdfs)中时,这也是正确的吗?
提前谢谢!
1条答案
按热度按时间rur96b6h1#
一个阶段中的任务数等于输入数据的分区数,而分区数又由数据大小和相关配置决定(
dfs.blocksize
(hdfs),fs.gs.block.size
(地面军事系统),mapreduce.input.fileinputformat.split.minsize
,mapreduce.input.fileinputformat.split.maxsize
). 对于涉及多个阶段的复杂查询,它是所有阶段的任务数之和。hdfs和gcs之间没有区别,只是它们对块大小使用不同的配置,
dfs.blocksize
与fs.gs.block.size
.参见以下相关问题:
在spark中如何将阶段划分为任务?
spark sql如何决定从配置单元表加载数据时将使用的分区数?