我正在实现一个Spark Streaming + ML应用程序。数据以json格式出现在Kafka主题中。 Spark Kafka连接器从Kafka主题读取数据为DStream。经过几个预处理步骤后,将输入DStream转换为功能DStream,并将其输入到Spark ML管道模型中。该代码示例说明了DStream功能如何与管道模型进行交互。
prediction_stream = feature_stream.transform(lambda rdd: predict_rdd(rdd, pipeline_model)
def predict_rdd(rdd, pipeline_model):
if(rdd is not None) and (not rdd.isEmpty()):
try:
df = rdd.toDF()
predictions = pipeline_model.transform(df)
return predictions.rdd
except Exception as e:
print("Unable to make predictions")
return None
else:
return None
问题来了。如果pipeline_model.transform(df)由于df的某些行中的某些数据问题而失败,则try ... except块将无法捕获该异常,因为该异常是在执行程序中引发的。结果,异常会冒泡到Spark并终止流应用程序。
我希望以某种方式捕获异常,以使流应用程序不会终止并继续处理传入的数据。有可能吗?
我知道一种解决方案可能是在预处理步骤中进行更彻底的数据验证。但是,为防止意外情况发生,应对管道模型的转换方法进行某种错误处理。