【问题标题】:How to find pyspark dataframe memory usage?如何查找 pyspark 数据帧内存使用情况?
【发布时间】:2018-02-23 23:18:32
【问题描述】:

对于 python 数据帧,info() 函数提供内存使用。 pyspark 中是否有任何等价物? 谢谢

【问题讨论】:

标签: python apache-spark dataframe pyspark


【解决方案1】:

根据documentation

确定数据集所需内存消耗量的最佳方法是创建一个 RDD,将其放入缓存中,然后查看 Web UI 中的“存储”页面。该页面会告诉你 RDD 占用了多少内存。

要估计特定对象的内存消耗,请使用 SizeEstimator 的估计方法。这对于尝试不同的数据布局以减少内存使用量以及确定广播变量将在每个执行程序堆上占用的空间量很有用。

【讨论】:

    【解决方案2】:

    我有一些想法,这只是一个粗略的估计。据我所知,spark 没有直接的方法来获取数据帧内存使用情况,但 Pandas 数据帧可以。所以你能做的就是。

    1. 选择 1% 的数据 sample = df.sample(fraction = 0.01)
    2. pdf = sample.toPandas()
    3. 通过pdf.info()获取pandas数据帧内存使用情况
    4. 将该值乘以 100,这应该可以粗略估计您的整个 spark 数据帧内存使用情况。
    5. 如果我错了,请纠正我:|

    【讨论】:

    • 这似乎是合理的,应该提供一个保守的估计。但是,我不确定时间成本以及这是否比 .cache() 更快并检查 spark ui 下的存储。
    【解决方案3】:

    尝试使用the _to_java_object_rdd() function:

    import py4j.protocol  
    from py4j.protocol import Py4JJavaError  
    from py4j.java_gateway import JavaObject  
    from py4j.java_collections import JavaArray, JavaList
    
    from pyspark import RDD, SparkContext  
    from pyspark.serializers import PickleSerializer, AutoBatchedSerializer
    
    # your dataframe what you'd estimate
    df
    
    # Helper function to convert python object to Java objects
    def _to_java_object_rdd(rdd):  
        """ Return a JavaRDD of Object by unpickling
        It will convert each Python object into Java object by Pyrolite, whenever the
        RDD is serialized in batch or not.
        """
        rdd = rdd._reserialize(AutoBatchedSerializer(PickleSerializer()))
        return rdd.ctx._jvm.org.apache.spark.mllib.api.python.SerDe.pythonToJava(rdd._jrdd, True)
    
    # First you have to convert it to an RDD 
    JavaObj = _to_java_object_rdd(df.rdd)
    
    # Now we can run the estimator
    sc._jvm.org.apache.spark.util.SizeEstimator.estimate(JavaObj)
    

    【讨论】:

    • 谢谢@MaxU ..有没有更短的方法可以做到这一点?我没有得到这个程序的大部分内容。
    • 嗨,对不起,我无法打开上面给出的链接。返回数据大小的单位是什么??
    • Documentation of SizeEstimator 表示,它计算每个执行程序上占用的对象的 JVM 堆大小。使用这种方法有什么注意事项吗?在运行它之前我需要持久化或缓存数据帧吗?我可以期望结果有多少差异。我在一个估计大小从 500 到 1400 MB 不等的大数据帧上运行它。
    【解决方案4】:

    下面呢?它以 KB 为单位,X100 以获得估计的实际大小。

    df.sample(fraction = 0.01).cache().count()
    

    【讨论】:

    • 这不是 KB,这将只返回行数
    • 不,它只是随机选择整个数据的 1% 数据。然后是它的行数
    【解决方案5】:

    您可以将数据帧保存在内存中,并以 df.count() 的形式执行操作。您可以在 spark web ui 的存储选项卡下检查大小。如果它适合您,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 2021-12-27
      • 2019-11-05
      • 1970-01-01
      相关资源
      最近更新 更多