我的用例如下所述。
我在这里遇到的问题是决定要对输入数据应用的分区数。输入数据大小每次都在变化,硬编码特定值不是一种选择。 只有当某些最佳分区应用于我必须执行大量迭代(试验和错误)的输入数据时,才能很好地执行spark。这不是生产环境中的选项。
我的问题:是否有拇指规则来决定所需的分区数量,具体取决于输入数据大小和可用的群集资源(执行程序,核心等等)?如果是,请指出我的方向。非常感谢任何帮助。
我在纱线上使用火花1.0。
谢谢, AG
答案 0 :(得分:5)
Spark官方文档中Tuning Spark的两个注释:
1-通常,我们建议群集中每个CPU核心有2-3个任务。
2- Spark可以有效地支持短至200毫秒的任务,因为它在多个任务中重用一个执行程序JVM,并且它的任务启动成本低,因此您可以安全地将并行度提高到超过核心数在你的集群中。
这是两个tumb规则,可帮助您估计分区的数量和大小。因此,最好有小任务(可以在几百毫秒内完成)。
答案 1 :(得分:1)
确定分区数有点棘手。默认情况下,Spark会尝试推断出合理数量的分区。注意:如果你使用带有压缩文本的textFile方法,那么Spark将禁用拆分,然后你需要重新分区(听起来这可能是发生了什么?)。使用sc.textFile加载非压缩数据时,您还可以指定最小分区数(例如sc.textFile(path,minPartitions))。
coalesce函数仅用于减少分区数,因此您应该考虑使用repartition()函数。
至于选择" good"您通常希望编号至少与并行执行程序的数量一样多。已经存在一些逻辑来尝试和确定一个好的"并行度,您可以通过调用sc.defaultParallelism
来获取此值答案 2 :(得分:1)
我假设您知道群集的大小, 那么你基本上可以尝试将数据分成几倍的数据 那&使用rangepartitioner来粗略地对数据进行分区。动态 根据文件系统上的块数创建分区。因此 调度的任务开销如此多的任务通常会导致性能下降。
import org.apache.spark.RangePartitioner;
var file=sc.textFile("<my local path>")
var partitionedFile=file.map(x=>(x,1))
var data= partitionedFile.partitionBy(new RangePartitioner(3, partitionedFile))