2015-05-13 45 views
12

我有一个火花流上下文从卡夫卡读取事件数据,间隔10秒。我想用postgres表中现有的数据来补充这个事件数据。火花流多个来源,重新加载数据帧

我可以加载Postgres的表是这样的:

val sqlContext = new SQLContext(sc) 
val data = sqlContext.load("jdbc", Map(
    "url" -> url, 
    "dbtable" -> query)) 

...

val broadcasted = sc.broadcast(data.collect()) 

后来我能过去是这样的:

val db = sc.parallelize(data.value) 
val dataset = stream_data.transform{ rdd => rdd.leftOuterJoin(db)} 

我想保持当前的数据流运行,并且每隔6小时仍然重新载入此表。由于目前apache的火花不支持多个运行上下文,我怎么能做到这一点?有什么解决方法吗?或者我每次需要重新加载数据时都需要重新启动服务器?这似乎是这样一个简单的用例...:/

+0

我也在寻找答案,你有没有成功,@ user838681? –

+0

当你重新载入postgres表时,你是否关心过去的kafka事件,或者你是否试图从postgres发生的最新重载时间加入新的kafka数据? –

+0

@HamelKothari 无需更新或重新处理过去的卡夫卡活动。当我更新SQL表时,我只是想将它用于来自Kafka的任何未来事件。 –

回答

1

在我的愚见,在DStreams转换过程中重新加载另一个数据源是不推荐的设计。

相比传统stateful流处理模型,d流被设计为构造一个流计算为一系列stateless,小的时间间隔deterministic批次计算。

DStreams上的转换是确定性的,这种设计使得通过重新计算可以快速从故障中恢复。清爽会对恢复/重新计算带来副作用。

一种解决方法是推迟查询以输出操作,例如:foreachRDD(func)