Glu*_*luz 3 apache-spark pyspark
我正在使用用python编写的UDF来更改数字的基数。
因此,我读取了一个实木复合地板文件并写入了一个实木复合地板文件并应用了UDF。这是我运行的行:
input_df.withColumn("origin_base", convert_2_dest_base(input_df.origin_base)).write.mode('overwrite').parquet(destination_path)
Run Code Online (Sandbox Code Playgroud)
这种转换使火花可以利用大量内存,并且我得到以下警告:
18年6月17日08:05:39警告TaskSetManager:在阶段4.0(TID 183,ip-10-100-5-196.ec2.internal,executor 19)中丢失任务40.0:ExecutorLostFailure(executor 19退出是由以下一项引起的)原因:正在运行的容器因超出内存限制而被YARN杀死。4.4 GB使用的4.4 GB物理内存。考虑提高spark.yarn.executor.memoryOverhead。
最终失败了。
UDF不是正确的方法吗?为什么要消耗这么多内存?
对于pyspark,数据在Python中处理,并在JVM中进行缓存/混洗。如果您使用内置的Python API,则Scala的性能不会有太大差异。查看python vs scala性能
使用udf时,由于本地定义的函数未在本地JVM结构中注册,因此无法通过简单的Java API调用实现,因此必须将其序列化/反序列化为Python worker。然后,数据将在Python worker中处理并序列化/反序列化回JVM。
Python工作者现在需要处理堆外内存中的序列化数据,它消耗大量的堆外内存,因此通常会导致memoryOverhead。
在性能方面,序列化速度很慢,并且通常是性能调整的关键。
归档时间: |
|
查看次数: |
1575 次 |
最近记录: |