【问题标题】:Spark streaming multiple sources, reload dataframeSpark流式传输多个源,重新加载数据帧
【发布时间】:2015-07-24 19:46:21
【问题描述】:

我有一个 spark 流上下文,每隔 10 秒从 kafka 读取事件数据。我想用 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 spark 目前不支持多个运行上下文,我该如何实现呢?有什么解决方法吗?还是每次我想重新加载数据时都需要重新启动服务器?这似乎是一个简单的用例......:/

【问题讨论】:

  • 我也在寻找这个问题的答案,你成功了吗,@user838681?
  • 当你重新加载 postgres 表时,你是否关心过去的 kafka 事件,或者你只是想从 postgres 的最新重新加载发生的时间开始加入新的 kafka 数据?
  • @HamelKothari 无需更新或重新处理过去的 Kafka 事件。当我更新 SQL 表时,我只想在 Kafka 的任何未来事件中使用它。
  • @ClemensValiente 创建一个简单的对象来包装 rdd 并定期更新它还不够吗?

标签: postgresql apache-spark spark-streaming apache-spark-sql


【解决方案1】:

在我看来,设计上不建议在 DStreams 上转换期间重新加载另一个数据源。

与传统的stateful 流处理模型相比,D-Streams 旨在将流计算构建为一系列statelessdeterministic 在小时间间隔内进行的批处理计算。

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

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

【讨论】:

    猜你喜欢
    • 2014-05-27
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 2018-05-27
    相关资源
    最近更新 更多