Spark中“不允许自我抑制”的主要原因是什么?

时间:2017-06-12 02:24:36

标签: apache-spark hdfs

当spark使用saveAsTextFile将大文件写入HDFS时,我收到错误:java.lang.IllegalArgumentException: Self-suppression not permitted at java.lang.Throwable.addSuppressed(Throwable.java:1043) Caused by: java.io.IOException: All datanodes DatanodeInfoWithStorage

我已经找到了解决方法,但我找不到合适的解决方案而且我不知道为什么。

导致这些错误的原因是什么,我该如何解决?

2 个答案:

答案 0 :(得分:3)

错误self-suppression not permitted不是此处的实际错误。

当运行时尝试从代码中抛出多个THROWABLE实例时,JVM会抛出此错误。

为此,JDK-7向Throwable引入了“suppressExceptions”以抑制先前的异常并保留最近的异常。

所以Java尝试 - throwable.addSuppressed(throwable) - 这是无效的,Throwable实例本身会抛出IllegalArgumentException,真正的异常会以这种方式丢失。

从log Caused by: java.io.IOException: All datanodes DatanodeInfoWithStorag开始,似乎datanode存在一些问题。

如果查看集群中正在运行的服务,并检查所有datanode和守护程序是否正常运行;事情可能会进入轨道。

问题可能是:

  1. datanode中的问题。重启群集守护进程。
  2. datanode和namenode之间的心跳:网络问题或权限访问问题。
  3. datanode的内存问题。
  4. Datanode忙或无响应

答案 1 :(得分:0)

如果您查看 Throwable 的文档,您会发现一些有关 addSuppressed 方法的有用信息。具体来说,如果您有一个 exception e,并且您执行了 e.addSuppressed(e),那么将生成一个新的 IllegalArgumentException 异常。此异常将显示为

java.lang.IllegalArgumentException: Self-suppression not permitted

当然,不会显示原始异常 e 的任何内容。

以下是调用 addSuppressed 时可能抛出的错误:

<块引用>

抛出: IllegalArgumentException - 如果异常是可以抛出的; throwable 无法抑制自身。 NullPointerException - 如果异常为空