tôi đã làm việc này bằng cách tạo ra một lớp wrapper qua biến phát sóng. Phương thức updateAndGet của lớp wrapper trả về biến phát sóng được làm mới. Tôi gọi chức năng này bên dStream.transform -> theo Documentation Spark
http://spark.apache.org/docs/latest/streaming-programming-guide.html#transform-operation
Chuyển Operation trạng thái:. "chức năng cung cấp được gọi trong mỗi khoảng thời gian hàng loạt này cho phép bạn làm tốn nhiều thời gian các hoạt động RDD khác nhau, đó là các hoạt động RDD, số phân vùng, các biến phát sóng, v.v.có thể thay đổi giữa các lô "
lớp BroadcastWrapper sẽ trông giống như:.
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;
}
}
Bạn có thể sử dụng chức năng phát sóng updateAndGet biến trong phương pháp stream.transform cho phép RDD-RDD biến đổi
objectStream.transform(stream -> {
Broadcast<Object> var = BroadcastWrapper.getInstance().updateAndGet(stream.context());
/**Your code to manipulate stream **/
});
Tham khảo câu trả lời đầy đủ của tôi từ vị trí này: https://stackoverflow.com/a/41259333/3166245
Ho pe nó giúp
Vì vậy, làm cách nào để bạn có thể đoán được rằng mình có thể đọc biến phát sóng từ đoạn mã đó? Nó đánh bại mục đích của nó để trả lại 'Đơn vị'. – kareblak