在pyspark dataframe count函数中得到'java.nio.bufferoverflowexception'

uwopmtnx  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(415)

我的工作环境如下: 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)

感谢您的帮助:)

b5buobof

b5buobof1#

使用时 cache() 在rdd/Dataframe上,为其分配的内存 cached RDD 从执行器内存中获取。
i、 e.如果执行器内存为8gb,则 cached RDD 如果是3gb,执行器将只有5gb的ram(而不是8gb),这可能会导致 buffer overflow 你面临的问题。
我猜增加为每个执行器分配的ram和/或增加执行器的数量(通常与增加分区的数量一起)可能会导致 buffer overflow 错误消失。
spark体系结构中内存管理部分的简短引用:
执行存储器
存储任务执行期间所需的数据
洗牌相关数据
存储存储器
缓存RDD和广播变量的存储
可以从执行内存借用(否则溢出)
当缓存块对逐出免疫时,保护值为spark内存的50%

相关问题