Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.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
Python 如何让PySpark在内存不足之前将中间结果写入磁盘?_Python_Hadoop_Apache Spark_Pyspark - Fatal编程技术网

Python 如何让PySpark在内存不足之前将中间结果写入磁盘?

Python 如何让PySpark在内存不足之前将中间结果写入磁盘?,python,hadoop,apache-spark,pyspark,Python,Hadoop,Apache Spark,Pyspark,Background:在Hadoop流媒体中,每个reduce作业完成后都会写入hdfs,从而为Hadoop集群执行下一个reduce扫清了道路 我很难将这个范例映射到(Py)Spark 例如, df = spark.read.load('path') df.rdd.reduceByKey(my_func).toDF().write.save('output_path') 当我运行此命令时,集群会在将任何数据写入磁盘之前收集数据帧中的所有数据。至少在我观察工作进展的时候,事情看起来是这样的 我

Background:在Hadoop流媒体中,每个reduce作业完成后都会写入hdfs,从而为Hadoop集群执行下一个reduce扫清了道路

我很难将这个范例映射到(Py)Spark

例如,

df = spark.read.load('path')
df.rdd.reduceByKey(my_func).toDF().write.save('output_path')
当我运行此命令时,集群会在将任何数据写入磁盘之前收集数据帧中的所有数据。至少在我观察工作进展的时候,事情看起来是这样的

我的问题是,我的数据比我的集群内存大得多,所以在写入任何数据之前,我的内存就用完了。在Hadoop流式处理中,我们没有这个问题,因为输出数据被流式处理到磁盘,以便为后续的数据批处理腾出空间

我曾经考虑过这样的事情:

for i in range(100):
    (df.filter(df.loop_index==i)
        .rdd
        .reduceByKey(my_func)
        .toDF()
        .write.mode('append')
        .save('output_path'))
在每次迭代中,我只处理数据的一个子集。但这看起来很困难,主要是因为我要么必须持久化
df
,因为内存限制,这是不可能的,要么我必须在每次迭代中从输入hdfs源重新读取

使循环工作的一种方法是按天或其他数据子集对源文件夹进行分区。但是为了回答这个问题,让我们假设这是不可能的


问题:我如何在PySpark中运行这样的工作?我需要一个更大的集群吗?如果是这样,在处理数据之前调整集群大小的常见做法是什么

在大量分区中重新划分数据可能会有所帮助。下面的示例与for循环类似,不过您可能希望先尝试使用较少的分区

df = spark.read.load('path').repartition(100)

您还应该查看当前使用的执行器数量(
--num executors
)。减少这个数字还应该减少内存占用。

它可能有助于在大量分区中重新划分数据。下面的示例与for循环类似,不过您可能希望先尝试使用较少的分区

df = spark.read.load('path').repartition(100)

您还应该查看当前使用的执行器数量(
--num executors
)。减少这个数字也会减少内存占用。

您是否尝试将spark.rdd.compress设置为true?否,这会有帮助吗?除非让spark写入hdfs,否则这并不能解决我的问题。压缩rdd可能会使更多的数据适合内存,但这并不能解决我要问的根本问题。因为没有任何提示说明my_func的
my_func
有什么问题,所以很难说问题出在哪里。此外,如果需要良好的性能,在转换为
数据帧时,您应该始终提供
schema
。您是否尝试将spark.rdd.compress设置为true?否,这会有帮助吗?除非让spark写入hdfs,否则这并不能解决我的问题。压缩rdd可能会使更多的数据适合内存,但这并不能解决我要问的根本问题。因为没有任何提示说明my_func的
my_func
有什么问题,所以很难说问题出在哪里。此外,如果需要良好的性能,在转换为
数据帧
时,您应该始终提供
模式