如何在火花流中更新广播变量?
2022-09-01 03:53:25
我相信,我有一个相对常见的火花流用例:
我有一个对象流,我想根据一些参考数据进行过滤
最初,我认为使用广播变量实现这将是一件非常简单的事情:
public void startSparkEngine {
Broadcast<ReferenceData> refdataBroadcast
= sparkContext.broadcast(getRefData());
final JavaDStream<MyObject> filteredStream = objectStream.filter(obj -> {
final ReferenceData refData = refdataBroadcast.getValue();
return obj.getField().equals(refData.getField());
}
filteredStream.foreachRDD(rdd -> {
rdd.foreach(obj -> {
// Final processing of filtered objects
});
return null;
});
}
但是,尽管不经常,我的参考数据会定期更改
我的印象是,我可以在驱动程序上修改和重新广播我的变量,它将传播到每个工作线程,但是对象不是并且需要 。Broadcast
Serializable
final
我有什么替代方案?我能想到的三个解决方案是:
将参考数据查找移动到 一个或中,使其完全驻留在工作线程上。但是,参考数据存在于REST API中,因此我还需要以某种方式存储计时器/计数器,以阻止对流中的每个元素访问远程数据。
forEachPartition
forEachRdd
每次引用数据更改时,使用新的广播变量重新启动 Spark 上下文。
将参考数据转换为RDD,然后以我现在流式传输的方式流式传输,尽管这将随每个对象一起提供参考数据。
join
Pair<MyObject, RefData>