捕获Spark中驱动程序上Dataset foreachPartition()函数中引发的异常?

时间:2018-07-27 15:42:58

标签: java apache-spark exception driver apache-spark-dataset

我正在尝试寻找一种方法来捕获Spark在其驱动程序的foreachPartition()方法内引发的异常。在数据集上使用foreachPartition()时,我传递了在各个工作程序上执行的lambda函数。此过程可能会引发异常。但是我无法找到一种在驱动程序上捕获此异常的方法。看来这是设计使然。有什么办法可以改变吗?这是我目前正在做的一个例子:

let supported = CSS.supports && CSS.supports('-webkit-background-clip', 'text');

如果编译器很重要,我还将使用Eclipse Oxygen IDE。

2 个答案:

答案 0 :(得分:1)

在这种情况下,尽管spark作业已经失败,但是foreachPartition将引发异常,因此您可以将该调用包装在try-catch中,并像其他任何异常一样进行处理。为了避免作业失败,您必须在methodCanThrowException中处理异常。

答案 1 :(得分:0)

我认为您的处理方式可能有所不同,但是Spark分区DS的典型执行将通过以下步骤完成:

  1. 创建数据集==>这已经通过getSomeData()函数完成。

  2. 使用数据集遍历分区。foreachPartition()==>请记住,此函数不会给您单个记录,它会为您提供整个分区,根据您在getSomeData( )。

  3. 通过partition.forEachRemaining()进行下一级别的迭代,以由执行者获得单个记录并运行适当的业务逻辑。

运行#3步骤时,应在此处向每条记录传递methodCanThrowException(),就像在Java中一样-

partition.forEachRemaining(record -> {
      try {
        methodCanThrowException(record);
      } catch (Exception e){
        e.printStackTrace();
        Logger.info(<record-key> "etc for debugging or tracking");
      }
);

显然,您可以通过多种方式处理异常,以写入审核文件以进行更正等。但是,由于处理方法中的异常,您的处理不会失败。