我是spark的初学者,通常在某些执行中会出现java.lang.OutOfMemoryError: Java heap space is raise:
java.lang.OutOfMemoryError: Java heap space at java.base/java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:61)
java.base/java.nio.ByteBuffer.allocate(ByteBuffer.java:348)
org.apache.parquet.bytes.HeapByteBufferAllocator.allocate(HeapByteBufferAllocator.java:32)
org.apache.parquet.hadoop.ParquetFileReader$ConsecutivePartList.readAll(ParquetFileReader.java:1696)
org.apache.parquet.hadoop.ParquetFileReader.readNextRowGroup(ParquetFileReader.java:925)
org.apache.parquet.hadoop.ParquetFileReader.readNextFilteredRowGroup(ParquetFileReader.java:956)
org.apache.parquet.hadoop.InternalParquetRecordReader.checkRead(InternalParquetRecordReader.java:126)
org.apache.parquet.hadoop.InternalParquetRecordReader.nextKeyValue(InternalParquetRecordReader.java:225)
org.apache.parquet.hadoop.ParquetRecordReader.nextKeyValue(ParquetRecordReader.java:207)
org.apache.spark.sql.execution.datasources.RecordReaderIterator.hasNext(RecordReaderIterator.scala:39)
org.apache.spark.sql.execution.datasources.RecordReaderIterator$$anon$1.hasNext(RecordReaderIterator.scala:61)
我已经查找了可能由于缺少
--driver-memory
和 --executor-memory
参数而导致的原因,该 Spark 托管在 docker 容器中,并且 pyspark 脚本使用 Spark-submit 运行:
docker exec -it pyspark_container \
/usr/local/lib/python3.10/dist-packages/pyspark/bin/spark-submit \
/spark_files/mapping.py;
我的电脑规格:
8核 30GB 内存 1.2TB 固态硬盘
我想知道是否可能,以及增加这些参数是否有意义,因为我不在集群中,以及如何进行分配计算。
非常感谢您的帮助
由于您在
--master
命令中没有使用 spark-submit
参数,因此您正在本地模式下使用 Spark。这意味着所有驱动程序和执行程序进程都发生在同一台机器上。
在这种情况下,不使用
--executor-memory
参数。正是 --driver-memory
参数使您的本地集群拥有更多内存。
由于我们不知道您的数据是什么样的,因此很难说在这里选择合适的大小。
--driver-memory
的默认值为1g。由于您的机器上有 30G RAM,因此您可以增加此内存。
尝试类似:
docker exec -it pyspark_container \
/usr/local/lib/python3.10/dist-packages/pyspark/bin/spark-submit \
--driver-memory Xg \
/spark_files/mapping.py;
其中
X
是对您的数据有意义的数字。如果您拥有整台机器,您可以尝试使用一大块可用内存,例如--driver-memory 25g
。