在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?
答案 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;
}