在本地使用pyspark处理大型文件

时间:2019-03-16 13:26:14

标签: python apache-spark pyspark

我是PySpark的新手,只能用它来处理数据。

我有一个120GB的文件,其中包含超过10.5亿行。我可以对文件进行聚合和过滤,并可以通过coalesce()函数将结果输出到CSV文件中。

我的挑战是,当我尝试读取文件中的每一行以执行一些计算时,使用.collect()或.toLocalIterator()函数时,我的spark作业都会失败。当我限制读取的行数时,它可以正常工作。

请,我该如何解决这一挑战?是否有可能以位为单位读取行一次一行还是一次大块?

我在64GB RAM计算机上本地运行Spark。

下面是我的python代码的示例,可以工作:

sql = "select * from table limit 1000"
details = sparkSession.sql(sql).collect()
for detail in details:
    #do some computation

以下是失败的我的python代码示例:

sql = "select * from table"
details = sparkSession.sql(sql).collect()
for detail in details:
    #do some computation

这是我提交我的火花工作的方式

spark-submit --driver-memory 16G --executor-memory 16G python_file.py

非常感谢。

1 个答案:

答案 0 :(得分:0)

您对问题的处理方法是错误的。 collect方法会将完整文件(由于反序列化而实际上可能占用超过120GB)加载到驱动程序内存(单个pyspark进程)中,导致内存不足。
根据经验,如果您在Spark代码中使用collect()方法,效果不好,应该进行更改。

如果使用得当,spark一次将仅读取部分输入数据(输入拆分)以进行处理,并产生(小得多的)中间结果存储在执行程序存储器中。因此,它(取决于处理的类型)可以处理120GB的文件和16GB的内存。