Apache spark java.lang.OutOfMemoryError:使用Docker的java堆空间

Apache spark java.lang.OutOfMemoryError:使用Docker的java堆空间,apache-spark,docker-compose,spark-submit,Apache Spark,Docker Compose,Spark Submit,因此,我在本地(独立)运行以下程序: 我得到了以下错误: java.lang.OutOfMemoryError: Java heap space 为了跨越这一点,我运行以下程序: ~/spark-2.1.0-bin-hadoop2.7/bin/spark-submit --driver-memory 6G --executor-memory 1G --py-files afile.py run_script.py docker-compose up docker exec app_maste

因此,我在本地(独立)运行以下程序:

我得到了以下错误:

java.lang.OutOfMemoryError: Java heap space
为了跨越这一点,我运行以下程序:

~/spark-2.1.0-bin-hadoop2.7/bin/spark-submit --driver-memory 6G --executor-memory 1G --py-files afile.py run_script.py
docker-compose up
docker exec app_master_1 bin/spark-submit --driver-memory 6G --executor-memory 1G --py-files afile.py run_script.py
脚本运行正常

现在,我使用以下命令并运行以下命令:

~/spark-2.1.0-bin-hadoop2.7/bin/spark-submit --driver-memory 6G --executor-memory 1G --py-files afile.py run_script.py
docker-compose up
docker exec app_master_1 bin/spark-submit --driver-memory 6G --executor-memory 1G --py-files afile.py run_script.py
在这种情况下,我仍然会得到以下错误:

2018-06-13 21:43:16 WARN  TaskSetManager:66 - Lost task 0.0 in stage 3.0 (TID 9, 172.17.0.3, executor 0): java.lang.OutOfMemoryError: Java heap space
at org.apache.spark.sql.catalyst.expressions.codegen.BufferHolder.grow(BufferHolder.java:77)
at org.apache.spark.sql.catalyst.expressions.codegen.UnsafeRowWriter.write(UnsafeRowWriter.java:219)
at org.apache.spark.sql.execution.datasources.text.TextFileFormat$$anonfun$readToUnsafeMem$1$$anonfun$apply$4.apply(TextFileFormat.scala:143)
at org.apache.spark.sql.execution.datasources.text.TextFileFormat$$anonfun$readToUnsafeMem$1$$anonfun$apply$4.apply(TextFileFormat.scala:140)
at scala.collection.Iterator$$anon$11.next(Iterator.scala:409)
at scala.collection.Iterator$$anon$11.next(Iterator.scala:409)
at org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.next(FileScanRDD.scala:109)
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.processNext(Unknown Source)
at org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43)
at org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$10$$anon$1.hasNext(WholeStageCodegenExec.scala:614)
at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:408)
at scala.collection.Iterator$$anon$12.hasNext(Iterator.scala:439)
at scala.collection.Iterator$class.foreach(Iterator.scala:893)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1336)
at scala.collection.TraversableOnce$class.foldLeft(TraversableOnce.scala:157)
at scala.collection.AbstractIterator.foldLeft(Iterator.scala:1336)
at scala.collection.TraversableOnce$class.fold(TraversableOnce.scala:212)
at scala.collection.AbstractIterator.fold(Iterator.scala:1336)
at org.apache.spark.rdd.RDD$$anonfun$fold$1$$anonfun$19.apply(RDD.scala:1090)
at org.apache.spark.rdd.RDD$$anonfun$fold$1$$anonfun$19.apply(RDD.scala:1090)
at org.apache.spark.SparkContext$$anonfun$33.apply(SparkContext.scala:2123)
at org.apache.spark.SparkContext$$anonfun$33.apply(SparkContext.scala:2123)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
at org.apache.spark.scheduler.Task.run(Task.scala:109)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:345)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
后来的某个地方:

2018-06-13 21:43:17 ERROR TaskSchedulerImpl:70 - Lost executor 0 on 172.17.0.3: Remote RPC client disassociated. Likely due to containers exceeding thresholds, or network issues. Check driver logs for WARN messages
就我所知,即使它写的是executor 0内存不足,我也必须增加驱动程序内存作为独立的,对吗

你知道为什么会发生这种情况,以及如何跨越它吗

编辑


当我试图在文件不够大的地方使用
sqlCont.read.json(json_path)
时,出现了错误。

正如您所看到的,工作节点在docker脚本中使用1GB内存初始化,您使用1GB内存为executor执行spark submit命令,因此,在创建docker容器时,要么减少executor内存,要么增加worker内存。

能否共享完整的stacktrace?你有多个集装箱吗?你从哪里得到这个错误?@Kaushal我已经更新了一点答案。我只是使用docker组合的链接来创建两个容器:一个主容器和一个工作容器。我认为这是不对的。SPARK_WORKER_MEMORY为WORKER JVM定义了-Xmx,执行器JVM单独旋转,它们的Xmx由
--executor MEMORY
控制,如OP post中所述。SPARK_WORKER_MEMORY在此处指定docker容器内存,而不是JVM。Executor JVM在工作容器中运行,因此,无论如何,如果您增加了
--Executor内存
,它不会产生影响,因为容器本身内存较少