我正在使用以下环境:spark = 2.0.0
,hdp = 2.5.3.0
,python = 2.7
, yarn 客户端
我的 PySpark 代码大部分时间都运行良好。
但是有时我在 df.count()
函数
适合我的代码:
df= spark.read.orc("${path}")
df.count()
出现异常的代码:
df= spark.read.orc("${path}")
df = df.cache()
df.count()
堆栈跟踪:
Job aborted due to stage failure: Task 0 in stage 4.0 failed 4 times, most recent failure: Lost task 0.3 in stage 4.0 (TID 9, apii): java.nio.BufferOverflowException +details
Job aborted due to stage failure: Task 0 in stage 4.0 failed 4 times, most recent failure: Lost task 0.3 in stage 4.0 (TID 9, apii): java.nio.BufferOverflowException
at java.nio.Buffer.nextPutIndex(Buffer.java:521)
at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:169)
at org.apache.spark.sql.execution.columnar.BOOLEAN$.append(ColumnType.scala:286)
at org.apache.spark.sql.execution.columnar.compression.RunLengthEncoding$Encoder.compress(compressionSchemes.scala:143)
at org.apache.spark.sql.execution.columnar.compression.CompressibleColumnBuilder$class.build(CompressibleColumnBuilder.scala:103)
at org.apache.spark.sql.execution.columnar.NativeColumnBuilder.build(ColumnBuilder.scala:97)
感谢任何帮助:)
最佳答案
当在 RDD/dataframe 上使用 cache()
时,分配给 cached RDD
的内存是从执行器内存中获取的。
即如果执行器内存为 8GB,而 缓存的 RDD
的大小为 3GB,则执行器将只有 5GB 的 RAM(而不是 8GB),这可能会导致 缓冲区溢出
您面临的问题。
我猜想增加分配给每个执行程序的 RAM 和/或增加执行程序的数量(通常同时增加分区数量)可能会导致 缓冲区溢出
错误消失。
spark-architecture 中内存管理 部分的简短引用:
执行内存
- 存储任务执行期间所需的数据
- 洗牌相关数据
存储内存
- 缓存 RDD 和广播变量的存储
- 可能从执行内存中借用(否则溢出)
- 当缓存 block 不受驱逐时,保护值是 Spark 内存的 50%
关于hadoop - 在 pyspark 数据帧计数函数中得到 `java.nio.BufferOverflowException`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41742280/