Apache flink 动态调用Flink操作符

Apache flink 动态调用Flink操作符,apache-flink,flink-streaming,stream-processing,Apache Flink,Flink Streaming,Stream Processing,我最近开始学习流处理,正在ApacheFlink上尝试。我正在尝试编写一个作业,从Kafka主题读取事件,可能执行一些无状态链式转换,并对另一个应用程序进行REST调用以发布每个转换的事件。例如,我的主要方法可以如下所示- public class KafkaSourceToRestSinkJob { public static void main(String[] args) { String configPath = args[0]; //Read c

我最近开始学习流处理,正在ApacheFlink上尝试。我正在尝试编写一个作业,从Kafka主题读取事件,可能执行一些无状态链式转换,并对另一个应用程序进行REST调用以发布每个转换的事件。例如,我的主要方法可以如下所示-

public class KafkaSourceToRestSinkJob {
    public static void main(String[] args) {
        String configPath = args[0];
        //Read configuration for the job (like kafka properties, rest uri for sink, possibly operators to invoke)
        ...
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        DataStream<String> dataStream = env.addSource(new FlinkKafkaConsumer<>(topic, new SimpleStringSchema(), kafkaProps));
        dataStream.addSink(new RestSinkFunction<>()); //Custom sink function implementing org.apache.flink.streaming.api.functions.sink.SinkFunction
        //Chain some operators depending on some parameters in the config file
        ...
        env.execute("Confused Job");
    }
}
公共类KafkaSourceToRestSinkJob{
公共静态void main(字符串[]args){
字符串configPath=args[0];
//读取作业的配置(如kafka属性、接收器的rest uri、可能要调用的运算符)
...
StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
DataStream DataStream=env.addSource(新的FlinkKafkaConsumer(主题,新的SimpleStringSchema(),kafkaProps));
dataStream.addSink(new restskinkfunction());//实现org.apache.flink.streaming.api.functions.sink.function的自定义sink函数
//根据配置文件中的某些参数链接某些运算符
...
环境执行(“混乱作业”);
}
}
我的目标是为具有相同类型源和接收器的多个作业提供一个公共jar工件。如果我需要一个作业来执行转换a、B和C(实现将出现在jar中),我可以在配置文件中指定它们,并在程序args中传递文件的路径

下面是我的问题-

  • 是否可以动态调用运算符
  • 我知道在接收器中进行REST调用可能会导致一些不必要的延迟,但在我的应用程序中,这是可以忍受的。我也不在乎回应。记住这一点,我是否有理由避免使用休息水槽
  • 总的来说,我是不是大错特错了

  • 谢谢大家!

    您不能动态修改作业图的拓扑,但可以实现一个flatmap操作符,动态加载一个类(在配置中指定),然后使用它转换事件流


    至于其余的sink,如果您需要保证端到端的一次语义,那么您需要小心地将sink与Flink的检查点相匹配。FlinkKafkaConsumer通过倒带和重放自上一个检查点以来的事件来处理恢复。如果不小心,这将导致在恢复期间重复的结果被推送到REST接收器。如果REST接收器仅在外部系统上执行幂等更新,则这是可以的,但否则需要使REST接收器具有状态和事务性

    我可能会看看Flink SQL。您可以定义公共源/汇,然后只传递一个


    我在过去使用Spark SQL时也有类似的设置,它运行得相当好。您不需要发明自己的规范语言,而且更容易理解。

    您确定这是最好的解决方案吗??从长远来看,这似乎有点难以维持。