我正在尝试寻找一种方法来捕获Spark在其驱动程序的foreachPartition()方法内引发的异常。在数据集上使用foreachPartition()时,我传递了在各个工作程序上执行的lambda函数。此过程可能会引发异常。但是我无法找到一种在驱动程序上捕获此异常的方法。看来这是设计使然。有什么办法可以改变吗?这是我目前正在做的一个例子:
let supported = CSS.supports && CSS.supports('-webkit-background-clip', 'text');
如果编译器很重要,我还将使用Eclipse Oxygen IDE。
答案 0 :(得分:1)
在这种情况下,尽管spark作业已经失败,但是foreachPartition将引发异常,因此您可以将该调用包装在try-catch中,并像其他任何异常一样进行处理。为了避免作业失败,您必须在methodCanThrowException中处理异常。
答案 1 :(得分:0)
我认为您的处理方式可能有所不同,但是Spark分区DS的典型执行将通过以下步骤完成:
创建数据集==>这已经通过getSomeData()函数完成。
使用数据集遍历分区。foreachPartition()==>请记住,此函数不会给您单个记录,它会为您提供整个分区,根据您在getSomeData( )。
通过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");
}
);
显然,您可以通过多种方式处理异常,以写入审核文件以进行更正等。但是,由于处理方法中的异常,您的处理不会失败。