【问题标题】:Spark 1.4 increase maxResultSize memorySpark 1.4 增加 maxResultSize 内存
【发布时间】:2023-03-24 08:09:01
【问题描述】:

我正在使用 Spark 1.4 进行研究,并且在内存设置方面遇到了困难。我的机器有 16GB 内存,所以没有问题,因为我的文件大小只有 300MB。虽然,当我尝试使用 toPandas() 函数将 Spark RDD 转换为 panda 数据帧时,我收到以下错误:

serialized results of 9 tasks (1096.9 MB) is bigger than spark.driver.maxResultSize (1024.0 MB)

我尝试通过更改 spark-config 文件来解决此问题,但仍然遇到相同的错误。我听说这是 spark 1.4 的问题,想知道你是否知道如何解决这个问题。非常感谢任何帮助。

【问题讨论】:

    标签: python memory apache-spark pyspark jupyter


    【解决方案1】:

    您可以在SparkConf对象中设置spark.driver.maxResultSize参数:

    from pyspark import SparkConf, SparkContext
    
    # In Jupyter you have to stop the current context first
    sc.stop()
    
    # Create new config
    conf = (SparkConf()
        .set("spark.driver.maxResultSize", "2g"))
    
    # Create new context
    sc = SparkContext(conf=conf)
    

    你也应该创建一个新的SQLContext

    from pyspark.sql import SQLContext
    sqlContext = SQLContext(sc)
    

    【讨论】:

      【解决方案2】:

      从命令行,例如使用 pyspark,--conf spark.driver.maxResultSize=3g 也可用于增加最大结果大小。

      【讨论】:

      • 这对我来说效果最好,因为会话中 SparkContext 重启需要再次进行身份验证
      【解决方案3】:

      考虑到运行环境,调整spark.driver.maxResultSize 是一个很好的做法。但是,这不是您问题的解决方案,因为数据量可能会随时间变化。正如@Zia-Kayani 提到的,最好明智地收集数据。因此,如果您有一个 DataFrame df,那么您可以调用 df.rdd 并在集群上而不是在驱动程序中做所有神奇的事情。但是,如果您需要收集数据,我建议:

      • 不要打开spark.sql.parquet.binaryAsString。字符串对象占用更多空间
      • 在收集 RDD 时使用 spark.rdd.compress 压缩它们
      • 尝试使用分页来收集它。 (Scala 中的代码,来自另一个答案 Scala: How to get a range of rows in a dataframe

        long count = df.count() int limit = 50; while(count > 0){ df1 = df.limit(limit); df1.show(); //will print 50, next 50, etc rows df = df.except(df1); count = count - limit; }

      【讨论】:

        【解决方案4】:

        看起来您正在收集 RDD,因此它肯定会将所有数据收集到驱动程序节点,这就是您面临此问题的原因。 如果 rdd 不需要,或者如果有必要,则必须避免收集数据,然后指定 spark.driver.maxResultSize。定义这个变量有两种方法

        1 - 通过将此变量设置为
        conf.set("spark.driver.maxResultSize", "3g")
        来创建 Spark Config 2 - 或设置此变量 在 spark 的 conf 文件夹中的 spark-defaults.conf 文件中。喜欢 spark.driver.maxResultSize 3g 并重启 spark。

        【讨论】:

        • 我确实在配置文件中设置了变量并重新启动了 spark,但仍然出现相同的错误。
        • 它对我有用,但这应该是你提到的临时解决方案;)谢谢你
        • 第一个在client mode 中不起作用,因为JVM 已经启动了。
        • 它有效,请先测试然后给答案打分。请参阅标记为答案的此问题的回复。在代码中设置属性。
        【解决方案5】:

        在启动作业或终端时,您可以使用

        --conf spark.driver.maxResultSize="0"
        

        消除瓶颈

        【讨论】:

        • aws:错误:选项 --configurations 的 json 参数无效
        【解决方案6】:

        还有一个 Spark 错误 https://issues.apache.org/jira/browse/SPARK-12837 这给出了同样的错误

         serialized results of X tasks (Y MB) is bigger than spark.driver.maxResultSize
        

        即使您可能没有明确将数据拉入驱动程序。

        SPARK-12837 解决了 Spark 错误,即 Spark 2 之前的累加器/广播变量被不必要地拉到驱动程序中,从而导致此问题。

        【讨论】:

          【解决方案7】:

          您可以在启动 pyspark shell 时将 spark.driver.maxResultSize 设置为 2GB:

          pyspark  --conf "spark.driver.maxResultSize=2g"
          

          这是为了允许 spark.driver.maxResultSize 2Gb

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-18
            • 2013-11-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多