You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@spark.apache.org by "Bruce Robbins (Jira)" <ji...@apache.org> on 2022/09/12 00:31:00 UTC
[jira] [Created] (SPARK-40403) Negative size in error message when unsafe array is too big
Bruce Robbins created SPARK-40403:
-------------------------------------
Summary: Negative size in error message when unsafe array is too big
Key: SPARK-40403
URL: https://issues.apache.org/jira/browse/SPARK-40403
Project: Spark
Issue Type: Bug
Components: SQL
Affects Versions: 3.4.0
Reporter: Bruce Robbins
When initializing an overly large unsafe array via {{UnsafeArrayWriter#initialize}}, {{BufferHolder#grow}} may report an error message with a negative size, e.g.:
{noformat}
java.lang.IllegalArgumentException: Cannot grow BufferHolder by size -2115263656 because the size is negative
{noformat}
(Note: This is not related to SPARK-39608, as far as I can tell, despite having the same symptom).
When calculating the initial size in bytes needed for the array, {{UnsafeArrayWriter#initialize}} uses an int expression, which can overflow. The initialize method then passes the negative size to {{BufferHolder#grow}}, which complains about the negative size.
Example (the following will run just fine on a 16GB laptop, despite the large driver size setting):
{noformat}
bin/spark-sql --driver-memory 22g --master "local[1]"
create or replace temp view data1 as
select 0 as key, id as val
from range(0, 268271216);
create or replace temp view data2 as
select key as lkey, collect_list(val) as bigarray
from data1
group by key;
-- the below cache forces Spark to create unsafe rows
cache lazy table data2;
select count(*) from data2;
{noformat}
After a few minutes, {{UnsafeArrayWriter#initialize}} will throw the following exception:
{noformat}
java.lang.IllegalArgumentException: Cannot grow BufferHolder by size -2115263656 because the size is negative
at org.apache.spark.sql.catalyst.expressions.codegen.BufferHolder.grow(BufferHolder.java:67)
at org.apache.spark.sql.catalyst.expressions.codegen.UnsafeArrayWriter.initialize(UnsafeArrayWriter.java:61)
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$SpecificUnsafeProjection.apply(Unknown Source)
at org.apache.spark.sql.catalyst.expressions.aggregate.Collect.serialize(collect.scala:73)
at org.apache.spark.sql.catalyst.expressions.aggregate.Collect.serialize(collect.scala:37)
{noformat}
This query was going to fail anyway, but the message makes it looks like a bug in Spark rather than a user problem. {{UnsafeArrayWriter#initialize}} should calculate using a long expression and fail if the size exceeds {{Integer.MAX_VALUE}}, showing the actual initial size in the error message.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@spark.apache.org
For additional commands, e-mail: issues-help@spark.apache.org