spark(2.3或新版本)如何确定读取gs bucket或hdfs中配置单元表文件的任务数?

xzlaal3s  于 2021-05-19  发布在  Spark
关注(0)|答案(1)|浏览(400)

输入数据:
一个包含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)中时,这也是正确的吗?
提前谢谢!

rur96b6h

rur96b6h1#

一个阶段中的任务数等于输入数据的分区数,而分区数又由数据大小和相关配置决定( dfs.blocksize (hdfs), fs.gs.block.size (地面军事系统), mapreduce.input.fileinputformat.split.minsize , mapreduce.input.fileinputformat.split.maxsize ). 对于涉及多个阶段的复杂查询,它是所有阶段的任务数之和。
hdfs和gcs之间没有区别,只是它们对块大小使用不同的配置, dfs.blocksizefs.gs.block.size .
参见以下相关问题:
在spark中如何将阶段划分为任务?
spark sql如何决定从配置单元表加载数据时将使用的分区数?

相关问题