我正在做一些像火花流媒体应用中的模式匹配。我想要的是更新像广播变量这样的变量,但是它是可变的。有没有办法做到这一点?有什么建议?
修改
很抱歉没那么清楚。我在日志上做了一些CEP的东西。我需要在spark应用程序运行时从elasticsearch加载规则。我想在工人方面(在每个RDD上)应用这些规则。
答案 0 :(得分:2)
这里的想法是在广播变量上写一个包装器,它会定期刷新。 Catch是在允许RDD-RDD操作的变换(或任何其他变体)内调用此函数。
为BroadcastWrapper类截断的代码:
public class BroadcastWrapper {
private Broadcast<ReferenceData> broadcastVar;
private Date lastUpdatedAt = Calendar.getInstance().getTime();
private static BroadcastWrapper obj = new BroadcastWrapper();
private BroadcastWrapper(){}
public static BroadcastWrapper getInstance() {
return obj;
}
public JavaSparkContext getSparkContext(SparkContext sc) {
JavaSparkContext jsc = JavaSparkContext.fromSparkContext(sc);
return jsc;
}
public Broadcast<ReferenceData> updateAndGet(SparkContext sparkContext){
Date currentDate = Calendar.getInstance().getTime();
long diff = currentDate.getTime()-lastUpdatedAt.getTime();
if (var == null || diff > 60000) { //Lets say we want to refresh every 1 min = 60000 ms
if (var != null)
var.unpersist();
lastUpdatedAt = new Date(System.currentTimeMillis());
//Your logic to refresh
ReferenceData data = getRefData();
var = getSparkContext(sparkContext).broadcast(data);
}
return var;
}
}
要使用此方法,我们可以执行类似 - &gt;
的操作objectStream.transform(stream -> {
Broadcast<ReferenceData> refdataBroadcast = BroadcastWrapper.getInstance().updateAndGet(stream.context());
/*Your code here*/
});
请在另一个帖子上查看我的答案,以便更清晰 https://stackoverflow.com/a/41259333/3166245