AWS SNS SDK 不适用于 Spark Streaming

AWS SNS SDK not work on spark streaming

我通过火花流应用实时异常检测系统。 在每个流式传输间隔中,如果数据点异常,AWS SNS 会发送一封电子邮件给订阅账户。 但是 AWS SNS java sdk 好像不能在 spark streaming 中工作。下面是错误信息


错误 StreamingContext:启动上下文时出错,将其标记为已停止 java.io.NotSerializableException: DStream 检查点已启用,但 DStream 及其函数不可序列化 com.amazonaws.services.sns.AmazonSNSClient 序列化堆栈: - 对象不可序列化(class:com.amazonaws.services.sns.AmazonSNSClient,值:com.amazonaws.services.sns.AmazonSNSClient@a99e813) - 字段(class:wordCount$$anonfun$main$2,名称:snsClient$1,类型:class com.amazonaws.services.sns.AmazonSNSClient) - 对象 (class wordCount$$anonfun$main$2, ) - 字段(class:org.apache.spark.streaming.dstream.DStream$$anonfun$foreachRDD$1$$anonfun$apply$mcV$sp$3,名称:cleanedF$1,类型:接口 scala.Function1) - 对象(class org.apache.spark.streaming.dstream.DStream$$anonfun$foreachRDD$1$$anonfun$apply$mcV$sp$3, ) - 写入对象数据(class:org.apache.spark.streaming.dstream.DStream) - 对象 (class org.apache.spark.streaming.dstream.ForEachDStream, org.apache.spark.streaming.dstream.ForEachDStream@5b56679b) - 写入对象数据(class: org.apache.spark.streaming.dstream.DStreamCheckpointData) - 对象(class org.apache.spark.streaming.dstream.DStream检查点数据,[ 0 个检查点文件


有没有人知道如何解决它..或者有其他解决方案来在 spark streaming 中发送电子邮件

非常感谢

错误是 AmazonSNSClient 实例不可序列化。这可能意味着您已经在转换之外实例化它并在转换内部使用它。这将导致 spark 对其进行序列化。

使用 non-streaming spark,您可以尝试在 RDD 上的 mapPartitions 函数内实例化您的 AmazonSNSClient,或者等效于 spark 流。快速浏览流式文档有一个部分可能对您有用,它似乎涵盖了围绕 efficiently creating connections to databases、外部系统等的类似内容。

重点是你需要在worker上实例化你的客户端,而不是driver,然后将它发送给worker(这需要实例是可序列化的)。