Spark Streaming:使可更新的结果集可用于流处理逻辑

时间:2017-02-08 08:50:33

标签: scala spark-streaming

在Spark Streaming应用程序中,有一个外部数据源(关系数据库),我需要每10分钟查询一次,并使结果可用于我的流处理管道。

我不太明白这样做的正确方法是什么。 Accumulators仅附加(如文档中所述),但我发现了这一点:

  /**
   * Set the accumulator's value; only allowed on master
   */
  def setValue(newValue: R) {
    this.value = newValue
  }

Broadcast variables只能写入一次 https://spark.apache.org/docs/1.6.2/programming-guide.html#broadcast-variables

调度方面对我来说也不清楚。

有没有办法让更新的结果集可用于流处理逻辑?

PS 它似乎与我的需求非常相似 How can I update a broadcast variable in spark streaming?

1 个答案:

答案 0 :(得分:0)

我正在使用Java进行保存并且工作正常。这里有类似的答案Updating a global variable periodically in Spark,也有问题提到

public Broadcast<Map<String, List<String>>> updateBroadcastVariable(
  SparkContext sparkContext, DatabaseService databaseService) {
Date d = Calendar.getInstance().getTime();
long diff = d.getTime()-mysqlLastUpdatedAt.getTime();
if (updatedVar == null || diff > 60000) {
  if (var != null)
    updatedVar.unpersist();
  mysqlLastUpdatedAt = new Date(System.currentTimeMillis());
  Map<String, List<String>> map = new LinkedHashMap<>();

    List<String> dbData = databaseService.refreshData(JavaSparkContext.fromSparkContext(sparkContext));
  }
  updatedVar = JavaSparkContext.fromSparkContext(sparkContext).broadcast(dbData);
}
return updatedVar;
}