在Spark

时间:2015-11-17 03:14:57

标签: apache-spark spark-streaming

我正在做一些像火花流媒体应用中的模式匹配。我想要的是更新像广播变量这样的变量,但是它是可变的。有没有办法做到这一点?有什么建议?

修改

很抱歉没那么清楚。我在日志上做了一些CEP的东西。我需要在spark应用程序运行时从elasticsearch加载规则。我想在工人方面(在每个RDD上)应用这些规则。

1 个答案:

答案 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