当前位置: 首页 > 知识库问答 >
问题:

Java Spark collect()JavaDD失败,内存错误(EMR集群)

梁俊智
2023-03-14

下面是我的代码:

JavaRDD<WebLabPurchasesDataObject> allRecords = context.textFile(inputFile).map (
        data -> {
            String[] fields = data.split(",", -1);

            String hitDay = fields[0];
            String treatmentName = fields[1];
            String sessionId = fields[2];

            return new WebLabPurchasesDataObject(hitDay,treatmentName,sessionId);   
        });

allRecords.cache();

List<WebLabPurchasesDataObject> webLabRddAllRecordsList = allRecords.collect();

每次尝试运行此代码时,我都会得到Java.lang.OutofMemoryError:Java堆空间。据我所知,Spark正在我的主节点上执行collect()操作。那么有没有什么方法可以增加内存,使它能够运行程序呢?

18/03/15 16:35:48 WARN scheduler.TaskSetManager: Lost task 1.0 in stage 2.0 (TID 5, ip-1443-405-18-1544.us-west-2.compute.internal): java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3236)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1877)
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1786)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1189)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at org.apache.spark.serializer.JavaSerializationStream.writeObject(JavaSerializer.scala:44)
at org.apache.spark.serializer.JavaSerializerInstance.serialize(JavaSerializer.scala:80)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:213)
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:745)    18/03/15 16:35:49 ERROR cluster.YarnScheduler: Lost executor 1 on ip-43ew55-154.us-west-2.compute.internal: remote Akka client disassociated

共有1个答案

狄飞尘
2023-03-14

正如您所知道的,由于结果是在驱动程序上收集的,您需要增加驱动程序内存。默认值是1GB,这对您的情况来说是不够的。

在创建sparksession/sparkcontext:spark.driver.memory添加此配置,其值更大:2g3g。如果您正在使用spark-shell,那么在启动spark-shell时将此作为附加选项传递:--driver-memory 3g,用于3GB内存。

我还建议您阅读更多关于这里描述的配置的信息:https://spark.apache.org/docs/latest/configuration.html

 类似资料:
  • 我正在尝试使用id字段在我的碎片集合中查找重复项,这是这种模式- 我使用了下面的查询,但收到了“异常:超出$group的内存限制,但不允许外部排序。通过allowDiskUse:true选择加入。”错误,尽管我在查询中使用了“allowDiskUse:true”。 有没有其他方法可以得到我想要的,或者我应该在上面的查询中传递其他东西?谢谢。

  • 我正在用java开发一个程序,该程序使用opencv库获取一个图像文件夹并裁剪人脸。它使用了OpenCV中的人脸识别。我使用了它,但当我尝试使用更大的图像文件夹时,它会出现以下错误: OpenCV错误:Cv::OutOfMemoryError中内存不足(无法分配411068928字节),文件C:\builds\master_packslaveAddon-Win32-VC12-static\Open

  • 问题内容: 节点版本为 崩溃期间的内存使用情况未超出 产生此错误的代码: 要检查是否存在递归堆栈大小问题,我使用–stack-size = 60000参数运行了下一个代码 并得到了 然后,我运行了导致严重错误的代码:CALL_AND_RETRY_LAST分配失败-使用相同的–stack-size = 60000参数处理内存不足,并且没有得到。 因此,我得出结论与递归堆栈大小没有共同之处。 我该如何

  • <---JS StackTrace---> =====JS栈迹=================================================================== 安全上下文:0369632D1:create(This=036856A9)2:_Walk[034841A1:~764][PC=1CCAED1F](This=3A11A619,Visitor=3BCEFD

  • 我遇到了从一个火花运行的AWS EMR集群连接到另一个立即运行的AWS EMR集群的问题。 用python编写的代码是: 通过aws

  • 节点版本为 根据在崩溃期间内存使用率不会超过 再现此错误的代码: 为了检查是否存在递归堆栈大小问题,我使用-stack-size=60000参数运行了下一段代码 并且得到了 然后我运行的代码给出了一个致命的错误:CALL_AND_RETRY_LAST Allocation失败-进程内存不足,具有相同的-stack-size=60000参数,并且没有。 因此我得出结论与递归堆栈大小没有共同之处。 我