作者回复: 先不说每一类配置项的设置位置是否合理,单说老弟深入钻研的精神,尤为可嘉!!!顺便一提,ID可以改一下,这样大家对你印象更深~ 为了降低大家的学习成本,咱们确实没有逐个讲解每一类配置项,Configuration页面确实提供了种类繁多的配置选项,对于刚入门的同学非常不友好。老弟认真地把每一类都过了一遍,而且都分析了配置项的设置顺序,真的很赞👍!!! 这里咱们不去深究具体每一类到底应该设置在哪个level,其实只要把握住配置项的一半设置原则,基本上就不会有太大的问题。对于不同(种类)的配置项,可以follow下面的设置原则(其实你把你分析的每个环节汇总,能得出一样的结论): 1. 硬件资源类的(资源供给类:CPU、内存、磁盘、网络),spark-defaults.conf统一设置; 2. 全局服务类的(比如动态扩容、External shuffle services,安全,压缩,Spark UI,等等),spark-defaults.conf统一设置; 3. 任务粒度的配置(如Task重试、locality wait、是否推断speculative task,等等),用命令行,或是SparkConf,推荐用SparkConf,命令行不好管理~
作者回复: 可以的,老弟说的场景,其实挺普遍的,比如机器学习流水线就是这样,前期ETL做特征工程、样本工程,后期MLlib做模型训练。把应用分开就好了,每个应用内部,通过SparkConf来单独设置参数值,从而在应用层面对配置项做隔离设置
作者回复: 好问题~ 这里不必拘泥于文中给出的2~3倍,这是个非常general、老套的经验之谈。2~3倍,仅仅是个起点,或者说设置并行度的思路,实际上并行度的设置,参考cores总数并不总是最好的,最佳的思路,还是参考数据分片大小。如果能够把分片大小控制在200MB左右,并行度实际上就是D/200MB,其中D是数据集总大小。目的还是充分利用CPU、像你说的:“避免在某些执行过快的task在执行完本次任务后,还有其他的任务可以执行,充分利用集群的资源”。不考虑数据集总大小D,单纯地设置2~3倍,或是4~5倍,其实是没有意义的~ 关于并行度的设置,内存、CPU设置,老弟可以参考性能调优篇的“三足鼎立”哈~
作者回复: 老弟实际上问的是spark.default.parallelism 和 spark.sql.shuffle.partitions的区别。 1)spark.default.parallelism,这个用来控制RDD的默认并行度,HadoopRDD是自带并行度的(与HDFS文件分片一致),而用parallelize创建的RDD,在没有指定并行度的情况下,默认用spark.default.parallelism 2)spark.sql.shuffle.partitions,这个是reduce阶段默认的并行度,如果开发者没有明确指定的话 回到原来的问题,D/P ~ m/c,这里的P,指的是开发者要设置的并行度,如果不设置,那默认就是上面那两种情况。在D/P ~ m/c这个式子里面,D是固定的,是数据原始大小,P、m、c,都需要开发者设定,而他们3个的设置,可以参考这个公式,做到“三足鼎立”,尽量让等式两边平衡
作者回复: 指的是数据集大小、并行度,与资源设置之间的关联关系,参考这个公式: D/P ~m/c 有利于做到数据分区之间,task与task之间的负载均衡,从而为应用的执行性能打下很好的基础。 其中D是数据集大小,P是并行度,m是每个Executors的内存大小,c是CPU核数。公式的意思是说,单个数据分片,与单个task能拿到的内存,是在同一个数量级,是相匹配的。这样一来,task与数据量相匹配,应用整体的计算效率,就不会差到哪里去
作者回复: 是的,没错~
作者回复: D的话,可以精确估计,也即加载到内存后cache,然后通过执行计划来看实际内存消耗;另一种就是粗略估计,比较按照压缩比,大致算一个数字,也是可以的~
作者回复: 不是,这是个配置项,可以配置到任意操作系统目录,用来改善Shuffle中间文件存储,以及RDD Cache磁盘存储。