Hadoop 如何决定输入数据大小和集群资源所需的分区数?
我的用例如下所述Hadoop 如何决定输入数据大小和集群资源所需的分区数?,hadoop,apache-spark,Hadoop,Apache Spark,我的用例如下所述 使用sparkContext.textFile(输入路径)从本地文件系统读取输入数据 在将输入数据(8000万条记录)提交给mapper/reducer函数之前,使用RDD.coalesce(numberOfPArtitions)将其划分为多个分区。在输入数据上不使用coalesce()或repartition()的情况下,spark的执行速度非常慢,并且会出现内存不足异常而失败 我在这里面临的问题是决定要应用于输入数据的分区数量。输入数据的大小每次都会变化,硬编码特定值不是一
AG确定分区的数量有点棘手。默认情况下,Spark将尝试推断出合理数量的分区。注意:如果您对压缩文本使用textFile方法,则Spark将禁用拆分,然后您将需要重新分区(听起来可能是这样的?)。在使用sc.textFile加载非压缩数据时,还可以指定最小数量的分区(例如sc.textFile(path,minPartitions))
聚合函数只用于减少分区的数目,所以您应该考虑使用RealStutiess()函数。< /P>
至于选择一个“好”数字,您通常希望至少与并行执行器的数量相同。已经存在一些逻辑来尝试确定“良好”的并行量,您可以通过调用sc.defaultParallelism来获得该值。我假设您知道将要进入的集群的大小, 然后,您可以尝试将数据划分为若干个 使用rangepartitioner对数据进行大致相等的分区(&U)。动态 分区是根据文件系统上的块数创建的&因此 调度如此多任务的任务开销主要会降低性能
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))
import org.apache.spark.RangePartitioner;
var file=sc.textFile(“”)
var partitionedFile=file.map(x=>(x,1))
var data=partitionedFile.partitionBy(新的RangePartitioner(3,partitionedFile))
Spark官方文档中的两个注释:
1-通常,我们建议集群中每个CPU核心执行2-3个任务
2-Spark可以有效地支持短至200毫秒的任务,因为它跨多个任务重用一个executor JVM,并且任务启动成本低,因此您可以安全地将并行级别提高到集群中的核心数以上
这是tumb的两条规则,可以帮助您估计分区的数量和大小。因此,最好有小任务(可以在100毫秒内完成)