我使用Flink SQL API处理来自Kafka的数据流。为了处理这些数据,我使用一些在初始化时从HTTP端点加载的配置。
这是我的代码如何工作的示例(此处仅返回与数据ID关联的配置):
// Function that contains the processing part
public void process(StreamTableEnvironment tableEnv, StreamTableDescriptor sourceStream, UpsertStreamTableSink sink){
tableEnv.registerFunction("StaticConf", new StaticConf());
sourceStream.registerTableSource("Input");
tableEnv.registerTableSink("SINK", sink);
Table output = tableEnv.sqlQuery("SELECT * FROM Input, LATERAL TABLE(StaticConf(myId))");
processed.insertInto("SINK");
}
StaticConf
是TableFunction
的地方,它在构造函数中加载配置,并根据id值属性eval
在myId
函数中进行联接:
public class StaticConf extends TableFunction<Row>{
// A Row contains the configuration associated to an ID
List<Row> myConfig;
public GetStaticData(){
String confEndpoint = "http://MyStoredConf:1234"
try (InputStream inputStream = new URL(confEndpoint).openStream()){
myConfig = mapper.readValue(inputStream, TypeFactory.defaultInstance().constructParametricType(ArrayList.class, Row.class));
}catch(Exception e){
System.out.println("Error while loading file from {} : {}", confEndpoint, e.getMessage());
}
}
public void eval(String id){
for(Row r: myConfig){
if(r.getField(0).equals(id)){ // For the example, let's say that the field 0 of the row is the ID
collect(r);
}
}
}
}
使用此解决方案,配置在作业初始化时仅加载一次。因此,它在静态配置下可以很好地工作,但不能处理动态配置。
处理动态配置而不需要在每条消息中重新加载配置的最佳方法是什么? (例如,每X分钟一次)
注意: