我的工作环境如下: spark = 2.0.0
, hdp = 2.5.3.0
, python = 2.7
, yarn-client
我的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)
感谢您的帮助:)
1条答案
按热度按时间b5buobof1#
使用时
cache()
在rdd/Dataframe上,为其分配的内存cached RDD
从执行器内存中获取。i、 e.如果执行器内存为8gb,则
cached RDD
如果是3gb,执行器将只有5gb的ram(而不是8gb),这可能会导致buffer overflow
你面临的问题。我猜增加为每个执行器分配的ram和/或增加执行器的数量(通常与增加分区的数量一起)可能会导致
buffer overflow
错误消失。spark体系结构中内存管理部分的简短引用:
执行存储器
存储任务执行期间所需的数据
洗牌相关数据
存储存储器
缓存RDD和广播变量的存储
可以从执行内存借用(否则溢出)
当缓存块对逐出免疫时,保护值为spark内存的50%