Apache flink 动态调用Flink操作符
我最近开始学习流处理,正在ApacheFlink上尝试。我正在尝试编写一个作业,从Kafka主题读取事件,可能执行一些无状态链式转换,并对另一个应用程序进行REST调用以发布每个转换的事件。例如,我的主要方法可以如下所示-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
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中传递文件的路径
下面是我的问题-
谢谢大家! 您不能动态修改作业图的拓扑,但可以实现一个flatmap操作符,动态加载一个类(在配置中指定),然后使用它转换事件流
至于其余的sink,如果您需要保证端到端的一次语义,那么您需要小心地将sink与Flink的检查点相匹配。FlinkKafkaConsumer通过倒带和重放自上一个检查点以来的事件来处理恢复。如果不小心,这将导致在恢复期间重复的结果被推送到REST接收器。如果REST接收器仅在外部系统上执行幂等更新,则这是可以的,但否则需要使REST接收器具有状态和事务性 我可能会看看Flink SQL。您可以定义公共源/汇,然后只传递一个
我在过去使用Spark SQL时也有类似的设置,它运行得相当好。您不需要发明自己的规范语言,而且更容易理解。您确定这是最好的解决方案吗??从长远来看,这似乎有点难以维持。