基于动态配置的Flink SQL处理

时间:2019-10-01 13:49:42

标签: java apache-flink flink-sql

我使用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");
}

StaticConfTableFunction的地方,它在构造函数中加载配置,并根据id值属性evalmyId函数中进行联接:

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分钟一次)

注意:

  • 我使用Flink 1.8.0
  • 在整个用例中,我会根据输入数据的行时间在时间​​窗口内进行处理(不知道是否会影响解决方案)

0 个答案:

没有答案