【问题标题】:Updating a global variable periodically in Spark在 Spark 中定期更新全局变量
【发布时间】:2016-02-18 07:51:41
【问题描述】:

我在 spark 流应用中做类似模式匹配的事情。我想要的是更新像 broadcast variable 这样的变量,但是它是可变的。有没有办法做到这一点?有什么建议吗?

编辑

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

【问题讨论】:

  • 你是指驱动级别的全局状态还是工作级别的局部变量?
  • 您能否添加一些示例代码来帮助澄清您的问题?
  • @axlpado 感谢您的回复。我的意思是工人级别的变量。
  • @maasg 抱歉不清楚。我已经更新了我的问题。谢谢。
  • 从驱动程序发送给工作人员(包括广播)的所有内容都在那里序列化一次并且是只读的,没有交叉执行程序更新。 worker 请求动态状态的方式是 Spark 管理系统外部的一种方式 - JDBC,或 Tachyon 等共享文件系统。

标签: apache-spark spark-streaming


【解决方案1】:

这里的想法是为定期刷新的广播变量编写一个包装器。 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;
 }
}

要使用此方法,我们可以执行以下操作 ->

objectStream.transform(stream -> {
    Broadcast<ReferenceData> refdataBroadcast = BroadcastWrapper.getInstance().updateAndGet(stream.context());

 /*Your code here*/

});

请在另一个线程上查看我的答案以获得更好的清晰度 https://stackoverflow.com/a/41259333/3166245

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • 新回答问题.. 编辑帖子。谢谢@rajeshujade
猜你喜欢
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
相关资源
最近更新 更多