Apache spark Spark 2.X:使用Spark SQL查询配置单元表时Spark作业设置的任务数

Apache spark Spark 2.X:使用Spark SQL查询配置单元表时Spark作业设置的任务数,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,关于Spark任务的数量以及它与分区数量的关系,已经提出了很多问题。但不知何故,我无法理解以下情况 我有一个配置单元表(一个HDFS文件夹),其中包含160个拼花压缩文件。 这些文件大部分都很平衡:最小的是7.5MB,最大的是49.2MB。 在HDFS浏览器中,我看到每个文件都在1个(非完整)HDFS块(128MB)内 集群具有以下属性:10台机器、1台主服务器和9台辅助服务器。每台机器有6个核(12个虚拟核)。我用的是纱线。此外: spark.executor.cores = 6 现在,我创

关于Spark任务的数量以及它与分区数量的关系,已经提出了很多问题。但不知何故,我无法理解以下情况

我有一个配置单元表(一个HDFS文件夹),其中包含160个拼花压缩文件。 这些文件大部分都很平衡:最小的是7.5MB,最大的是49.2MB。 在HDFS浏览器中,我看到每个文件都在1个(非完整)HDFS块(128MB)内

集群具有以下属性:10台机器、1台主服务器和9台辅助服务器。每台机器有6个核(12个虚拟核)。我用的是纱线。此外:

spark.executor.cores = 6
现在,我创建以下数据帧:

val myDF = spark.sql("SELECT * FROM myHiveTable WHERE myCol='someValue')
即使在触发作业之前,也可以提前知道:

myDF.rdd.partitions.size
返回60

为了触发作业,需要一个操作,所以我将“myDF”写入HDFS。这项工作确实产生了42名执行者和60项任务

我的问题是:

  • 如果我一开始有160个分区,为什么我最终会有60个

  • 如果我有60个任务和10台机器,那么我最好只需要10个执行器(我在某个地方读到,每个执行器可以并行运行与内核数量相同的任务,在我的例子中是6个)。我知道,只有当数据集在数据节点之间完全平衡时,才会发生这种情况,但在我看来,42个执行者与10个执行者相去甚远。还是我的推理错了

  • Spark如何在运行查询之前提前知道这将导致60个分区


  • 谢谢大家!

    我想这可能就是问题1和3的答案

    显然,如果我将配置单元表(实际上是一个文件夹)作为rdd读取,我也会得到相同数量的分区(60)。rdd的分区数由特定的InputFormat确定。 资料来源:

    因此,我搜索了由@Samson Scharfrichter的评论触发的拼花地板的行为,我发现:


    因此,这个公式也许可以解释为什么是60,以及如何提前计算。

    根据记录,拼花地板文件的平行度是“行块”的数量,也就是说,可能超过文件的数量(或者更少,如果你有空文件)。@SamsonScharfrichter你能澄清你的评论吗?这里有进展吗?
    Min(defaultMinSplitSize (128MB, `spark.sql.files.maxPartitionBytes`,
        Max(openCostInByte(8MB, `spark.sql.files.openCostInBytes`,
            totalSize/defaultParallelism)
    )