【发布时间】:2017-01-14 18:31:36
【问题描述】:
SparkStreaming 上下文从 RabbitMQ 以 30 秒的间隔读取流。我想修改 cassandra 中存在的相应行的几列的值,然后想将数据存储回Cassandra。为此,我需要检查特定主键的行是否存在于 Cassandra 中,如果是,请获取它并执行必要的操作。但问题是,我在驱动程序上创建了StreamingContext,并在 Worker 上执行了操作。因此,他们无法获得 StreamingContext 对象,原因是它没有被序列化并发送给工作人员,我收到了这个错误:
java.io.NotSerializableException: org.apache.spark.streaming.StreamingContext。我也知道我们无法访问 foreachRDD 中的StreamingContext。但是,我如何在这里实现相同的功能而不会出现序列化错误?
我看过几个例子here,但没有帮助。
这里是sn-p的代码:
val ssc = new StreamingContext(sparkConf,30)
val receiverStream = RabbitMQUtils.createStream(ssc, rabbitParams)
receiverStream.start()
val lines = receiverStream.map(EventData.fromString(_))
lines.foreachRDD{ x => if (x.toLocalIterator.nonEmpty) {
x.foreachPartition { it => for (tuple <- it) {
val cookieid = tuple.cookieid
val sessionid = tuple.sessionid
val logdate = tuple.logdate
val EventRows = ssc.cassandraTable("SparkTest", CassandraTable).select("*")
.where("cookieid = '" + cookieid + "' and logdate = '" + logdate+ "' and sessionid = '" + sessionid + "')
Somelogic Whether row exist or not for Cookieid
} } }
【问题讨论】:
-
@eliasah 我无法在
lines.foreachRDD内访问StreamingContext,无论您在外部还是内部声明StreamingContext。你为什么把它标记为关闭?它没有解决我的问题,仅供参考,它不是您提供的链接的副本。 -
从
x.sparkContext()获取火花上下文,不要从forEachMethod调用
标签: apache-spark serialization cassandra spark-streaming