Apache spark pyspark和spark之间的内存差异?
我一直在尝试使用PySpark作业,该作业使用一组二进制文件创建RDD,然后使用Apache spark pyspark和spark之间的内存差异?,apache-spark,pyspark,rdd,Apache Spark,Pyspark,Rdd,我一直在尝试使用PySpark作业,该作业使用一组二进制文件创建RDD,然后使用flatMap操作将二进制数据处理成一组行。这导致了一系列内存不足错误,在使用内存设置一段时间后,我决定使用最简单的方法,即计算RDD中的文件数 这也会因OOM错误而失败。因此,我打开了spark shell和PySpark,并使用默认设置在REPL/shell中运行命令,唯一的附加参数是--master warn。spark shell版本运行正常,而PySpark版本显示相同的错误 运行Pypark的开销有那么大
flatMap
操作将二进制数据处理成一组行。这导致了一系列内存不足错误,在使用内存设置一段时间后,我决定使用最简单的方法,即计算RDD中的文件数
这也会因OOM错误而失败。因此,我打开了spark shell和PySpark,并使用默认设置在REPL/shell中运行命令,唯一的附加参数是--master warn。
spark shell版本运行正常,而PySpark版本显示相同的错误
运行Pypark的开销有那么大吗?或者这是新的二进制文件的问题?我使用的是Spark版本2.2.0.2.6.4.0-91 区别:
- Scala将以
PortableDataStream
的形式加载记录-这意味着进程是惰性的,除非您对值调用toArray
,否则根本不会加载数据
- Python将调用Java后端,但将数据作为字节数组加载。这一部分将很难实现,因此双方都可能失败
此外,PySpark将使用至少两倍于Java和Python副本的内存
最后,binaryFiles
(与wholeTextFiles
相同)效率非常低,如果单个输入文件很大,则执行效果不佳。在这种情况下,最好实现特定于格式的Hadoop输入格式。区别:
- Scala将以
PortableDataStream
的形式加载记录-这意味着进程是惰性的,除非您对值调用toArray
,否则根本不会加载数据
- Python将调用Java后端,但将数据作为字节数组加载。这一部分将很难实现,因此双方都可能失败
此外,PySpark将使用至少两倍于Java和Python副本的内存
最后,binaryFiles
(与wholeTextFiles
相同)效率非常低,如果单个输入文件很大,则执行效果不佳。在这种情况下,最好实现特定于格式的Hadoop输入格式。因为您使用binaryFiles()读取多个二进制文件并启动Spark 2.1,所以binaryFiles()的minPartitions参数被忽略
1.尝试根据以下内容重新划分输入文件:
在此处输入代码
rdd=sc.binaryFiles(二进制文件的路径,minPartitions=).repartition()
2.根据您的数据大小,您可以尝试使用下面的配置将分区大小减少到64MB或更小
spark.files.maxPartitionBytes, default 128 MB
spark.files.openCostInBytes, default 4 MB
spark.default.parallelism
由于使用binaryFiles()读取多个二进制文件并启动Spark 2.1,因此将忽略binaryFiles()的minPartitions参数
1.尝试根据以下内容重新划分输入文件:
在此处输入代码
rdd=sc.binaryFiles(二进制文件的路径,minPartitions=).repartition()
2.根据您的数据大小,您可以尝试使用下面的配置将分区大小减少到64MB或更小
spark.files.maxPartitionBytes, default 128 MB
spark.files.openCostInBytes, default 4 MB
spark.default.parallelism
另一个数据点是,如果我在PySpark中以textFile
而不是binaryFiles
的形式加载数据,我在运行count()
时似乎不会出现内存不足错误,但是速度非常慢。请不要将注释空间用于此类附加信息-改为编辑和更新您的帖子!另一个数据点是,如果我在PySpark中以textFile
而不是binaryFiles
的形式加载数据,我在运行count()
时似乎不会出现内存不足错误,但是速度非常慢。请不要将注释空间用于此类附加信息-改为编辑和更新您的帖子!