Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 如何决定输入数据大小和集群资源所需的分区数?_Hadoop_Apache Spark - Fatal编程技术网

Hadoop 如何决定输入数据大小和集群资源所需的分区数?

Hadoop 如何决定输入数据大小和集群资源所需的分区数?,hadoop,apache-spark,Hadoop,Apache Spark,我的用例如下所述 使用sparkContext.textFile(输入路径)从本地文件系统读取输入数据 在将输入数据(8000万条记录)提交给mapper/reducer函数之前,使用RDD.coalesce(numberOfPArtitions)将其划分为多个分区。在输入数据上不使用coalesce()或repartition()的情况下,spark的执行速度非常慢,并且会出现内存不足异常而失败 我在这里面临的问题是决定要应用于输入数据的分区数量。输入数据的大小每次都会变化,硬编码特定值不是一

我的用例如下所述

  • 使用sparkContext.textFile(输入路径)从本地文件系统读取输入数据
  • 在将输入数据(8000万条记录)提交给mapper/reducer函数之前,使用RDD.coalesce(numberOfPArtitions)将其划分为多个分区。在输入数据上不使用coalesce()或repartition()的情况下,spark的执行速度非常慢,并且会出现内存不足异常而失败
  • 我在这里面临的问题是决定要应用于输入数据的分区数量。输入数据的大小每次都会变化,硬编码特定值不是一个选项和spark只有在对输入数据应用某些最佳分区时才表现得非常好,我必须对这些数据执行大量迭代(反复试验)。这不是生产环境中的选项。

    我的问题:根据输入数据大小和可用的集群资源(执行器、内核等),是否有一个经验法则来决定所需的分区数?如果是,请告诉我那个方向。非常感谢您的帮助

    我在纱线上使用spark 1.0

    谢谢,
    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毫秒内完成)