RDD中的分区数和Spark中的性能

mar*_*tin 31 performance apache-spark rdd pyspark

在Pyspark中,我可以从列表中创建RDD并确定要有多少分区:

sc = SparkContext()
sc.parallelize(xrange(0, 10), 4)
Run Code Online (Sandbox Code Playgroud)

我决定对RDD进行分区的分区数量如何影响性能?这取决于我的机器核心数量如何?

jav*_*dba 47

主要作用是通过指定太少分区或分区太多.

分区太少 您将无法使用群集中的所有可用核心.

分区太多管理许多小任务会产生过多的开销.

在这两者之间,第一个对性能影响更大.对于低于1000的分区计数,在此时调度太多小任务是相对较小的影响.如果你有数万个分区的顺序,那么spark变得非常慢.

  • 确实.我有一个特殊的工作,当它有200万个大型json对象分成25K分区时,用来耗尽内存.当我合并到320时,工作在不到一分钟的时间内完成.这似乎是提高性能的最简单方法之一. (2认同)
  • 太多分区的缺点:更多的获取,更多的磁盘搜索。驱动程序需要跟踪每个任务的状态。资料来源:幻灯片 53,https://www.slideshare.net/Hadoop_Summit/why-your-spark-job-is-failing (2认同)

Chr*_*end 38

为了增加javadba的优秀答案,我记得文档建议将您的分区数设置为群集中CPU核心数的3或4倍,以便在可用的CPU核心中更均匀地分配工作.这意味着,如果群集中每个CPU核心只有1个分区,则必须等待一个运行时间最长的任务才能完成,但如果你进一步将其分解,则工作负载将更加均衡地与快速和慢速运行的任务平衡.

  • 您能否提供一份参考文档中描述的建议分区数量的参考资料,请? (3认同)
  • 在《Spark in action》一书中,Petar Zecevi´c 第 74 页说“我们建议使用比集群中的内核多三到四倍的分区” (2认同)
  • “集群中的CPU核心数”是指**spark.driver.cores**还是**spark.executor.cores**? (2认同)
  • @Kenny Spark.executor.cores 就是这样! (2认同)